8086/8088指令格式和寻址方式
一、指令格式
1.第一个字节为?包含什么参数,代表什么意思?
第一个字节为操作码
包含的参数为:
-
OPCODE :占六位,给出要执行的操作。
比如 100010 代表MOV指令 -
D :占一位,给出
REG操作数
的传送方向,如果为0,说明REG操作数是源操作数,为1则是目标操作数 - W:占一位,给出操作的数是字节(8bit)还是字(16bit),如果W=0,则代表操作数类型为字节,W=1则表示操作数类型为字
2.第二个字节为?包含什么参数,代表什么意思?
第二个字节为寻址方式
包含的参数:
- MOD:占两位,区分另一个操作数是在寄存器种还是存储器中,如果是存储器中还需给出偏移地址
-
REG:占三位,是一个寄存器操作数,代表源操作数还是目标操作数
由D给出
-
R/M: 占三位,与MOD有关,如果MOD代表寄存器寻址,则给出所在寄存器的编号,如果MOD代表存储器寻址,则给出计算偏移地址的方式。
注意:8086/8088 的指令
由1~6个字节
给出,只有一个字节也是可以的,因为很多指令的操作数是隐含的,不用自己去指定。
来个题:
写出 MOV AH,[BX+DI+50H] 的指令码
MOV的
OPCODE为:100010
令REG存目标操作数,
D=1
,(令D=0,存源操作数也行)
目标操作数为AH,根据上表得
REG=100
因为已知目标操作数是八位,所以操作数类型为字节,
W=0
。
因为位移量为50H,没超过2^8,是八位位移,根据上表中寄存器寻址有八位位移得
MOD=01
根据上表找到[BX +DI +八位偏移量]对应的
R/M=001
偏移量为:
50H=01010000
由此得操作码:100010 1 0 01 100 011 01010000
即 8A6150H
二、寻址方式 (很重要很重要很重要!!)
▶ 预备知识:操作数的种类
根据操作数的个数,指令格式可分为以下几种:
-
零操作数指令
指令格式中没有操作数或操作数是隐含约定的。 -
一操作数指令
指令格式中有一个操作数,或还有一个隐含的操作数(实际上是双操作数)。 - 二操作数指令
指令中有两个操作数,其中一个为目的操作数,另一个为源操作数。
源操作数
:只能读取的操作数。
目的操作数
:即可读取又可写入(存放操作结果)的操作数。
操作数又可分为两大类:数据操作数和地址操作数。
1.数据操作数
这类操作数是与数据有关的操作数,即
指令中要操作的对象是数据
。数据操作数又可分为立即数操作数、寄存器操作数、存储器操作数和I/O操作数。
- 立即数操作数:指令中要操作的数据在指令中
- 寄存器操作数:指令中要操作的数据存放在指 定的寄存器中。
- 存储器操作数:指令中要操作的数据存放在指定的存储器中。
- I/O操作数:指令中要操作的数据来自或送到I/O端口。
-
-
地址操作数
这类操作数是与程序转移地址有关的操作数,即指令中要操作的对象不是数据,而是要转移的目的地址。
地址操作数也可分为立即数操作数、寄存器操作数和存储器操作数,即要转移的目的地址包含在指令中,或存放在寄存器中,或存放在存储器单元之中。
-
地址操作数
▶ 数据寻址方式(8种)
1. 立即数方式
操作数包含在指令字节中。即指令格式中操作数部分就是操作数本身。
2. 寄存器寻址方式
操作数存放在CPU的某个内部寄存器中
3. 存储器寻址方式
操作数存储器中
1) 直接寻址方式
操作数的有效地址只包含位移量,不是立即数,是地址!
如果没有特殊指明,直接寻址方式的操作数一般在存储器的数据段中,即
隐含的段寄存器是DS
。但是8086/8088也允许段超越,此时需要在指令中特别标明,方法是在有关操作数的前面写上操作数所在段的段寄存器名,再加上冒号。
2) 寄存器间接寻址方式
操作数的有效地址只包含基址寄存器BX的内容或变址寄存器SI、DI内容的一种。注意操作数是在存储器中的,但是在存储器中的位置放在了寄存器中
例:MOV AX,[SI]
注意:
【】中只允许出现BX、SI、DI其中的一个
3) 寄存器相对寻址方式
在寄存器间接寻址的基础上加了一个
八位或者十六位
的位移量,并且多了个可用的寄存器BP
例:MOV [SI+10H],AX
注意:
【】中只允许出现BX,BP,SI,DI中的一个
4) 基址变址寻址方式
有效地址是
一个基址寄存器(BX或BP)和一个变址寄存器(SI和DI)的内容之和
例子:MOV [BX+DI],AX
注意:【】中只允许出现
BX和BP中的一个+SI和DI中的一个
5) 基址变址相对寻址方式
在基址变址寻址方式上加一个八位或十六位的位移量
例子:MOV AX,[DX+SI+1234H]
4. 端口寻方式
1) 端口直接寻址
操作数为八位即**不超过255(FFH)**可以直接给出
2)端口间接寻址
如果端口地址超过255则
必须现存入DX
▶ 地址寻址方式(4种)
地址的寻址方式其时是程序转移地址的寻址方式,也就是
找出程序转移的地址号,而不是操作数
。
转移地址可以在段内,也可以跨段转移(称段间转移)。
1. 段内直接寻址方式
转移的地址是当前IP内容和指令规定的8位或16位位移量
之和
。
- 当位移量是8位时,称为短程转移
-
位移量是16位时称为近程转移。
这种寻址方式适用于条件转移或无条件转移类指令。但条件转移只有8位位移量的短程转移。
2. 段内间接寻址方式
程序转移的地址存放在
寄存器
或
存储器单元
中。指令执行使用寄存器或存储器单元的内容来更新IP的内容。
3. 段间直接寻址方式
这种寻址方式是指令码中
直接给出16位的段地址和16位的偏移地址
用来更新当前的
CS和IP
内容。
4. 段间间接寻址方式
这种寻址方式是由指令码的寻址方式
求出存放转移地址的连续两个字的地址
。其
低位字地址单元中存放的是偏移地址
,
高位字地址单元中存放的是转移段基址。