8086指令系统之数据传送指令
介绍8086CPU汇编指令的数据传送指令:
- 通用数据传送指令
- 输入输出指令
- 地址目标传送指令
- 标志传送指令
通用数据传送指令
MOV传送指令
MOV:move
指令格式:MOV 目的, 源
指令功能:目的操作数
注意:
- CS不能作为目的操作数
- 立即数不能做目的操作数
- 指令中至少要有一项明确说明传送的是字节还是字
- 注意对段寄存器的保护
PUSH进栈指令
指令格式:PUSH 源
指令功能:将源操作数推入堆栈
注意:
- 源操作数可以是16位通用寄存器、段寄存器或者存储器中的数据字,但不能是立即数
- 执行
PUSH
操作后,,再将源操作数压入SP所指示的位置上
POP出栈指令
指令格式:POP 目的
指令功能:把当前SP所指的一个字送到目的操作数中
注意:
- 目的操作数可以是16位通用寄存器、段寄存器或储存单元,但不能是CS
- 每执行一次出栈操作,先将SP指向的数据送到目的操作数,再
SP+2,SP向高地址方向移动,指向新的栈顶
XCHG交换指令
XCHG:exchange
指令格式:XCHG 目的, 源
指令功能:源操作数和目的操作数相交换
注意:交换可以在寄存器之间、寄存器与储存器之间进行,但是段寄存器不饿能作为操作数,也不能直接交换两个存储单元中的内容
XLAT表转换指令
%todo
输入输出指令
IN输入指令
指令格式:IN AL, 端口地址
(读入一字节)或IN AX, 端口地址
(读入一个字)
当端口地址大于0FFH时,必须先将端口地址MOV入DX中,再使用DX作为端口地址进行输入
btw,IN指令也可以用符号表示地址:
1 | ATOD EQU 54H |
这里是将54H端口的内容读入AL中
OUT输出指令
指令格式:OUT 端口地址/DX, AL/AX
地址目标传送指令
这是一类专用于传送地址码的指令,可以用来传送操作数的段地址和偏移地址
LEA取有效地址指令
指令格式:LEA 目的, 源
指令功能:取源操作数地址的偏移量,送到目的操作数
注意:源操作数必须是存储单元,目的操作数是一个除段寄存器之外的16位寄存器
例:下面两条指令是等价的
1 | LEA BX, TABLE |
LDS将双字指针送到寄存器和DS指令
指令格式:LDS 目的, 源
指令功能:从源操作数指定的存储单元中,取出一个4字节地址指针,送进目的寄存器DS和指令中指定的目的寄存器中
注意:源操作数必须是存储单元,目的操作数必须是16位寄存器,常用SI寄存器,但不能用段寄存器
例:设DS=1200H,(12450H)=F346H, (12452H)=0A90H;执行指令LDS SI, [450H]
后,则SI
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
指令功能:把整个标志寄存器的内容推入堆栈,并使SP
POPF 标志出栈指令
POPF: Pop Flags off Stack
指令格式: POPF
指令功能:把SP所指的一个字传送给标志寄存器FLAGS,并使SP