版权声明:转载请标明来处,谢谢! https://blog.csdn.net/qq_41600080/article/details/84590185
第三章 指令系统与数据指令
1.指令系统基本概念
(1)指令与指令系统
指令:控制计算机完成某种操作的命令;
指令系统:处理器所能识别的所有指令的集合;
指令的兼容性:同一系列的指令都是兼容的;
(2)指令格式
操作码 | [操作数] | [操作数] |
---|---|---|
操作指令 | 目标操作数 | 源操作数 |
执行何种操作 | 指令执行的对象 |
- 零操作数指令: 操作码
- 单操作数指令: 操作码 操作数
- 双操作数指令: 操作码 操作数,操作数
- 多操作数指令: 三操作数及以上
(3)指令中的操作数
1、立即数操作数
-
立即数本身是参加操作的数据,可以是8位或16位,只能作为源操作数。
-
例:
- MOV AX,1234H
- MOV BL,22H
立即数无法作为目标操作数
立即数可以是无符号或带符合数,数值符合其取值范围。
2、寄存器操作数
-
参加运算的数存放在指令给出的寄存器中,可以是16位或8位。
-
例:
- MOV AX,BX
- MOV DL,CH
存储器操作数
- 参加运算的数存放在存储器的某一个或某两个单元中
- 表现形式:[ ]
[ ]里放操作数在内存中的偏移地址
指令的操作数出现【 】,表示要寻址的数在内存中。
注意上图:当目标操作数为AL时,只取了一个单元的数,而当目的操作数为AX时,取了两个单元的数。
2.指令的寻址方式
操作数可能的来源或运算结果可能的去处:
- 由指令指令直接给出
- 寄存器
- 内存单元
寻址操作数的、所在地址的方法可以有三种大类型
- 指令直接给出的方式
- 存放于寄存器中的寻址方式
- 存放于存储器中的寻址方式
立即寻址
- 立即寻址仅适合于源操作数,即源操作数是参加操作的数据本身。
- 由指令直接给出运算的数据(操作数是立即数)。为常数形式或字符形式。
- 立即数只表示运算的数据,无地址含义。
寄存器寻址
- 参加操作的操作数在CPU的通用寄存器中
- 例:
- 此种寻址方式中的寄存器主要是通用寄存器,不含控制寄存器,段寄存器限制使用。
存储器操作数
- 指令操作的对象在内存中,表现形式为:[ ]
- 指令中给出运算对象在内存某个逻辑段中的偏移地址:[偏移地址]
- 逻辑段的段基地址通过默认或重设方式给出。
- 存储器操作数的字长本身不确定,其字长取决于指令中另一个寄存器操作数,或通过其他方式指定字长。
1、直接寻址
-
指令中直接给出操作数的偏移地址
-
例:MOV AX,[1200H]
-
直接寻址方式下,操作数默认为在数据段,但允许段重设,即由指令给出所在逻辑段。
-
例:MOV AX,ES:[1200H] ;ES为段重设符。
2、寄存器间接寻址
- 操作数存放在内存中,数据在内存中的偏移地址为方括号中通用寄存器的内容。
- 仅有4个通用寄存器可用于存放数据的偏移地址(间接寄存器——>BX,BP,SI,DI)
- 间接寻址的一般格式:[ 间址寄存器 ]
寄存器间接寻址 - 由寄存器间接给出操作数的偏移地址;
- 存放偏移地址的寄存器称为间址寄存器(BX,BP,SI,DI)
- 操作数的段地址(数据处于哪个段)取决于选择哪一个间址寄存器:
- BX,SI,DI——>默认在数据段
- BP——>默认在堆栈段
- 也可以段重设
3.寄存器相对寻址
4、基址、变址寻址
-
操作数的偏移地址为:一个基址寄存器的内容+一个变址寄存器的内容;
-
操作数的段地址由选择的基址寄存器决定
- 基址寄存器为BX,默认在数据段
- 基址寄存器为BP,默认在堆栈段
-
基址变址寻址方式与相对寻址方式一样,主要用于一维数组操作。
-
例:
5、基址、变址、相对寻址
- 操作数的偏移地址为:基址寄存器内容+变址寄存器内容+位移量
- 操作数的段地址由选择的基址寄存器决定。
- 基址变址相对寻址方式主要用于二维表格操作。
隐含寻址
- 指令中隐含了一个或两个操作数的地址,即操作数在默认的地址中。
- 例:MUL BL
- 指令执行:AL*BL——>AX
数据传送指令
8086指令系统
从功能上包括六大类:
- 数据传送
- 算术运算
- 逻辑运算和移位
- 串操作
- 程序控制
- 处理器控制
数据传送类指令
- 通用数据传送指令
- 输入输出指令
- 地址传送指令
- 标志传送指令
除标志传送指令外,其他指令的执行对标志位不产生影响。
一、通用数据传送指令
1、一般数据传送指令
- 一般传送指令MOV
- 格式:MOV dest,src
- 操作:src——> dest
- 例:MOV AL,BL
注意点
- 两操作数字长必须相同;
- 两操作数不允许同时为存储器操作数;
- 两操作数不允许同时为段寄存器;
- 在源操作数是立即数时,目标操作数不能是段寄存器;
- IP和CS不作为目标操作数,FLAGS一般也不作为操作数在指令中出现;
一般数据传送指令应用例
-
将(*)的ASCLL码2AH送入内存数据段1000H开始的100个单元中。
-
题目分析:
- 确定首地址
- 确定数据长度
- 写一次数据
- 修改单元地址
- 修改长度值
- 判断写完否?
- 未完继续写入,否则结束
MOV DI,1000H
MOV CX,64H ;循环100次
MOV AL,2AH
AGAIN: MOV [DI],AL
INC DI ;DI+1
DEC CX ;CX-1
JNZ AGAIN ;CX!=0则继续
HLT
2、堆栈操作指令
堆栈操作的原则
- 先进后出
- 以字为单位
堆栈操作指令
- 压栈指令:PUSH OPRD(16位寄存器或存储器两单元)
- 出栈指令:POP OPRD
压栈指令PUSH
指令执行过程:
- SP-2——>SP
- 操作数高字节——>SP+1
- 操作数低字节——>SP
出栈指令POP
指令执行过程:
- SP——>操作数低字节
- SP+1——>操作数高字节
- SP<——SP+2
堆栈操作指令说明
- 指令的操作数必须是16位;
- 操作数可以是寄存器或存储器两单元,但不能是立即数;
- 不能从栈顶弹出一个字给CS;
- PUSH和POP指令在程序中一般成对出现;
- PUSH指令的操作方向是从高地址向低地址,而POP指令的操作正好相反。
3、交换指令
-
格式:XCHG REG, MEM/REG
-
注:
- 两操作数必须有一个是寄存器操作数。
- 不允许使用段寄存器。
-
例
- XCHG AX,BX
- XCHG [2000],CL
4、查表指令(了解即可)
- 格式:XLAT
- 说明:用BX的内容代表表格首地址,AL内容为表内位移量,BX+AL得到要查找元素的偏移地址。
- 操作:将BX+AL所指单元的内容送AL。
5、字节扩展指令
- 将符号数的符号位扩展到高位;
- 指令为零操作数指令,采用隐含寻址,隐含的操作数为 AX及AX,DX。
- 无符号数的扩展规则为在高位补0。