这些是学习CSAPP的时候做过的一些测验题,题目本身不难,比较基础,但平时有的细节没太注意,错了好多题,现在做一个总结和回顾。如有错误,欢迎提出!
1
- 本题考察的是汇编指令和16进制的运算
- add src dest表示dest=dest+src,两个数相加结果放在%edx寄存器。
2
- 本题考察的是常见的汇编指令。按照代码的逻辑比较%edx和%eax的值后,%edx>%eax,执行L2,当时很开心就写上了答案,然鹅却忽略了重要的一点,jge是有符号数的大于等于,故需要操作数看最高位判断符号。
- %edx=0xec0856d4=1110 1100 0000 1000 0101 0110 1101 0100,最高位为1,是一个负数,%eax=0101 0011 1101 1001 1110 1000 0010 1101,最高位为0,是一个整数,%edx-%eax<0,故执行%eax=%eax-%edx=0x67d19159。
3
- 本题考察的是movsbl指令
- movsbl指令负责拷贝一个字节,并用源操作数的最高位填充其目的操作数中的其余各位,这种扩展方式叫符号扩展。另外还有一个是movzbl指令,它也是拷贝一个字节,但填充时用的是0填充。
- dh存储的是0x68,符号位为0,拷贝给%eax则是0x00000068。
4
- 本题考察的是常见汇编指令和movl,movw,movb的区别
- l,w,b分别表示4,2,1个字节,比如movw就表示传送2个字节(16位)
- 初始%ebx=0x82de2318,%ecx=%ebx
执行接下来两条指令后改变了%bx,%bl的值,%ebx变为0x82debed2;接着比较%ebd,%ecx的大小,注意到后面的jae表示无符号数的比较,不用考虑正负。易知%ebx>%ecx,于是执行L1,%ebx=%ebx-0x6=0x82debecc。
5
- 本题考察的是寄存器的结构
- 80386中有8个通用寄存器,这里以%eax为例说明。
eax可以存放32位
%ax可以存放16位,即%eax的低16位
%ah可以存放8位,即%ax的高8位
%al可以存放8位,即%ax的低8位
其余寄存器和%eax类似 - movsbl %dh,%eax,%dh的存放的值是0x34,用符号扩展的方式进行填充后,%eax中的值为0x00000034。
- 若题目变为 movb %dh,%eax,则不能编译通过,当确定传送字节数后,源和目的寄存器也必须是同字节的。
6
- 本题考察的是寄存器寻址方式
- 0x10(,%edx,4)是比例变址基址寻址,得到的数值为%edx4+0x10=0x147618064+0x10=51D8 6028=1373134888(10进制)。
7
- 本题考察指针
- b存放a的地址,d存放c的地址
a=a+0xf22c6eb9=1 14e0 77e0,舍去最高位为14e0 77e0
化成十进制即350 255 072。
8
- 考察传送指令
- movl传送32位;movw传送16位;movb传送8位。
9
- 考察寻址方式
- (%eax,%ebx,4)表示地址为%ebx4+%eax存储的值,计算地址为0x34+0x100=0x10c,addl指令将0x3d加到地址0x10c中存储的值上,更新值为0x3d+0xb7=0xf4。填写答案时一定需要注意格式!!
10
- 考察移位指令
- shl表示逻辑左移,%ah中存储值为0x6b=0b01101011,左移5位得0b0110000=0x60。
- 这里顺便提一下,左移x<<y,将x左移y位,左边的位全都丢弃,在右边填充0;右移x>>y,将x右移y位,逻辑右移是在左边填0,算术右移是填充符号位,例子如下:
11
- 考察跳转指令的寻址
- 相关知识点在CSAPP P128有介绍
跳转的目标地址=PC+“地址偏移量”
以这个题目为例,PC为下一条指令的地址,即31b61ac1,“地址偏移量”为53,故je跳转的目标地址为31b61ac1+53=31b61b14 - 这道题目也启示我们需要去熟悉课本内容,巩固细节
12
- 考察跳转指令的寻址
- 这个题和11题类似,当时测试的时候完全没印象了,连续翻车,这是期末前给自己的警钟!!不多说,继续分析这个题。
这里我们可以看到地址偏移量为5a,je的跳转目标地址已经给出2816e80,根据 跳转的目标地址=PC+“地址偏移量” 得PC=2816e80-5a=2816e26,所以第2行的XXX是2816e26。
接着第1行的地址为2816e26-2=2816e24,减去2是因为机器码74 5a占去2个字节。
13
- 考察跳转指令的寻址
- 同样的,这个题和11,12类似。
这里给出的“地址偏移量”是以补码形式,小端法给出的,用大端表示为ffffffc7(十进制:-57),将ffffffc7除去符号位不变,其余为取反加1得到原码-39。所以跳转的目标地址为3fdae7dc-39=3fdae7a3。
14
- 考察函数调用过程中栈帧的分配
- 第2句pushl %ebp将ebp压入栈顶,对应esp的值减4
第3句%ebp指令指向%esp处
第4句为proc函数开辟栈帧,栈空间大小为34,对应16进制0x22(注意34是10进制)
栈帧示意图如下
局部变量x存放在%ebp-4=0x74cf0049,y存放在%ebp-8=0x74cf0045
未使用的栈帧区域上限为%ebp-c=0x74cf0041,下限为%esp+c=74cf0037。
对于这次小测,需要注意几个细节:jmp等跳转目的地址的计算;计算加减乘除时需要注意是否为有符号数,有符号数需要考虑正负。