数据/地址 传输
数据传送类指令
mov
类似c里面的赋值操作
双目指令
不允许内存
到内存
的赋值传输
不允许段寄存器
到 段寄存器之间
的赋值传输
不允许立即数
到 段寄存器之间
的赋值传输
mov ax,10
mov [100],[100] 不允许
mov ds,ss 不允许
mov ds,12 不允许
xchg
双目指令
交换两块数据的值
不允许存储器
到 存储器
的赋值传输
数据交换效率由于 mov
xchg ah,al
xchg [100],[200] 不允许
XLAT
类似c中的数组
无操作数
通过 寄存器 bx
,al
中的数据计算出内存地址,然后把该地址的值复制给al
用途:键盘的扫描码,需要转为ASCII 码,可以将扫描码做成表,扫描码作下标可以查到对应的 ASCII 码
al<--ds:[bx+al] 类似这个语义
xlat 无操作数
堆栈操作指令
通过 SP
寄存器查看当前 栈 的内存空间
- 进栈 --
push r16
- 出栈 --
pop r16
保存寄存器环境 ,所有寄存器 入栈
- 16 位
pusha
/popa
8086不支持 - 32 位
pushad
/popad
8086不支持
- 16 位
入栈顺序
- PUSHA: 依次把AX,CX,DX,BX,SP,BP,SI,DI等压入栈中
- PUSHAD: 依次把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI等压入栈中
出栈顺序
- POPA: 把栈中的值依次弹到DI,SI,BP,SP,BX,DX,CX,AX等寄存器中
- POPAD: 把栈中的值依次弹到EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX等寄存器中
单个寄存器
push ax 入栈
push bx 出栈
16位下 所有寄存器
pusha
popa
32位下 所有寄存器
pushad
popad
标志寄存器
将当前的标志寄存器保存起来
命令:
//低8位传送
LAHF 加载
SAHF 保存
//16位传送
PUSHF 保存/入栈
POPF 加载//出栈
//32位传送
PUSHFD 保存/入栈
POPFD 加载//出栈
LAHF
AH
←FLAGS
的低字节LAHF
指令将标志寄存器的低字节送寄存器AH
SF/ZF/AF/PF/CF
状态标志位分别送入AH
的第7/6/4/2/0位
,而AH
的第5/3/1
位意
SAHF
FLAGS
的低字节←AH
- SAHF将
AH寄存器
内容送FLAGS
的低字节 - 用AH的第
7/6/4/2/0
位相应设置SF/ZF/AF/ PF/CF
标志
PUSHF
SP
←SP-2
SS:[SP]
←FLAGS
PUSHF
指令将标志寄存器的内容压入堆栈,同时栈顶指针SP减2
POPF
FLAGS←SS:[SP]
SP
←SP+2
POPF
指令将栈顶字单元内容送标志寄存器,同时栈顶指针SP加2
demo: 更改 tf标志位 为1
PUSHF
mov bp,sp
or word ptr[bp+00],0100
popf
地址传送指令
地址传送指令将存储器单元的逻辑地址送至指定的寄存器
- 有效地址传送指令 LEA
- 指针传送指令 LDS和LES
注意不是获取存储器单元的内容
LEA
作用:将存储器操作数的有效地址传送至指定的16位寄存器中
备注:
这个命令可以当作加法使用,虽然我们可以使用add/adc
做加法
但是 add/adc
不会将计算后的值赋给第三
个寄存器
举例:
设定环境:
mov bx,1
mov si,2
LEA:
LEA ax ,[bx + si]
//LEA 相当于算数加法
ax = bx+si
LDS
LDS r16,mem
-> r16←mem
-> DS←mem+2
- LDS指令将主存中mem指定的字(2字节)送至r16
- 并将mem的下一字(2字节)送DS寄存器
LES
LES r16,mem
-> r16←mem
-> ES←mem+2
- LES指令将主存中mem指定的字送至r16
- 并将mem的下一字送ES寄存器
输入输出指令
IN
- 将外设数据传送给CPU内的
AL/AX
IN AL,i8
;字节输入:AL←I/O端口(i8直接寻址)
IN AL,DX
;字节输入:AL←I/O端口(DX间接寻址)
IN AX,i8
;字输入:AX←I/O端口(i8直接寻址)
IN AX,DX
;字输入:AX←I/O端口(DX间接寻址)
OUT
- 将CPU内的AL/AX数据传送给外设
OUT i8,AL
;字节输出:I/O端口←AL(i8直接寻址)
OUT DX,AL
;字节输出:I/O端口←AL(DX间接寻址)
OUT i8,AX
;字输出:I/O端口←AX(i8直接寻址)
OUT DX,AX
;字输出:I/O端口←AX(DX间接寻址)