在?一起翻车。。。

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?我现在仍然疑惑。。。)
在?一起翻车。。。

上一篇:STOS指令


下一篇:快速学习汇编之 内存读写