汇编语言指令(机器码)解析
本文最后更新于 497 天前,其中的信息可能已经有所发展或是发生改变。
内容目录

这是一条汇编指令:"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 

file

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

[3] https://www.yuque.com/yuxitan-w8qai/fuigfl

[4] https://www.yuque.com/dumuchenglin-lkzo5/iv45q8

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇