[英]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:
\\ 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的后端匯編程序:
如果你有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.