已知函数funct的C语言代码如下: 1 int funct(viod) { 2 int x,y; 3 scanf("%x %x",&x,&y); 4 return x-y; 5 } 函数funct对应的汇编代码如下: 1 funct: 2 push1 %ebp 3 mov1 %esp,%ebp 4 sub1 $40,%esp 5 lea1 -8(%ebp),%eax 6 mov1 %eax,8(%esp) 7 lea1 -4(%ebp),%eax 8 mov1 %eax,4(%esp) 9 mov1 $.LCO,(%esp) //将指向字符串“%x %x”的指针入栈 10 call scanf //假定scanf执行后x=5,y=20 11 mov1 -4(%ebp),%eax 12 sub1 -8(%ebp),%eax 13 leave 14 ret 假设函数funct开始执行时R[esp]=0xbc000020,R[ebp]=0xbc000030,执行第10行call指令后,scanf从标准输入读入的值为0x16和0x100,指向字符串“%x %x”的指针为0x804c000。回答下列问题或完成下列任务。 (1)执行第3、10和13行的指令后,寄存器EBP中的内容分别是什么? (2)执行第3、10和13行的指令后,寄存器ESP中的内容分别是什么? (3)局部变量x和y所在存储单元的地址分别是什么? (4)画出执行第10行指令后funct的栈帧,指出栈帧中的内容及其他地址。
时间: 2023-11-25 18:08:23 浏览: 155
(1) 执行第3行指令后,EBP中的内容不变,仍为0xbc000030;执行第10行指令后,EBP中的内容不变,仍为0xbc000030;执行第13行指令后,EBP中的内容变为之前的栈底指针,即0xbc000020。
(2) 执行第3行指令后,ESP中的内容减少4个字节,即0xbc00001c;执行第10行指令后,ESP中的内容再次减少4个字节,即0xbc000018;执行第13行指令后,ESP中的内容增加40个字节,恢复到函数调用前的状态,即0xbc000020。
(3) 局部变量x和y所在存储单元的地址分别为-8(%ebp)和-4(%ebp)。
(4) 执行第10行指令后的栈帧如下图所示:
```
...
| |
| |
| y | <- 0xbc00002c
|___|
| |
| x | <- 0xbc000028
|___|
| |
| |
| |
| |
|___| <- 0xbc000020 (旧的EBP)
| RET | <- 0xbc00001c (返回地址)
|___| <- 0xbc000018 (旧的ESP)
```
栈顶地址为0xbc00002c,栈底地址为0xbc000020。其中,局部变量x和y分别存储在地址0xbc000028和0xbc00002c处,返回地址存储在0xbc00001c处,旧的ESP存储在0xbc000018处,旧的EBP存储在0xbc000020处。在执行第4行指令时,函数的返回值会被存储在寄存器EAX中,最终被存储在调用该函数的函数的栈帧中。
阅读全文