再看汇编和机器码

发布时间 2023-12-27 18:23:04作者: 叕叒双又

  先看代码:

这里为了排版方便用的图片,也有行号,说明如下:

1. 80386的部分机器码如下:

其中 imm表示立即数 DDD表示用3位表示的目的寄存器标号, SSS表示用3位表示的源寄存器标号

机器码中将寄存器用三位表示,例如EDX: 010     EAX: 000     ECX: 001 

因此,图中第三行代码: MOV   EDX,  0  翻译成机器码:

1 表中第二行符合指令形式, 10 111 DDD

2 指令中的目的寄存器标号为:010,带入 10 111 010, 也就是: 1011  1010 = BA,因此,指令和目的寄存器的内容就是BA 

3 用32位寄存器表示立即数,因此立即数0被表示成  00  00  00  00, 所以除了第三行的 BA  后的 00 后,第4,5行的00就是这么来的

4 理解了3,4,5行代码后,再理解24,25,26的代码就简单多了,1被表示成 01  00  00  00 因为intle cpu是小端模式,也就是说高位存低字节的内容

5 再来看跳转, 这里的跳转是相对地址,也就是说计算跳转后地址和跳转前地址的差值填写到跳转指令之后,

6 以第14行为例:jns  NXT 符合表中的JNS部分,表中的是立即数,这里的标号就是立即数而已,跳转指令执行后的地址是19H,跳转的地址是1DH,还要经过4H个字节,因此OF 89后的立即数是: 04  00  00  00

7 同样第11行为例:jz  GCD 符合表中的JZ部分,表中的是立即数,这里的标号就是立即数而已,跳转指令执行后的地址是13H,跳转的地址是24H,还要经过11H个字节,因此OF 84后的立即数是: 11  00  00  00

8 第20行为例:jmp  ORD 符合表中的JMP部分,表中的是立即数,这里的标号就是立即数而已,跳转指令执行后的地址是24H,跳转的地址是BH,还要经过-16H个字节,因此E9后的立即数是-16H的补码: E7  FF  FF  FF

其他的应该都是很简单的,自己就可以阅读了吧。