数据/地址 传输

数据传送类指令

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 寄存器查看当前 栈 的内存空间

  1. 进栈 --push r16
  2. 出栈 --pop r16
  3. 保存寄存器环境 ,所有寄存器 入栈

    • 16 位 pusha/popa 8086不支持
    • 32 位 pushad/popad 8086不支持

入栈顺序

  • 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

  1. AHFLAGS的低字节
  2. LAHF指令将标志寄存器的低字节送寄存器AH
  3. SF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位意

SAHF

  1. FLAGS的低字节←AH
  2. SAHF将AH寄存器内容送FLAGS的低字节
  3. 用AH的第7/6/4/2/0位相应设置SF/ZF/AF/ PF/CF标志

PUSHF

  1. SPSP-2
  2. SS:[SP]FLAGS
  3. PUSHF指令将标志寄存器的内容压入堆栈,同时栈顶指针SP减2

POPF

  1. FLAGS←SS:[SP]
  2. SPSP+2
  3. POPF指令将栈顶字单元内容送标志寄存器,同时栈顶指针SP加2

demo: 更改 tf标志位 为1

PUSHF
mov bp,sp
or word ptr[bp+00],0100
popf

地址传送指令

  1. 地址传送指令将存储器单元的逻辑地址送至指定的寄存器

    • 有效地址传送指令 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  
  1. LDS指令将主存中mem指定的字(2字节)送至r16
  2. 并将mem的下一字(2字节)送DS寄存器

LES

LES r16,mem
-> r16←mem
-> ES←mem+2
  1. LES指令将主存中mem指定的字送至r16
  2. 并将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间接寻址)
Last modification:December 17, 2018
如果觉得我的文章对你有用,请随意赞赏