简介:汇编补测我又来了,然后系统崩溃+时间太紧张,我还是错得一塌糊涂,最讨厌自己这样马后炮,以后要是能冷静下来想问题就好了。祝xdm都能学好汇编
1:执行以下指令,最终%eax的结果为______(以十六进制格式小写表示例0xffffffff)。
movl $0x895d3a48,%edx
movl $0x21b3dcaa,%eax
cmpl %eax,%edx
jge .L2
subl %edx,%eax
jmp .L3
.L2:
subl %eax,%edx
movl %edx,%eax
.L3:
解析:edx-eax为负数。跳过jge .L2,执行subl edx,eax,得到FFFF FFFF 9856 A262
正确答案:0x9856a262
2:给定C函数如下:
int proc(void)
{
int x, y;
scanf(“%x %x”, &y, &x);
return x-y;
}
GCC 产生以下代码:
1 proc:
2 pushl %ebp
3 movl %esp, %ebp
4 subl $48, %esp
5 leal -4(%ebp), %eax
6 movl %eax, 8(%esp)
7 leal -8(%ebp), %eax
8 movl %eax, 4(%esp)
9 movl $.LCO, (%esp) //Pointer to string “x% x%”
10 call scanf
//Diagram stack frame at this point
11 movl -4(%ebp), %eax
12 subl -8(%ebp), %eax
13 leave
14 ret
假设过程proc开始执行时寄存器 %esp的值为0x1d3ef87c, 寄存器 %ebp的值为0xd6edb780。如果proc调用scanf(第10行),而scanf从标准输入中读入值 0x44 和 0x15,假设字符串 “%x %x”存放在存储器位置 0x70009afd。请问,
A. 第3行 %ebp 的值被设置成了多少?
B. 第4行 %esp 的值被设置成了多少?
C. 局部变量 x 和 y 的存放地址是什么?
D. 画出就在scanf返回后proc的栈帧图。
E. 指出proc未使用的栈帧区域。
解析:
栈帧:
0x1d3ef878 | ebp 0xd6edb780 |
---|---|
0x1d3ef874 | x 0x15 |
0x1d3ef870 | y 0x44 |
0x1d3ef86c | |
0x1d3ef854 | |
0x1d3ef850 | &x 0x1d3ef874 |
0x1d3ef84c | &y 0x1d3ef870 |
0x1d3ef848 | 0x70009afd 字符%x,%x的存储器位置 |
正确答案:
A.0x1d3ef878
B.0x1d3ef848
C.0x1d3ef874,0x1d3ef870
D. 如上图
E.0x1d3ef86c~0x1d3ef854
3:一个c代码文件e.c,需要经过预处理(输出e.i)、编译(输出e.