0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 08 sub $0x8,%esp
6: 83 e4 f0 and $0xfffffff0,%esp
9: b8 00 00 00 00 mov $0x0,%eax
e: 29 c4 sub %eax,%esp
10: 83 ec 0c sub $0xc,%esp
13: 6a 10 push $0x10
15: e8 fc ff ff ff call 16
1a: 83 c4 10 add $0x10,%esp
1d: 89 45 fc mov %eax,0xfffffffc(%ebp)
20: a1 00 00 00 00 mov 0x0,%eax
25: a3 00 00 00 00 mov %eax,0x0
2a: a3 04 00 00 00 mov %eax,0x4
2f: 83 ec 08 sub $0x8,%esp
32: 8d 45 fc lea 0xfffffffc(%ebp),%eax
35: 50 push %eax
36: 68 05 00 00 00 push $0x5 //对应.LC1
3b: e8 fc ff ff ff call 3c
//为什么一样的二进制代码和下一个printf调用翻译出来的汇编不一样???见4e地址处
//用objdump -r 查看了一下,发现printf是需要重定位的,但是应该重定向到同一位置
//为什么会出现地址不一样的情况,请高手解答
40: 83 c4 10 add $0x10,%esp
43: 83 ec 08 sub $0x8,%esp
46: ff 75 fc pushl 0xfffffffc(%ebp)
49: 68 1a 00 00 00 push $0x1a //对应.LC2,和LC1相差21byte
4e: e8 fc ff ff ff call 4f
53: 83 c4 10 add $0x10,%esp
56: c9 leave
57: c3 ret
*/
从中学习到了 static 声明的变量,不管它是全局变量也好,还是在函数之中的也好,只要是没有赋初值
都存放在.bss段,如果赋了初值,则把它放在.data段。
反汇编的方法, 首先
gcc -o test.o -c test.c
得到test.o文件,然后,objdump -d test.o 即可。
|