1.汇编截图
2.使用gdb跟踪汇编代码
-
使用gdb week1306指令打开gdb调试器
-
使用break main指令在main函数处设置断点,再用r指令运行代码
-
用disassemble指令获取汇编代码
-
用i r指令查看各寄存器的值
<__x86.get_pc_thunk.ax>的作用就是把esp的内容赋值给eax。
简单来说call 0x11c5 <__x86.get_pc_thunk.ax>的意义就是为了获取下一条指令的地址。
此时还没有调用函数,esp栈中元素为0
-
push $0x8分配4字节的栈空间,esp减4
-
call调用f,esp的值为8
-
执行f函数,f初始化帧指针,将上一个函数的基址入栈,将当前%esp作为新基址
-
分配栈空间,为传参做准备
-
将%esp中的8存入栈中
-
call调用g
-
执行g函数,g初始化栈指针
-
分配栈空间
-
将%esp中的8存入栈中
-
将 %eax 与立即数 3 相加
-
pop %ebp在g结束前弹栈
-
ret返回g中call的调用位置,结束g函数
-
将 %esp 与立即数 4 相加
-
leave返回准备栈
-
ret返回f中call的调用位置,结束f函数
-
将 %eax 与立即数1相加
-
leave返回准备栈
-
ret结束main函数