想写一个8086的模拟器出来,第一步学习8086机器指令格式。解决了些问题,也还存在很多问题,拿出来讨论下。
请先下载一个资料:OPCODES手册
http://byhh.net/f/CS/1175690465/opcodes.rar
00 : If mmm = 110, then a displacement follows the operation; otherwise, no displacement is used
01 : An 8-bit signed displacement follows the opcode
10 : A 16-bit signed displacement follows the opcode
11 : mmm specifies a register, instead of an addressing mode
mmm : Function
000 : DS:[BX+SI]
001 : DS:[BX+DI]
010 : SS:[BP+SI]
011 : SS:[BP+DI]
100 : DS:[SI]
101 : DS:[DI]
110 : SS:[BP]
111 : DS:[BX]
rrr : W=0 : W=1 : reg32
000 : AL : AX : EAX
001 : CL : CX : ECX
010 : DL : DX : EDX
011 : BL : BX : EBX
100 : AH : SP : ESP
101 : CH : BP : EBP
110 : DH : SI : ESI
111 : BH : DI : EDI
sss : Segment Register
000 : ES
001 : CS
010 : SS
011 : DS
100 : FS (Only 386+)
101 : GS (Only 386+)
rrr : Index Register
000 : EAX
001 : ECX
010 : EDX
011 : EBX
100 : No Index
101 : EBP
110 : ESI
111 : EDI
×××××××××××××××××××××××××××××××××××××××××××××
网上的资料:
———————————————————————————————————————
指令1 -> MOV AX,1234H 对应的机器码为:B83412
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
———————————————————————————————————————
指令4 -> MOV AX,BX 对应的机器码为:8BC3
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
×××××××××××××××××××××××××××××××××××××××××××××
下面来结合一个例子好好练习下:
【 插入图片,Turbo Debug 】
———————————————————————————————————
mov ax,5354
机器码格式:MOV Reg,Imm ==> 1011wrrr
字操作,w=1
ax的索引号为rrr=000
10111000=>B8
所以mov ax,5354 ==> B85453
———————————————————————————————————
mov ds,ax
机器码格式:MOV Seg,Reg16 ==> 10001110oosssmmm
mmm需要解释为寄存器,所以oo=11
段寄存器ds=011,所以sss=011
ax=000,所以mmm=000
oosssmmm=11011000 => D8
mov ds,ax => 8ED8
———————————————————————————————————
lea dx,[0025]
机器码格式:LEA RegWord,Mem 10001101oorrrmmm
这个稍微有点复杂。0025实际上相当于一个偏移,mmm不应该是寄存器,所以取oo=00,mmm=110。(很牵强,谁能把这个说的更透彻点?欢迎发表意见!)
dx=010,所以rrr=010
oorrrmmm = 00010110 => 16
10001101oorrrmmm => 8D16
lea dx,[0025] => 8D162500
———————————————————————————————————
mov ah,09 (这个请与mov ax,5354对比下)
机器码格式:MOV Reg,Imm ==> 1011wrrr
字节操作,w=0
ah的索引号为rrr=100
10110000=>B4
所以mov ax,5354 ==> B409
———————————————————————————————————
int 21
机器码格式:INT Imm8 ==> 11001101 = CD
所以int 21 => CD21
———————————————————————————————————
inc bx
机器码格式:INC RegWord 01000rrr
bx=011,所以rrr=011
所以 inc bx => 01000011 =43
———————————————————————————————————
xor ax,ax
机器码格式:XOR Reg,Reg 0011001woorrrmmm
字操作,w=1
均为寄存器,oo=11
ax=000,所以rrr=mmm=000
woorrrmmm=111000000
0011001111000000=33C0
所以xor ax,ax => 33C0
———————————————————————————————————
mov al,[bx]
机器码格式:MOV Reg,Mem 1000101woorrrmmm
字节操作,w=0
由操作数性质我们知道oo=00 (谁能给出更详细的理由?谢谢)
al=000,所以rrr=000
[bx]实际为ds:[bx],而DS:[BX] =111
woorrrmmm=000000111 = 07
所以1000101woorrrmmm = 8A07
mov al,[bx] => 8A07
———————————————————————————————————
上面都是从汇编转成机器指令,只要有了指令表,了解编码规则,难度并不大。
8086的指令类型为变长指令,这给指令的识别带来很大困难,从机器指令反汇编为汇编指令则要麻烦得多。
大家有什么好得算法么?后者能够提供一个url吗?