PDA

Visualizza la versione completa : [C/ASM] Utilizzo stringhe C in istruzioni ASM


monkeyadventure
17-01-2006, 13:51
Perchè non funziona?


#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 :bhò: .

oregon
17-01-2006, 14:33
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 ...

Samuele_70
17-01-2006, 14:35
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).

monkeyadventure
17-01-2006, 14:48
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?

oregon
18-01-2006, 00:01
Hai letto il mio messaggio ?

monkeyadventure
18-01-2006, 13:04
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.

DYNAM!C+
19-01-2006, 22:33
stampa("Hello world\n$");


nota il dollaro finale
deve essere una DOS string (non c string)

monkeyadventure
20-01-2006, 17:34
Ragazzi, ho risolto!


#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 :yuppi:. Al prossimo grattacapo :ciauz:

Loading