前言:学习8086指令体系中的数据传送类指令
MOV指令
MOV指令将源操作数复制到目的的操作数。格式如下:
mov OPD,OPS
其中,目的操作数的内容会发生改变,而源操作数不会改变。这种数据从右到左的移动与C++或Java中的赋值语句相似。
在几乎所有的汇编语言指令中,左边的操作数是目标操作数,而右边的操作数是源操作数。只要按照如下原则,MOV指令使用操作数是非常灵活的。
mov reg/mem,imm
mov seg/reg/mem,reg
mov seg/reg,mem
mov reg/mem,seg
(reg表示的是通用寄存器;mem表示内存单元;imm是立即数;seg表示的是段寄存器)
内存到内存 单条MOV指令不能直接将数据从一个内存位置传送到另一个内存位置。相反,在将操作数的值赋值给内存操作数之前,必须先将该数值传从给另一个寄存器
1 | mov reg,mem |
MOV指令小结
- 两个存储单元之间不可以直接传送数据。两个内存单元之间不能进行操作,适用于所有操作。
- 目的操作数不能是CS及立即数,CS寄存器的内容是由操作系统给出;同样的IP也不能作为OPD。
- OPD、OPS的位数必须保持一致,同样适用于所有指令。
- 计算机根据寄存器默认其省略的段寄存器,所以指令只要给出偏移地址。
- 在内存和寄存器之间传送字类型数据是高地址和高8位寄存器对应,低地址和低8位寄存器对应。
查表指令XLAT
指令格式:
XLAT TABLE 或 XLAT
指令功能:把待查表格的一个字节内容送到AL累加器中。待查表格存于内存单元,TABLE为待查表格的首地址
执行前,应将待查表格的首地址TABLE先送到BX寄存器中,然后将待查字节与其距表首地址的位移量送给AL
执行后,将有效地址为(BX) + (AL) 的内容单元的内容传送给(AL)。即(AL) <—— ((BX) + (AL))
1 | 设待查表的首地址为1000H,待查字节与表首地址的偏移量为6,则执行前要将首地址送到BX寄存器,位移量送AL寄存器,执行后AL = 88H。 |
**指令中没有出现AL和BX寄存器,在指令中没有出现的寄存器称为隐含寄存器。 **
堆栈指令PUSH和POP
数据进入堆栈的操作称为进栈(PUSH),数据退出堆栈的操作称为出栈(POP)
SP指向栈顶,当数据进栈时,SP做减量调整,即栈顶向低地址调整;数据出栈时,SP做增量调整,即栈顶向高地址调整
在8086中,堆栈的进栈和出栈都是以字为单位,即每次进栈和出栈都是两个字节
指令格式:
PUSH OPD
POP OPD
指令功能:PUSH指令将OPD压入栈,栈顶指针SP自动减2;POP指令将栈顶的一个字数据送到OPD,栈顶指针SP自动加2
OPD必须是16位寄存器,16位内存单元
堆栈操作指令不改变标志位寄存器。堆栈指令多用于保存中间结果,也用于保存子程序或中断现场
例子:
1 | push ax |
假设执行前ax = 4444H,bx = 5555H;则执行完ax = 5555H, bx = 4444H
1 | pop [BX] ; 将栈顶的数据传送给BX寄存器指向两个连续的内存单元 |
标志传送寄存器
标志位送AH指令LAHF
指令格式:LAHF
指令功能:取标志寄存器的低8位传送给AH。该指令不会影响标志寄存器的内容。
AH送标志寄存器指令SAHF
指令格式:SAHF
指令功能:将AH寄存器的内容传送给PSW的低8位。该指令影响PSW中是SF、ZF、AF、PF、CF标志
标志进栈指令PUSHF
指令格式:PUSHF
指令功能:标志寄存器入栈,(SP) <—— (SP) - 2。该指令不会影响标志寄存器的内容
标志出栈指令POPF
指令格式:POPF
指令功能:与PUSHF指令的功能相反,将栈顶的内容送标志寄存器,(SP) < ——(SP) + 2。该指令会影响标志寄存器的内容
- PUSHF和POPF主要用于子程序和中断过程中对PSW内容的保护和恢复
地址传送指令
有效地址指令LEA
指令格式:
LEA OPD,OPS
OPD可为一个16位的通用寄存器,通常为BX,BP,DI,SI。OPD可为变量名、标号或者地址表达式
指令功能:将源操作数的有效地址送给目的寄存器中。该指令不影响标志位
取地址指令LDS及LES
指令格式:
LDS OPD,OPS
LES OPD,OPS
其中OPD是任意的一个16位的寄存器,OPS是存储器地址
指令功能:是将OPS所指向的存储单元的的连续4个字节(32位)的内容分别传送到OPD和DS寄存器或ES寄存器中
LES指令的功能与LDS的指令功能相似,不同的是传送到DS寄存器的地址换到ES寄存器