1. 程式人生 > >gcc檢視彙編程式碼

gcc檢視彙編程式碼

1.gcc編譯C語言程式

#include <stdio.h>
intmain()
{
printf(“helloworld\n”);
return0;
}
把上面的程式存為hello.c,然後用gcchello.c -o hello,然後./hello,即可看到執行結果

2.使用gcc檢視彙編程式碼

先寫一個C程式,內容為:

#include <stdio.h>
intsum(int x,int y)

{
intt=x+y;
returnt;
}
使用gcc-S sum.c,會產生sum.s的檔案,使用catsum.s開啟檔案,就可以看到彙編程式碼

sum:

pushl %ebp

movl %esp,%ebp

subl $16,%esp

movl 12(%ebp),%eax

movl 8(%ebp),%edx

addl %edx,%eax

movl %eax,-4(%ebp)

movl -4(%ebp),%eax

leave

ret

3使用gcc生成目的碼檔案,gcc -c sum.c,在當前目錄下會產生sum.o的二進位制程式碼,如果要開啟這個檔案,可以使用反彙編器,objdump-d sum.o,輸出結果為:

00000000<sum>:

0: 55 push %ebp

1: 89e5 mov %esp,%ebp

3: 83ec 10 sub $0x10,%esp

6: 8b45 0c mov 0xc(%ebp),%eax

9: 8b55 08 mov 0x8(%ebp),%edx

c: 01d0 add %edx,%eax

e: 8945 fc mov %eax,-0x4(%ebp)

11: 8b45 fc mov -0x4(%ebp),%eax

14: c9 leave

15: c3 ret

這裡產生了22個順序排列的十六進位制位元組值,左側為機器執行程式碼,右邊為等價的組合語言。

4.生成可執行檔案的方法

main()函式,

intmain()

{

return sum(1,2);

}

然後執行命令 gcc -o obj sum.o main.c

使用命令objdump-d obj,輸出為:

080483dc<sum>:

80483dc: 55 push %ebp

80483dd: 89e5 mov %esp,%ebp

80483df: 83ec 10 sub $0x10,%esp

80483e2: 8b45 0c mov 0xc(%ebp),%eax

80483e5: 8b55 08 mov 0x8(%ebp),%edx

80483e8: 01d0 add %edx,%eax

80483ea: 8945 fc mov %eax,-0x4(%ebp)

80483ed: 8b45 fc mov -0x4(%ebp),%eax

80483f0: c9 leave

80483f1: c3 ret

產生的目標檔案彙編程式碼依然佔用22個位元組,但偏移地址與gcc-S sum.c的不同。