2011-08-25 20 views
48

Sto giocando con qualche codice asm, e qualcosa mi dà fastidio.Come si compila l'asm generato da GCC?

compilo questo:

#include <stdio.h> 

int main(int argc, char** argv){ 
    printf("Hello World\n"); 
    return 0; 
} 

con gcc file.c -S -o file.S questo genera un bel pezzo di codice asm:

.cstring 
LC0: 
    .ascii "Hello World\0" 
    .text 
.globl _main 
_main: 
LFB3: 
    pushq %rbp 
LCFI0: 
    movq %rsp, %rbp 
LCFI1: 
    subq $16, %rsp 
LCFI2: 
    movl %edi, -4(%rbp) 
    movq %rsi, -16(%rbp) 
    leaq LC0(%rip), %rdi 
    call _puts 
    movl $0, %eax 
    leave 
    ret 
LFE3: 
    .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support 
EH_frame1: 
    .set L$set$0,LECIE1-LSCIE1 
    .long L$set$0 
LSCIE1: 
    .long 0x0 
    .byte 0x1 
    .ascii "zR\0" 
    .byte 0x1 
    .byte 0x78 
    .byte 0x10 
    .byte 0x1 
    .byte 0x10 
    .byte 0xc 
    .byte 0x7 
    .byte 0x8 
    .byte 0x90 
    .byte 0x1 
    .align 3 
LECIE1: 
.globl _main.eh 
_main.eh: 
LSFDE1: 
    .set L$set$1,LEFDE1-LASFDE1 
    .long L$set$1 
LASFDE1: 
    .long LASFDE1-EH_frame1 
    .quad LFB3-. 
    .set L$set$2,LFE3-LFB3 
    .quad L$set$2 
    .byte 0x0 
    .byte 0x4 
    .set L$set$3,LCFI0-LFB3 
    .long L$set$3 
    .byte 0xe 
    .byte 0x10 
    .byte 0x86 
    .byte 0x2 
    .byte 0x4 
    .set L$set$4,LCFI1-LCFI0 
    .long L$set$4 
    .byte 0xd 
    .byte 0x6 
    .align 3 
LEFDE1: 
    .subsections_via_symbols 

Il mio prossimo problema è in realtà, come faccio a compilare questa uscita, e posso far fare a GCC questo per me?

risposta

61

Sì, puoi usare gcc per compilare il tuo codice asm. Utilizzare -c per la compilazione in questo modo:

gcc -c file.S -o file.o 

Questo darà file di codice oggetto denominato file.o. Per richiamare linker eseguire seguente dopo il comando di cui sopra:

gcc file.o -o file 
+9

si può anche semplicemente usare 'gcc -o file.S file' –

+0

che dire "> come -o hello.o hello.s"? come indicato da https://www3.ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html. Sembra che l'ordine di processo viene pre-elaborazione (* .i-file), la compilazione (*. S-file), montaggio (*. O-file) e il collegamento (* .exe file). – user1677716

3

Sì, gcc può anche compilare il codice sorgente dell'assembly. In alternativa, puoi invocare as, che è l'assemblatore. (Gcc è solo un programma "driver" che utilizza l'euristica per chiamare compilatore C, C++, assemblatore, linker, ecc ..)

+1

Come faccio a capire come gcc avrebbe usato come? –

+0

Inoltre, ho Intels icc sdraiato vicino, quale assemblatore usano? –

+4

@Martin, chiedi a 'gcc -v' di narrare le sue azioni. –

7

è possibile incorporare il codice assembly in un normale programma C. Ecco un buon introduction. Utilizzando la sintassi appropriata, si può anche dire GCC si desidera interagire con le variabili dichiarate in C. Il programma di seguito istruisce gcc che:

  • EAX sarà foo
  • EBX deve essere bar
  • il valore in eax deve essere conservato in foo dopo che il codice assembly eseguito

\ n

int main(void) 
{ 
     int foo = 10, bar = 15; 
     __asm__ __volatile__("addl %%ebx,%%eax" 
          :"=a"(foo) 
          :"a"(foo), "b"(bar) 
          ); 
     printf("foo+bar=%d\n", foo); 
     return 0; 
} 
37

gcc può utilizzare un file assembly come input e richiamare l'assembler secondo necessità. C'è una sottigliezza, però:

  • Se il nome del file termina con ".s" ('s' minuscola), quindi gcc chiama l'assembler.
  • Se il nome del file termina con ".S" (maiuscolo 'S'), poi gcc applica il preprocessore C sul file sorgente (cioè riconosce le direttive quali #if e sostituisce le macro), e poi chiama l'assemblatore su il risultato.

Così, in via generale, si vuole fare le cose in questo modo:

gcc -S file.c -o file.s 
gcc -c file.s 
+0

Questo appare come il suo funzionamento ma ottengo un messaggio di errore: 'file di Mach-o malformata' –

+0

Io penso che si debba utilizzare il prefisso '.S' (maiuscolo) altrimenti gcc rileva un altro tipo di file (venuto a mancare con' .asm' per esempio) –

0
nasm -f bin -o 2_hello 2_hello.asm 
+2

Questa è una risposta piuttosto breve. Potresti aggiungere qualche spiegazione, per favore? Forse puoi dirci cosa fanno i parametri e cosa fai in modo diverso rispetto alle altre risposte. – GameDroids

Problemi correlati