0%

X86指令体系中的数据传送类指令

前言:学习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
2
mov reg,mem
mov mem,reg

MOV指令小结

  1. 两个存储单元之间不可以直接传送数据。两个内存单元之间不能进行操作,适用于所有操作
  2. 目的操作数不能是CS及立即数,CS寄存器的内容是由操作系统给出;同样的IP也不能作为OPD
  3. OPD、OPS的位数必须保持一致,同样适用于所有指令。
  4. 计算机根据寄存器默认其省略的段寄存器,所以指令只要给出偏移地址
  5. 在内存和寄存器之间传送字类型数据是高地址和高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
2
3
4
push ax
push bx
pop ax
pop bx

假设执行前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寄存器