Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C/ASM] Utilizzo stringhe C in istruzioni ASM

    Perchè non funziona?
    codice:
    #include<stdio.h>
    #pragma inline
    
    void stampa(unsigned char[]);
    
    void main(void){
    
         printf("Vediamo un po'se funziona..\n");
         stampa("Hello world\n");
         asm xor ax,ax;   //attendi un tasto
         asm int 0x16;
    }
    
    void stampa(unsigned char stringa[])
    {
         asm mov ax,SEG stringa;
         asm mov ds,ax;
         asm mov dx,OFFSET stringa;
         asm mov ah,0x09; //funzione per stampare stringhe
         asm int 0x21; 
    }
    Ho provato anche a passare la stringa come puntatore a char invece che come array di char, ma non funziona ugualmente .

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Prima di tutto la funzione stampa deve essere dichiarata con

    void stampa(char *);

    ma, cosa piu' importante, non ho capito se stai lavorando in Windows (Win32) ... se e' cosi' il programma assembler a 16 bit con le chiamate interrupt DOS non potra' mai funzionare ...

  3. #3
    Credo proprio che non si possano effettuare chiamate esplicite
    agli interrupt di sistema, in ambienti windows intendo.
    Quel codice potrebbe funzionare in ambiente DOS (Dos 'reale'
    non emulato come quello di windows).
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  4. #4
    No, non credo che il problema siano le chiamate al sistema, perchè per esempio io ho sempre utilizzato Turbo assembler e programmato in asm anche sotto windows xp e nei sorgenti di chiamate ne mettevo molte. Il sorgente sopra l'ho compilato con turbo c/c++ versione 4.0 mi sembra. Non è che magari la stringa va gestita in modo diverso?

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Hai letto il mio messaggio ?

  6. #6
    Sto lavorando con una versione per dos di Turbo C/C++, su WinXP..
    Ma secondo me le stringhe vanno passate alla funzione assembler in maniera diversa, perchè effettivamente eseguendola svolge il suo compito(stampare stringhe), ma al posto di "hello world" mi stampa una lunga serie di caratteri a caso, dopodichè il programma si bloccasi blocca.

  7. #7
    stampa("Hello world\n$");


    nota il dollaro finale
    deve essere una DOS string (non c string)
    DYNAMIC+ [ E-mail ]

    Secondo me non si può fare!

  8. #8
    Ragazzi, ho risolto!
    codice:
    #include<stdio.h>
    #pragma inline
    
    void stampa(char *);
    
    void main(void){
    
         printf("Vediamo un po'se funziona..\n");
         stampa("Hello world\r\n$");
         asm xor ax,ax; //attendi un tasto
         asm int 0x16;
    }
    
    void stampa(char *stringa)
    {
    //   asm mov ax,SEG stringa;    Questa riga
    //   asm mov ds,ax;             e questa non servono!
         asm mov dx,OFFSET stringa;
         asm mov ah,0x09;
         asm int 0x21;
    }
    Erano le righe dedicate al Segment della stringa che non servivano perchè probabilmente il mio compilatore utilizza di default un modello di memoria in cui Data segment e Code segment sono lo stesso, dovrei studiamrmi meglio quella roba :rollo:. In effetti poi serviva anche il $, me l'ero dimenticato, grazie DYNAM!C+, e la stringa andava passata come puntatore a char e non come array di char, grazie oregon. Bene, ora potrò riprendere a dormire felice . Al prossimo grattacapo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.