2013-08-10 17 views
6

non posso compilare questo programma tratto da un tutorial. Dovrebbe stampare "Hello World".Come compilare questo programma con in linea asm?

void main() 
{ 
    __asm__("jmp forward\n\t" 
"backward:\n\t" 
      "popl %esi\n\t" 
      "movl $4, %eax\n\t" 
      "movl $2, %ebx\n\t" 
      "movl %esi, %ecx\n\t" 
      "movl $12, %edx\n\t" 
      "int $0x80\n\t" 
      "int3\n\t" 
"forward:\n\t" 
      "call backward\n\t" 
      ".string \"Hello World\\n\"" 
      ); 
} 

gcc 4.7 sotto Linux mi dà il seguente errore:

gcc hello.c -o hello 
hello.c: Assembler messages: 
hello.c:5: Error: invalid instruction suffix for `pop' 

C'è anche un modo per evitare di specificare le virgolette doppie per ogni linea?

Inoltre, mi piacerebbe sapere come modificare il programma per utilizzare libc chiamata printf anziché il servizio kernel.

+0

bene dovrebbe essere 'int main' per uno, ASM è piuttosto dipende dal sistema in modo che possa definitivamente bloccarsi a seconda di quale computer utilizzando il vostro – aaronman

+2

Sembra che si sta compilando x86-32 codice per l'output un binario x86-64. – Nayuki

+1

Si potrebbe togliere le 'l's e cambiare'% e * 'a'% r * ', che ottiene da qualche parte. Non fidarti della mia opinione su di esso, comunque. – Ryan

risposta

9

Q:

hello.c: Assembler messages: 
hello.c:5: Error: invalid instruction suffix for `pop' 

A: popl è accessibile x86-32 ma non su x86-64 (ha popq invece). È necessario adattare il codice assembly per lavorare su x86-64 oppure è necessario richiamare GCC per generare l'output binario x86-32.

Supponendo che si desidera generare x86-32, utilizzare l'opzione della riga di comando -m32.

Q:

Is there also a way to avoid to specify double quotes for each line?

A: Nope. Questo perché __asm__() è una pseudo-funzione che prende argomenti stringa, quindi la stringa segue la sintassi C. Il contenuto della stringa viene passato all'assemblatore con poca o nessuna elaborazione.

Si noti che in C, quando le stringhe sono giustapposti, sono concatenati. Ad esempio, "a" "b" corrisponde a "ab".

Si noti che nella sintassi del linguaggio assembly (GAS), è possibile separare le istruzioni da newline o da un punto e virgola, ad esempio: "movl xxx; call yyy" o "movl xxx \n call yyy".

Q:

how to modify the program to use libc call printf

A: Seguire la calling convention for C on x86. Spingere gli argomenti da destra a sinistra, chiamare la funzione, quindi pulire lo stack. Esempio:

pushl $5678 /* Second number */ 
pushl $1234 /* First number */ 
pushl $fmtstr 
call printf 
addl $12, %esp /* Pop 3 arguments of 4 bytes each */ 

/* Put this away from the code */ 
fmtstr: .string "Hello %d %d\n" /* The \n needs to be double-backslashed in C */ 
+0

Primo tasso ..... – Homer6

Problemi correlati