学习8086机器指令

想写一个8086的模拟器出来,第一步学习8086机器指令格式。解决了些问题,也还存在很多问题,拿出来讨论下。

请先下载一个资料:OPCODES手册
http://byhh.net/f/CS/1175690465/opcodes.rar

oo:Function
00:Ifmmm=110,thenadisplacementfollowstheoperation;otherwise,nodisplacementisused
01:An8-bitsigneddisplacementfollowstheopcode
10:A16-bitsigneddisplacementfollowstheopcode
11:mmmspecifiesaregister,insteadofanaddressingmode

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:SegmentRegister
000:ES
001:CS
010:SS
011:DS
100:FS(Only386+)
101:GS(Only386+)

rrr:IndexRegister
000:EAX
001:ECX
010:EDX
011:EBX
100:NoIndex
101:EBP
110:ESI
111:EDI

×××××××××××××××××××××××××××××××××××××××××××××
网上的资料:
———————————————————————————————————————
指令1 -> MOV AX,1234H 对应的机器码为:B83412

解法:判断->这个是8086汇编16位汇编指令格式,并且是立即寻址方式
查表->打开opcodes.html文件,找到标题为“MainInstructions”,单击“M”字母,然后对应查看“MOVReg,Imm”格式的“OpCode”项为:1011wrrr
再判断->由于寄存器是AX,立即数是1234H,明显是“对字操作”,所以w=1
在查看本文章上面的“表1”,对应的查到rrr的值为000
组合结果->w=1
rrr=000
1011wrrr=10111000B->B8H
根据“3.指令格式简介”->B8H+|立即数(低位在前高位在后)|=B83412H

PS:"+"符号不为“加号”

好了,已经解完第一题了,机器码为B83412H

———————————————————————————————————————
指令4 -> MOV AX,BX 对应的机器码为:8BC3

解法:判断->这个是8086汇编16位汇编指令格式,并且是寄存器寻址方式
查表->打开opcodes.html文件,找到标题为“MainInstructions”,单击“M”字母,然后对应查看“MOVReg,Reg”格式的“OpCode”项为:1000101woorrrmmm
再判断->由于寄存器是AX,BX明显是“对字操作”,所以w=1
在查看本文章上面的“表4”,对应查到oo=11因为是寄存器寻址方式
在查看本文章上面的“表1”,对应查到rrr的值为000,因为当两个操作数都是寄存器,那么一般要以目的操作数为准
在查看本文章上面的“表3”,对应查到mmm的值为011,因为当两个操作数都是寄存器,那么一般要以源操作数为准
组合结果->w=1
oo=11
rrr=000
mmm=011
1000101woorrrmmm=1000101111000011B->8BC3H

好了,已经解完第二题了,机器码为8BC3H

×××××××××××××××××××××××××××××××××××××××××××××


下面来结合一个例子好好练习下:
【 插入图片,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吗?


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值