簡體   English   中英

如何編譯GCC生成的asm?

[英]How do I compile the asm generated by GCC?

我正在玩一些asm代碼,有些事情困擾着我。

我編譯這個:

#include <stdio.h>

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

使用gcc file.c -S -o file.S這會生成一小段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

我的下一個問題是,如何編譯此輸出,我可以讓GCC為我做嗎?

是的,您可以使用gcc編譯您的asm代碼。 使用-c進行編譯,如下所示:

gcc -c file.S -o file.o

這將給出名為file.o的目標代碼文件。 要調用鏈接器,請執行以下命令:

gcc file.o -o file

gcc可以使用匯編文件作為輸入,並根據需要調用匯編程序。 但有一個微妙之處:

  • 如果文件名以“ .s ”(小寫's')結尾,則gcc調用匯編程序。
  • 如果文件名以“ .S ”(大寫“S”)結尾,則gcc在源文件上應用C預處理器(即它識別諸如#if指令並替換宏), 然后在結果上調用匯編程序。

所以,總的來說,你想做這樣的事情:

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

您可以將匯編代碼嵌入到普通的C程序中。 這是一個很好的介紹 使用適當的語法,您還可以告訴GCC您想要與C中聲明的變量進行交互。下面的程序指示gcc:

  • eax應該是foo
  • ebx應該是吧
  • 執行匯編代碼后,eax中的值應存儲在foo中

\\ 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;
}

是的,gcc還可以編譯匯編源代碼。 或者,您可以調用as ,這是匯編程序。 (gcc只是一個“驅動程序”程序,它使用啟發式方法來調用C編譯器,C ++編譯器,匯編器,鏈接器等。)

你可以使用GAS,這是gcc的后端匯編程序:

http://linux.die.net/man/1/as

如果你有main.s文件。 您可以通過生成目標文件GCC ,也as

# gcc -c main.s
# as main.s -o main.o

查看此鏈接,它將幫助您了解GCC的一些binutils http://www.thegeekstuff.com/2017/01/gnu-binutils-commands/

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM