·代码(实验楼中的代码,改了部分数值)命名为test.c
int g(int x)
{
return x + 7;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(3) + 5;
}
·在64位的机器上产生32位汇编(使用指令为:gcc - g test.c -o test -m32),然后使用gdb test指令进入gdb调试器,进入后在main这里设置一个断点,然后运行:
·
·使用指令:disassemble获取汇编代码,指令:info registers查看各寄存器的值:
此时主函数的基址为Ox80483d8
·使用指令:display /i $pc,这样在每次执行下一条汇编语句时,都会显示出当前执行的语句
·call指令将下一条指令的地址入栈:
·将上一个函数的基址入栈,从当前%esp开始作为新基址:
·为传参做准备,然后实参入栈:
·f函数的汇编代码:
·实参入栈,然后call指令将下一条指令的地址入栈:
·分配栈空间:
·将%eax与立即数7相加:
·在结束前弹栈:
·结束函数并与立即数相加:
·leave返回栈然后进入main函数:
·ret结束main函数: