Perché questo codice non imposta temp
a 1? Come faccio a farlo?
int temp; __asm__( ".intel_syntax;" "mov %0, eax;" "mov eax, %1;" ".att_syntax;" : : "r"(1), "r"(temp) : "eax"); printf("%d\n", temp);
Vuoi che il temp
sia un risultato, non un input, penso. Provare:
__asm__( ".intel_syntax;" "mov eax, %1;" "mov %0, eax;" ".att_syntax;" : "=r"(temp) : "r"(1) : "eax");
Questo codice fa ciò che stai cercando di ottenere. Spero che questo ti aiuta:
#include int main(void) { /* Compile with C99 */ int temp=0; asm ( ".intel_syntax;" "mov %0, 1;" ".att_syntax;" : "=r"(temp) : /* no input*/ ); printf("temp=%d\n", temp); }
Devi passare un argomento all’assembler GCC.
gcc.exe -masm=intel -c Main.c gcc.exe Main.o -oMain.exe
E tu hai il codice C come questo:
#include #include int myVar = 0; int main(int argc, char *argv[]) { asm("mov eax, dword ptr fs:[0x18]"); asm("mov eax, dword ptr ds:[eax+0x30]"); asm("movzx eax, byte ptr ds:[eax+0x2]"); asm("mov _myVar, eax"); if(myVar == 1) printf("This program has been debugged.\r\n"); printf("Welcome.\r\n"); getch(); return 0; }
Non dimenticare di aggiungere il prefisso underscore (_) per ogni variabile nella parola chiave asm (), altrimenti non lo riconoscerà.
E keyword asm () usa il prefisso ‘0x’ per ogni intero esadecimale, non il suffisso ‘h’.