8086指令系统之数据传送指令

介绍8086CPU汇编指令的数据传送指令:

  1. 通用数据传送指令
  2. 输入输出指令
  3. 地址目标传送指令
  4. 标志传送指令

通用数据传送指令

MOV传送指令

MOV:move

指令格式:MOV 目的, 源

指令功能:目的操作数源操作数

注意:

  1. CS不能作为目的操作数
  2. 立即数不能做目的操作数
  3. 指令中至少要有一项明确说明传送的是字节还是字
  4. 注意对段寄存器的保护

PUSH进栈指令

指令格式:PUSH 源

指令功能:将源操作数推入堆栈

注意:

  1. 源操作数可以是16位通用寄存器、段寄存器或者存储器中的数据字,但不能是立即数
  2. 执行PUSH操作后,,再将源操作数压入SP所指示的位置上

POP出栈指令

指令格式:POP 目的

指令功能:把当前SP所指的一个字送到目的操作数中

注意:

  1. 目的操作数可以是16位通用寄存器、段寄存器或储存单元,但不能是CS
  2. 每执行一次出栈操作,先将SP指向的数据送到目的操作数,再SP+2,SP向高地址方向移动,指向新的栈顶

XCHG交换指令

XCHG:exchange

指令格式:XCHG 目的, 源

指令功能:源操作数和目的操作数相交换

注意:交换可以在寄存器之间、寄存器与储存器之间进行,但是段寄存器不饿能作为操作数,也不能直接交换两个存储单元中的内容

XLAT表转换指令

%todo

输入输出指令

IN输入指令

指令格式:IN AL, 端口地址(读入一字节)或IN AX, 端口地址(读入一个字)

当端口地址大于0FFH时,必须先将端口地址MOV入DX中,再使用DX作为端口地址进行输入

btw,IN指令也可以用符号表示地址:

1
2
ATOD EQU 54H
IN AL,ATOD

这里是将54H端口的内容读入AL中

OUT输出指令

指令格式:OUT 端口地址/DX, AL/AX

地址目标传送指令

这是一类专用于传送地址码的指令,可以用来传送操作数的段地址和偏移地址

LEA取有效地址指令

指令格式:LEA 目的, 源

指令功能:取源操作数地址的偏移量,送到目的操作数

注意:源操作数必须是存储单元,目的操作数是一个除段寄存器之外的16位寄存器

例:下面两条指令是等价的

1
2
LEA BX, TABLE
MOV BX, OFFSET TABLE

LDS将双字指针送到寄存器和DS指令

指令格式:LDS 目的, 源

指令功能:从源操作数指定的存储单元中,取出一个4字节地址指针,送进目的寄存器DS和指令中指定的目的寄存器中

注意:源操作数必须是存储单元,目的操作数必须是16位寄存器,常用SI寄存器,但不能用段寄存器

例:设DS=1200H,(12450H)=F346H, (12452H)=0A90H;执行指令LDS SI, [450H]后,则SIF346H,DS0A90H

LES将双字指针送到寄存器和ES指令

指令格式:LES 目的, 源

指令功能:与LDS基本相同,但段寄存器位ES,目的操作数常用DI

标志传送指令

LAHF标志送到AH指令

LAHF: Load AH from Flags

指令格式:LAHF

指令功能:把标志寄存器的SF、ZF、AF、PF、CF传送到AH寄存器的相应位

SAHF AH送标志寄存器指令

SAHF: Store AH into Flags

指令格式:SAHF

指令功能:把AH内容存入标志寄存器。指令功能与LAHF相反

PUSHF 标志入栈指令

PUSHF: Push Flags onto Stack

指令格式:PUSHF

指令功能:把整个标志寄存器的内容推入堆栈,并使SPSP-2

POPF 标志出栈指令

POPF: Pop Flags off Stack

指令格式: POPF

指令功能:把SP所指的一个字传送给标志寄存器FLAGS,并使SPSP+2