Come faccio a compilare l’asm generato da GCC?

Sto giocando con un po ‘ di asm codice, e qualcosa mi da fastidio.

Compilare 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 po ‘ di 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 problema è: come faccio a compilare questa uscita, e posso fare GCC farlo per me?



7 Replies
  1. 77

    Sì, È possibile utilizzare gcc per compilare il codice asm. Utilizzare-c per la compilazione come questo:

    gcc -c file.S -o file.o

    Questo darà il codice oggetto nome file.o.
    Per richiamare linker eseguire le seguenti operazioni dopo il comando di cui sopra:

    gcc file.o -o file
    • si può anche usare gcc file.S -o file
    • che cosa circa “>- o ciao.o ciao.s” ? come indicato da www3.ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html. Sembra la fine del processo di pre-elaborazione (.i-file), compilare(.s-file), assemblaggio(.o file) e il collegamento (.file exe).
  2. 45

    gcc possibile utilizzare un file di assieme come input, e di richiamare l’assembler come necessario. C’è una sottigliezza, però:

    • Se il nome del file termina con “.s” (minuscolo ‘s’), poi gcc chiama l’assembler.
    • Se il nome del file termina con “.S” (maiuscole ‘S’), poi gcc si applica il preprocessore C nel file di origine (cioè si riconosce direttive come #if e sostituisce le macro), e poi chiama l’assembler sul risultato.

    Così, in generale, si vuole fare cose come questa:

    gcc -S file.c -o file.s
    gcc -c file.s
    • Questo appare come il suo lavoro, ma ho un messaggio di errore: “formato non valido Mach-o file’
    • Penso che devi utilizzare la .S prefisso (maiuscolo) altrimenti gcc rileva un altro tipo di file (non riuscita con .asm per esempio)
  3. 10

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

    • eax sarà pippo
    • ebx sono bar
    • il valore di eax devono essere conservati in pippo dopo l’assemblea di codice 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;
    }
  4. 4

    Sì, gcc anche possibile compilare il codice sorgente di assembly. In alternativa, è possibile richiamare as, che è l’assembler. (gcc è solo un “driver”, il programma che usa l’euristica per chiamare il compilatore C, C++, assembler, linker, ecc..)

    • Come faccio a capire come gcc avrebbe usato come ?
    • Inoltre, ho Intels icc sdraiato vicino, cosa assemblatore usano?
    • chiedi gcc -v per raccontare le sue azioni.
  5. 0
    nasm -f bin -o 2_hello 2_hello.asm
    • Questa è una breve risposta. Si potrebbe aggiungere qualche spiegazione, per favore? Forse si può dire di noi quello che i parametri di fare e ciò che si fa in modo diverso rispetto alle altre risposte.

Lascia un commento