计算机系统小测总结

这些是学习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

在这里插入图片描述

扫描二维码关注公众号,回复: 12683029 查看本文章
  • 考察移位指令
  • 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等跳转目的地址的计算;计算加减乘除时需要注意是否为有符号数,有符号数需要考虑正负。

猜你喜欢

转载自blog.csdn.net/weixin_44595362/article/details/106458365