为每种基本指令类型给一个编码格式,对照格式填上不同数字表示不同的寻址方式,数据类型,便可求得每条指令的机器码
8086指令采用变长指令,指令长度可有1-6个字节组成
8086机器指令有零或多个操作数
在一条指令中,操作码部分是必需的,而操作数部分可能隐 含在操作码中,或者由操作码后面的指令给出
每种指令的操作码: 对应着机器指令的一个二进制编码 ,用一个唯一的助记符表示(指令功能的英文缩写)
指令中的操作数:
1可以是一个具体的数值(立即操作数)
2可以是存放数据的寄存器 (寄存器操作数)
3指明数据在主存位置的存储器地址(存储器操作数)
寻址方式是指令中用于说明操作数所在地址的方法(寻找操作数), 8086 指令中的操作数有一个或两个,个别指令有三个,称为源操作数和目的操作数。除目的 操作数不允许为立即数(即立即寻址)外,其余寻址方式均适合源操作数和目的操作数。
因为不同指令类型编码格式不同,所以就举一个常用的mov指令的编码格式为例子,如下图
8086操作码一般是一个字节高6位是操作码,后两个是特征位,大部分是DW标志位,除了D/W标志位,某些指令格式中还会使用SW,VW,ZW标志位
标志位 值 含义
D(目标) 0 ModR/M字节的REG域是源操作数
1 ModR/M字节的REG域是目标操作数
W(宽度) 0 表示传递的数据类型是字节操作
1 表示传递的数据类型是字(两个字节)操作
mod(2位):用来区分另一个操作数是在寄存器还是存储器中
reg(3位):用来指定是哪一个寄存器,寄存器作为源操作数还是目标操作数由D标志位确定,W确定是16位寄存器还是8位寄存器,注意:如果是对使用段寄存器的指令则reg占2位
r/m(3位):受寻址方式mod控制,如果mod=11则r/m为寄存器寻址,r/m的值就是寄存器的编号,如果mod为00,01,10的话则是存储器寻址,r/m的值便是和mod组合来指定一个有效寻址方式
如下图指定mod位的意思和reg位的意思
下图指定mod和r/m位所有组合的寻址方式
第一条指令
89C8 MOV AX,CX
对应机器码 1000 1001 1100 1000
查看mov指令寄存器移动到寄存器的对应的编码格式如下图
第一个字节前6位是操作码 D=0表示reg为源操作数,W=1表示传递的数据类型是字
第二个字节前2位mod=11表示是寄存器寻址,没有位移量,接着3位reg=001表示寄存器编号是CX,因为mod=11,所以后3位代表的是寄存器编号AX(000)
第二条指令
B82211 MOV AX,1122
1011 1000 0010 0010 0001 0001
查看mov指令立即数到寄存器的对应的编码格式如下图
1 0 1 1 w reg data data if w e 1
第一个字节前4位是操作码 W=1表示传递的数据类型是字 后3位代表寄存器编号AX(000)
第二字节表示数据,如果w=1则是16位的数据
第三条指令
8B872211 MOV AX,[BX+1122]
对应机器码 1000 1011 1000 0111 0010 0010 0001 0001
查看mov指令存储器到寄存器的对应的编码格式如下图
第一个字节前7位是操作码 W=1表示传递的数据类型是字
第二个字节前2位mod=10表示是存储器寻址,有16位位移量,接着3位reg=000表示寄存器编号是AX,因为mod=10,所以r/m后3位和mod组合成一个存储器寻址,查表得知mod=10 r/m=111对应的是BX+16位位移量
由mod=10可以得知第三和四个字节为16位位移量1122(小端存储)