CSAPP第一次小测——汇编
在?一起翻车。错了四道四道,老哥,您这是干啥啊?好好补一补,博客记一下,警戒+积累,本次大坑是:
- 有符号整型是补码表示
- cmpl SRC,Dsc是Dcr - Src
- jmp 指令种与PC相关的条件转移
- 你竟意识全无
T1
考察add指令
两个正整数相加,结果存放在%edx=0x2729 5700
T2
考察cmpl指令和有符号跳转指令jge
注意有符号整型数据以二进制补码的形式存放,而jge指令为有符号大于等于Greater or Equal(Signed),因此将对两个数据进行有符号整型数据处理,%edx=0xb44b077d=1011 0100 0100 1011 0000 0111 0111 1101显然是一个负数,而%eax=0x4bfd7fdb=0100 1011 1111 1101 0111 1111 1101 1011为正数。因此%eax - %edx>0,不进行跳转.L2,%eax=%eax-%edx=0x4bfd7fdb-0xb44b077d=0x97b2785e
- 注意有符号整数用补码形式存储
- 对于一个16进制有符号数,是一个负数的标志是符号位为1,只要X>10000=8,那么他就是负数
-计算器直接×-(1),然后截取后4个字节即可得到补码
T3
考察movsbl符号扩展指令传送指令
- movsbl:在一些强制转化时可能使用,进行符号位扩展,高位扩展位用符号填充
0x9e=1001 1110用符号位1扩展高位得到 111111111111111111111111 1001 1110=0xffffff9e- 注意带L是移动32位
T4
考察寄存器组成
在 cmpl %ecx,%ebx 之时,%ebx=0xed22153a,%eax=0xed225201
- jae指令代表无符号数大于等于
- %ebx < %eax,所以不进行跳转,直接运算0x9+0xed22153a=0xed221543
-错误原因:没有理解cmpl指令和jae是Des-Src
T5
这里敲个警钟!传送指令,目的,源,必须要完全字节对应!是多大就多大除非是mov
考察传送指令
这里由于movb dh都是单字节,而目的eax是4字节,所以编译不通过
T6
考察leal指令
%ecx*4+0x60=2 C85B CCAC,丢弃其高位得到0xC85B CCAC,
- 虽然这里没说这是一个什么类型的数据,但是一般应该是一个int型的有符号整型,所以要得到真值取补码。。。。
考察指针
改变a的值,然后将b指向的a赋值给d指向的c,所以C=0x8726a341+0x9a9b61dc=0x1 21C2 051D,丢弃最高位:566363421,变为正数
T8
考察传送指令类型
T9
#考察寻址方式
4*%ebx+%eax=0X10C
0x47+0xAD=0xFA,注意格式是大写
T9
考察算数左移指令:
ah=0011 1011左移5位,低位补0,得到0110 0000=0x60
T11
考察jmp指令的PC相关寻址
3930d9df+53=0x3930da32
T12
考察jmp指令的PC相关寻址
首先计算地址2:259adf8a-16=0x259adf74
地址1:0x259adf74-2(机器指令74 16占2个字节)=0x259adf742
T13
考察jmp指令PC相关寻址
目标=65f510a8+ffffffd3=1 65F5 107B,丢弃溢出:65f5107b
- 注意小端法
T14
考察函数过程
①首先pushl %ebp,帧栈往下增长,因此%ebp=%ebs=0x991bf252-0x4=0x991BF24E
②第四行开辟栈空间,esp-$40=0x991BF226,特别注意,是减去十进制40,也就是0x28
③x为第二个参数,首先处理,所以x的地址为ebp-4=0x991BF24E-4=0x991BF24A,y的值为0x991BF24A-4=0x991BF246
⑤看图(为啥字ebp要减去C而不是8?我现在仍然疑惑。。。)