再看汇编和机器码
先看代码:
这里为了排版方便用的图片,也有行号,说明如下:
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
其他的应该都是很简单的,自己就可以阅读了吧。