PDA

View Full Version : [assembly] __asm (non funziona con GCC)


Rank-1
21-01-2008, 01:34
Ciao a tutti.. siccome ho problemi con il compilatore GCC qualcuno per favore può convertirmi questo codice? ho visto che usa un'altra sintassi (AT&T?!) ma io non saprei proprio come cambiarlo xkè non conosco l'assembly.

__asm {
mov eax, addr
call addr
mov addr, eax
}

__asm {
mov eax, addr
push cbSize
push pInputs
push nInputs
call addr
mov addr, eax
}

grazie

cdimauro
21-01-2008, 07:58
Sintassi AT&T? Vade retro!

Usa NASM, che ti permette di usare quella "tradizionale" (Intel / MASM / TASM et similia). ;)

cionci
21-01-2008, 09:17
Usa NASM, che ti permette di usare quella "tradizionale" (Intel / MASM / TASM et similia). ;)
Ma non nel codice inline...
Comunque dovrebbe essere così, se mi ricordo bene.

__asm {
movl addr, %eax
call addr
movl %eax, addr
}

__asm {
movl addr, %eax
pushl cbSize
pushl pInputs
pushl nInputs
call addr
movl %eax, addr
}

variabilepippo
21-01-2008, 09:52
qualcuno per favore può convertirmi questo codice?


Perché non lo chiedi direttamente al compilatore? Aggiungi l'opzione -masm=intel alla linea di comando di GCC:

gcc pippo.c -masm=intel


// pippo.c
#include <stdio.h>
#include <string.h>

int main (void)
{

__asm (
"xor eax, eax\n"
"mov ecx, 3\n"
);
return 0;
}

cionci
21-01-2008, 09:56
Perché non lo chiedi direttamente al compilatore? Aggiungi l'opzione -masm=intel alla linea di comando di GCC:

Azz...non lo sapevo :D

variabilepippo
21-01-2008, 09:58
Azz...non lo sapevo


Abbiamo sempre qualcosa di nuovo da imparare, ed il forum serve anche per questo... ;)

ilsensine
21-01-2008, 10:13
Perché non lo chiedi direttamente al compilatore? Aggiungi l'opzione -masm=intel alla linea di comando di GCC:

Perché non è la fine della storia.
Da lì puoi accedere solo a variabili globali; le variabili locali devono essere passare come "input" secondo l'usuale sintassi asm/gcc.
Inoltre occorre specificare l'elenco dei registri "clobbered", se presenti.

ilsensine
21-01-2008, 10:15
C'è anche questo modo, che non richiede -masm=intel:

asm(
" .intel_syntax noprefix \n"
<blocco asm...>
" .att_syntax \n"
<blocco in/out e clobbered>
);