(通过查看函数调用的栈帧结构,了解CPU硬件支撑高级语言函数调用的机制) 利用程序调试手段(反汇编),查看如下程序在调用func1函数时参数在CPU内部是如何传递的,执行func1函数前后堆栈的变化情况(即栈顶指针ESP寄存器值的变化),func1函数返回值在CPU内部是如何传递的。 要求: 1)给出主程序和func1函数的反汇编代码的截图;2)查看调用func1函数前和进入func1函数后寄存器esp(栈顶指针,64位系统为rsp)值的截图;3)根据截图信息,说明函数参数在机器语言程序中的传递方式和函数结果返回值的传递方式(若是寄存器方式要写出具体的寄存器),以及进入func1函数前后堆栈的变化。
时间: 2023-06-25 08:02:15 浏览: 146
函数调用栈帧布局实验1
由于无法直接获得程序的反汇编代码和调试信息,我将以伪代码的形式描述程序的大致行为和寄存器状态变化。
主程序代码:
```
int main() {
int a = 10;
int b = 20;
int c = func1(a, b);
return 0;
}
```
func1函数代码:
```
int func1(int x, int y) {
int z = x + y;
return z;
}
```
调用func1函数时,程序将a和b的值分别压入栈中,然后调用函数。具体的执行过程如下:
1. 在调用func1函数前,esp寄存器的值为初始栈顶指针,指向栈的顶部。
2. 将a的值(10)压入栈中,此时esp减去4,指向新的栈顶。
3. 将b的值(20)压入栈中,此时esp再次减去4,指向新的栈顶。
4. 调用func1函数,将当前函数的返回地址(即下一条指令的地址)压入栈中,此时esp再次减去4,指向新的栈顶,同时将eip寄存器的值设置为func1函数的起始地址,开始执行func1函数。
5. 在func1函数内部,将x和y的值从栈中弹出,此时esp加上8,指向原来的栈顶。
6. 将x和y的值相加,得到z的值(30)。
7. 将z的值压入栈中,此时esp再次减去4,指向新的栈顶。
8. 将返回地址从栈中弹出,此时esp加上4,指向原来的栈顶。
9. 将z的值从栈中弹出,此时esp加上4,指向原来的栈顶。
10. 将返回值(即z的值)传递给调用func1函数的程序,通常使用eax寄存器进行传递。
根据上述信息,可以得出函数参数在机器语言程序中的传递方式为通过栈传递,函数结果返回值的传递方式为通过寄存器eax传递。进入func1函数前后,栈顶指针esp的变化为减少了8个字节(即2个int类型的变量),在函数返回时再次增加8个字节。
阅读全文