8086指令的机器码编码格式

8086指令编码特点:

为每种基本指令类型给一个编码格式,对照格式填上不同数字表示不同的寻址方式,数据类型,便可求得每条指令的机器码

8086指令采用变长指令,指令长度可有1-6个字节组成

8086机器指令有零或多个操作数

 

8086指令由操作码和操作对象两部分组成

在一条指令中,操作码部分是必需的,而操作数部分可能隐 含在操作码中,或者由操作码后面的指令给出

每种指令的操作码: 对应着机器指令的一个二进制编码 ,用一个唯一的助记符表示(指令功能的英文缩写)

指令中的操作数:

1可以是一个具体的数值(立即操作数)

2可以是存放数据的寄存器 (寄存器操作数)

3指明数据在主存位置的存储器地址(存储器操作数)

寻址方式是指令中用于说明操作数所在地址的方法(寻找操作数), 8086 指令中的操作数有一个或两个,个别指令有三个,称为源操作数和目的操作数。除目的 操作数不允许为立即数(即立即寻址)外,其余寻址方式均适合源操作数和目的操作数。

 

指令编码格式

因为不同指令类型编码格式不同,所以就举一个常用的mov指令的编码格式为例子,如下图

8086指令的机器码编码格式_第1张图片

操作码 格式

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位的意思

8086指令的机器码编码格式_第2张图片

下图指定mod和r/m位所有组合的寻址方式

8086指令的机器码编码格式_第3张图片

用一个mov指令验证编码格式

8086指令的机器码编码格式_第4张图片

第一条指令

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(小端存储)

 

你可能感兴趣的:(16位汇编)