我们另外看一个简单的C程序 code/add.c:
int add(int a, int b) {
int result;
result = a + b;
return result;
}
int main(int argc, char *argv[]) {
int a,b,result;
a = 1;
b = 2;
result = add(a,b);
return 0;
}
gcc编译得到汇编文件:
gcc -S add.c -o add.s
可以查看一下该汇编文件的内容:
cat add.s
gcc编译链接得到目标文件:
gcc -g -Wall add.c -o add
利用gdb查看反汇编代码:
gdb -q add
得到:
heamon7@ubuntu:~/Project/test$ gdb -q add
Reading symbols from add...done.
(gdb) l 1,20
1 int add(int a, int b) {
2 int result;
3
4 result = a + b;
5
6 return result;
7 }
8
9 int main(int argc, char *argv[]) {
10 int a,b,result;
11
12 a = 1;
13 b = 2;
14 result = add(a,b);
15
16 return 0;
17 }
(gdb) disass add
Dump of assembler code for function add:
0x00000000004004ed <+0>: push %rbp
0x00000000004004ee <+1>: mov %rsp,%rbp
0x00000000004004f1 <+4>: mov %edi,-0x14(%rbp)
0x00000000004004f4 <+7>: mov %esi,-0x18(%rbp)
0x00000000004004f7 <+10>: mov -0x18(%rbp),%eax
0x00000000004004fa <+13>: mov -0x14(%rbp),%edx
0x00000000004004fd <+16>: add %edx,%eax
0x00000000004004ff <+18>: mov %eax,-0x4(%rbp)
0x0000000000400502 <+21>: mov -0x4(%rbp),%eax
0x0000000000400505 <+24>: pop %rbp
0x0000000000400506 <+25>: retq
End of assembler dump.
(gdb) disass main
Dump of assembler code for function main:
0x0000000000400507 <+0>: push %rbp
0x0000000000400508 <+1>: mov %rsp,%rbp
0x000000000040050b <+4>: sub $0x20,%rsp
0x000000000040050f <+8>: mov %edi,-0x14(%rbp)
0x0000000000400512 <+11>: mov %rsi,-0x20(%rbp)
0x0000000000400516 <+15>: movl $0x1,-0xc(%rbp)
0x000000000040051d <+22>: movl $0x2,-0x8(%rbp)
0x0000000000400524 <+29>: mov -0x8(%rbp),%edx
0x0000000000400527 <+32>: mov -0xc(%rbp),%eax
0x000000000040052a <+35>: mov %edx,%esi
0x000000000040052c <+37>: mov %eax,%edi
0x000000000040052e <+39>: callq 0x4004ed <add>
0x0000000000400533 <+44>: mov %eax,-0x4(%rbp)
0x0000000000400536 <+47>: mov $0x0,%eax
0x000000000040053b <+52>: leaveq
0x000000000040053c <+53>: retq
End of assembler dump.
(gdb)