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的不同。