第三章 8086/8088 指令系统
3.1概述
3.1.1指令的基本构成
1)指令的一般格式
一条指令主要由操作码和操作数组成,8086指令的长度在1-7个字节之间
操作码占用一个字节或两个字节
一条指令的操作数可以没有或有一个,但最多只有两个。
指令在格式上有以下形式:
1.零操作数指令
2.单操作数指令
3.双操作数指令
2)指令中的操作数类型
分为三种:立即数操作数,寄存器操作数,存储器操作数
1.立即数操作数:即为常数,只能作为源操作数,不能作为目标操作数,因为
常数没有表示地址的含义
2.寄存器操作数:8086 CPU的8个通用寄存器和4个段寄存器,既可以
作为源操作数,也可以作为目标操作数
通用寄存器通常用来存放数据或者数据所在存储单元的偏移地址
段寄存器用来存放当前操作数的段基地址
3.存储器操作数
参加运算的数据是存放在内存中,在指令中既可以作为源操作数,
也可以作为目标操作数
3.1.2 指令的执行时间
一条指令的执行时间包括取指令,取操作数,执行指令,传送结果,单位用
时钟周期数表示
指令执行速度由快到慢排序:寄存器操作数,立即操作数,存储器操作数
3.1.3 CISC 和 RISC 指令系统
3.2 寻址方式
寻址方式分为两种类型:
1.寻找操作数的地址
2.寻找程序的地址
3.2.1 立即寻址
此方式只针对源操作数。此时源操作数是一个立即数,作为指令的一部分存放在
内存的代码段中,这里的立即数可以是8位或16位的整数,若为16位,存放时
低8位存放在低地址,高8位存放在高地址
3.2.2 直接寻址
表示参加运算的数据存放在内存中,存放的地址由指令直接给出。[]内用16位常数
表示存放数据的偏移地址。数据的段基址默认为数据段。其与立即寻址两者之间
存在区别,立即寻址后面的是数据本身,所以用[]加以区别
3.2.3 寄存器寻址
指令的操作数为CPU内部寄存器,例如MOV SI,AX
3.2.4 寄存器间接寻址
寄存器的内容为操作数的偏移地址,只允许是SI,DI,BX,BP。当选择SI,DI,BX作为
间址寄存器时,段基地址有DS决定;若选择BP作间址寄存器,则操作数
在堆栈段,段基地址由SS决定。例如MOV AX,[SI],此为使用了默认的段寄存器DS
若是使用了附加段,则为MOV AX,ES:[SI];若是间址寄存器采用BP,则操作数
默认存放在SS段
3.2.5 寄存器相对寻址
操作数在内存中的存放地址(偏移地址)由间址寄存器的内容加上指令中给出的
一个8位或16位的位移量组成,例如下面的写法都是等价的:
MOV AL,DATA[SI]
MOV AL,[SI]DATA
MOV AL,DATA+[SI]
MOV AL,[SI]+DATA
MOV AL,[DATA+SI]
MOV AL,[SI+DATA]
其中,AL=10XDS+SI+DATA
3.2.6 基址-变址寻址
此方式是有一个基址寄存器(BX或BP)的内容和一个变址寄存器(SI或DI)的
内容相加而形成操作数的偏移地址。例如MOV AX,[BX][SI];
那么AX=10XDS+BX+SI
此时需注意:不允许将两个基址寄存器或两个变址寄存器放在一起寻址
例如:MOV AX,[BX][BP]
MOV AX,[SI][DI]
3.2.7 基址-变址-相对寻址
这是上一种方式的扩充,同时给出了一个8位或16位的位移量,下面几种写法等价
MOV AX,DATA[SI][BX]
MOV AX,[SI][DATA+BX]
MOV AX,[BX+DATA+SI]
MOV AX,[BX]DATA[SI]
MOV AX,[BX+SI]DATA
同样,不允许将两个基址寄存器或两个变址寄存器放在一起寻址,例如
MOV AX,[BX][BP]DATA
MOV AX,DATA[SI][DI]
3.2.8 隐含寻址
有些指令的操作码中不禁包含了操作的性质,还隐含了部分操作数的地址,如MUL
只需要指明诚实的地址,而被乘数以及乘积的地址是隐含而固定的
3.3 8086指令系统
3.3.1 数据传送指令
1)通用数据传送指令