本文最后更新于 476 天前,其中的信息可能已经有所发展或是发生改变。
内容目录
这是一条汇编指令:"0DAB:0106 89E8 MOV AX,BP", 那么16进制数字和机器码之间的转化关系是什么?后来发现机器码有不同的长度,不同长度又分别代表什么含义?通过机器码,如何知道一些信息呢,如:操作数和源操作数,参考一些文章来对比分析下
0x01 机器码分析
1.1 分析16/16位寄存器
1. 目的操作数不变,改变源操作数
逻辑地址 机器码 操作符 操作数 机器码 src dest
0DAB:0100 89C0 MOV AX,AX ;89C0 -> 100010001 11 000 000
0DAB:0102 89D8 MOV AX,BX ;89D8 -> 100010001 11 011 000
0DAB:0104 89D0 MOV AX,DX ;89D0 -> 100010001 11 010 000
0DAB:0106 89E8 MOV AX,BP ;89E8 -> 100010001 11 101 000
0DAB:0108 89F0 MOV AX,SI ;89F0 -> 100010001 11 110 000
0DAB:010A 89F8 MOV AX,DI ;89F8 -> 100010001 11 111 000
0DAB:010C 89E0 MOV AX,SP ;89E0 -> 100010001 11 100 000
0DAB:010E 89C8 MOV AX,CX ;89C8 -> 100010001 11 001 000
2. 源操作数不变,改变目的操作数
0DAB:0110 89C3 MOV BX,AX ;89C3 -> 100010001 11 000 011
0DAB:0112 89C1 MOV CX,AX ;89C1 -> 100010001 11 000 001
0DAB:0114 89C2 MOV DX,AX ;89C2 -> 100010001 11 000 002
0DAB:0116 89C6 MOV SI,AX ;89C6 -> 100010001 11 000 110
0DAB:0118 89C7 MOV DI,AX ;89C7 -> 100010001 11 000 111
0DAB:011A 89C4 MOV SP,AX ;89C4 -> 100010001 11 000 100
0DAB:011C 89C5 MOV BP,AX ;89C5 -> 100010001 11 000 101
如上可以得出结论:
16位寄存器是按位存储的
ax – 000
cx – 001
dx – 010
bx – 011
sp – 100
bp – 101
si – 110
di – 111
注意:
16位寄存器中,AX累加器的速度是最快的,其次是CX计数器,因为cx是一个8个word的数组,
AX只需要取数组地址 base, CX 只需要取数组地址 base + sizeof(world),其他的取数组地址需要计算乘法 base + i * sizeof(world)
反向来验证
89 11 100 011 -> 89 E3 ==》 mov bx, sp
89 11 110 100 -> 89 F4 ==》 mov sp, si
89 11 100 010 -> 89 E2 ==》 mov dx, sp
1.2 分析8/8位寄存器
mov si, di
1000 1001 1111 1110 89fe
逻辑地址 机器码 操作符 操作数 机器码 src dest
0DAB:012E 88C7 MOV BH,AL ;88C7 -> 10001000 11 000 111
0DAB:0130 88E7 MOV BH,AH ;88E7 -> 10001000 11 100 111
0DAB:0122 88DF MOV BH,BL ;88DF -> 10001000 11 011 111
0DAB:0124 88FF MOV BH,BH ;88FF -> 10001000 11 111 111
0DAB:0126 88CF MOV BH,CL ;88CF -> 10001000 11 001 111
0DAB:0128 88EF MOV BH,CH ;88EF -> 10001000 11 101 111
0DAB:012A 88D7 MOV BH,DL ;88D7 -> 10001000 11 010 111
0DAB:012C 88F7 MOV BH,DH ;88F7 -> 10001000 11 110 111
如上可得出结论:
8位寄存器也是按照位来存储的,分别如下:
al – 000
cl – 001
dl – 010
bl – 011
ah – 100
ch – 101
dh – 110
bh – 111
1.3 指令对比
89FE MOV SI,DI 1000 1001
88FE MOV DH,BH 1000 1000
机器码 操作符 操作数 1000 10 d w mod rrr rrr/mmm
89C3 MOV BX,AX 1000 10 0 1 11 000 011
89CB MOV BX,CX 1000 10 0 1 11 001 011
89D3 MOV BX,DX 1000 10 0 1 11 010 011
89DB MOV BX,BX 1000 10 0 1 11 011 011
89E3 MOV BX,SP 1000 10 0 1 11 100 011
89EB MOV BX,BP 1000 10 0 1 11 101 011
89F3 MOV BX,SI 1000 10 0 1 11 110 011
89FB MOV BX,DI 1000 10 0 1 11 111 011
88C7 MOV BH,AL 1000 10 0 0 11 000 111
88E7 MOV BH,AH 1000 10 0 0 11 100 111
88DF MOV BH,BL 1000 10 0 0 11 011 111
88FF MOV BH,BH 1000 10 0 0 11 111 111
88CF MOV BH,CL 1000 10 0 0 11 001 111
88EF MOV BH,CH 1000 10 0 0 11 101 111
88D7 MOV BH,DL 1000 10 0 0 11 010 111
88F7 MOV BH,DH 1000 10 0 0 11 110 111
1000 10 d w mod rrr rrr/mmm
8B07 MOV AX,[BX] 1000 10 1 1 00 000 111
8B05 MOV AX,[DI] 1000 10 1 1 00 000 101
8B03 MOV AX,[BP+DI] 1000 10 1 1 00 000 011
8B00 MOV AX,[BX+SI] 1000 10 1 1 00 000 000
8B4212 MOV AX,[BP+SI+12] 1000 10 1 1 01 000 010 disp8
8B825634 MOV AX,[BP+SI+3456] 1000 10 1 1 10 000 010 disp16
8A825634 MOV AL,[BP+SI+3456] 1000 10 1 0 10 000 010 disp16
8B817856 MOV AX,[BX+DI+5678] 1000 10 1 1 10 000 001 disp16
89817856 MOV [BX+DI+5678],AX 1000 10 0 1 10 000 001 disp16
0x02 结论
机器码: 展开的二进制中前面6位是操作码
d:代表源操作数是寄存器还是内存
- 0:从寄存器里面取值
- 1:从内存里面取值
w:目的操作数宽度
- 0 一个字节(字节)
- 1 两个字节(字)
mod:模式
- 11:寄存器到寄存器
- 10:DISP 16位
- 01:DISP 8 位
- 00:内存到寄存器,没有偏移
0x03 参考文章
[1] https://blog.csdn.net/qq_35426012/article/details/101698804
[2] https://blog.csdn.net/xiao__1bai/article/details/126584837?ydreferer=aHR0cHM6Ly9jbi5iaW5nLmNvbS8%3D