微机原理 th-数据传送指令
微机原理
第三章
8086的指令系统
指令系统按功能分为数据传送类、算术运算类、逻辑运算与移位类、串操作类、控制转移类、处理机控制、输入输出、中断等
数据传送指令
- 通用数据传送指令
包括MOV、进栈、出栈指令、交换指令和换码指令。
(1)一般数据传送指令MOV (8位/16位)
OP目可以是寄存器(除CS外)、存储器
OP源可以是寄存器、存储器和立即数
MOV [DI],AX; AX值送给以DI为偏移地址的单元;把AX送给DSx16+DI 和 DSx16+DI+1
MOV SI,ES:[BP];把ESx16+BP 和 ESx16+BP+1 的值送给SI单元
[SI]表示寄存器SI所指内存单位
WORD PTR声明字(16位),BYTE PTR声明字节(8位)。
若有寄存器(因为寄存器在CPU内部)参与寻址无需声明,若没有寄存器参与则需要声明类型。
注意事项
- 两个操作数的数据类型要相同,要同为8位、16位或32位;如:MOV BL, AX等是不正确的;
- 两个操作数不能同时为段寄存器,如:MOV ES, DS等;
- 代码段寄存器CS不能为目的操作数,但可作为源操作数,如:指令MOV CS, AX等不正确,但指令MOV AX, CS等是正确的;
- 立即数不能直接传给段寄存器,如:MOV DS, 100H等;
- 立即数不能作为目的操作数,如:MOV 100H, AX等;
- 指令指针IP,不能作为MOV指令的操作数(IP不可读写);
- 两个操作数不能同时为存储单元,如:MOV VARA, VARB等,其中VARA和VARB是同数据类型的内存变量。
- 一般传送指令不影响标志位(FR/PSW)
例题
堆栈操作指令
堆栈:后进先出,有堆栈寄存器SS—段地址,堆栈指针SP—最新入栈数据所在的存储单元的地址。
压栈操作:PUSH OP 不能是立即数,按字操作一次只能是16位,先减后压。
SP指针:每次自减,逆向生成。 高地址存高位,低地址存地位;SP-1先压AH然后再SP-1压AL,所以AH的数据还是大于AL的数据
出栈操作:先弹出数据然后再加。
POP相当于PUSH的逆过程,弹出AL,AL的数据存到DL,弹出AH,AH的数据存到DH,然后SP指回再给高位低位进行+1。
例题
后入先出。PUSH个数=POP个数;SP不变;PUSH比POP每多一个SP-2,POP比PUSH每多一个SP+2。
注意
- 堆栈操作总是按字进行的。
- 压入指令,SP-2,数据在栈顶,弹出指令正好相反。
- 操作数可以是存储器、寄存器或段寄存器操作数(CS不能用于POP),不能是立即数。
因为CS和IP都只能间接的去写,不能直接从栈里去写。 - PUSH和POP主要用来现场保护和修复,具体类似恢复系统,用来保证调试或中断程序的正常返回
比如要用到AX(只有一个)时,需要用到PUSH AX,调试完之后可以POP AX。
数据交换指令(8/16)
XCHG OP1,OP2功能是交换OP1和OP2的内容。 操作数为通用寄存器或存储器,但不能均为内存单元,且段寄存器和IP不能作为交换指令的操作数。
换码指令(查表指令、翻译指令)
功能内的[BX+AL]是XLAT实现的,实际上[]内不能出现AL。
BX存基地址,AL存偏移量
目标地址传送指令
地址包括段地址(16位)和偏移地址(16位)
注意:
- OP源必须是存储器操作数,OP目必须是16位的通用寄存器。
- 地址传送指令不影响状态标志位
取有效地址EA指令:将源操作数的有效地址EA送到目的操作数,LEA BX,[BX] —>BX不变,因为还是它本身。
指针送寄存器和DS指令:把OP源指定的4个字节内容取出,低地址的两字节送到OP目,高地址的两字节送到DS。
指针送寄存器和ES指令:将OP源四个字节中,低地址的两字节送到OP目,高地址的两字节送到ES。
区分
- 通用寄存器组 包含4 个16 位通用寄存器 AX、BX、CX、DX,用以存放普通数据或地址,也有其特殊用途。如AX(AL)用于输入输出指令、乘除法指令,BX 在间接寻址中作基址寄存器,CX 在串操作和循环指令中作计数器,DX 用于乘除法指令等。
- 指针和变址寄存器 BP、SP、SI 和DI,在间接寻址中用于存放基址和偏移地址。
- 段寄存器 CS、DS、SS、ES 存放代码段、数据段、堆栈段和附加段的段地址。
- 指令指针寄存器IP 用来存放将要执行的下一条指令在现行代码段中的偏移地址。
- 标志寄存器Flags 用来存放运算结果的特征。