8086CPU指令系统——数据传送类指令

数据传送(Data Transfer)类指令是指令系统中用的最多的一类指令,也是条数最多的一类指令,常用于将原始数据、中间运算结果、最终结果及其它信息在CPU(中央处理器)的寄存器和存储器之间进行传送。

数据传输指令分类
在这里插入图片描述
指令格式
在这里插入图片描述

一、通用数据传送指令 MOV

通用数据传送指令(General Purpose Transfer)是所有指令中最基本、最重要的一类,在实际应用程序中,它的使用率也是最高的。
指令格式:MOV dst,src
执行操作:(dst) <—— (src)
标志位:不影响

该指令把源操作数 src 传送给目的操作数 dst,指令执行后源操作数不变,目的操作数被源操作数所替换。传送指令每次可以传送一字节或一个字,它可以实现 CPU 的内部寄存器之间的数据传送、寄存器和内存之间的的数据传送,还可以将立即数送给内存单元或 CPU 内部的寄存器。

MOV 指令的搭配共有 7 种方式(书上)

MOV reg, data/reg/segreg/mem
MOV segreg, reg
MOV mem, reg/data

MOV 指令的搭配共有 9 种方式(讲解)

(1)从累加器到存储器
MOV  [1234H],AX
(2)从存储器到累加器
MOV  AX,[1234H]
MOV AX,ES:[BX][SI]
(3)从存储器或寄存器送段寄存器
MOV  DS,DX
MOV  ES,SS:[BX]
注意:CS不作目的操作数!
(4)从段寄存器送存储器或寄存器
MOV  BX,ES
MOV  AX,CS
(5)从寄存器送寄存器
MOV  AX,BX
MOV  DI,DX
注意:两个寄存器之间传输数据必须宽度相同!
(6)从寄存器送存储器
MOV  [SI],DI
MOV  ES:[BP][SI],DX
(7)从存储器送寄存器
MOV  DX,ES:[BX][SI]
MOV  CX,[BX]
(8)立即数送寄存器
MOV  DX,2847
MOV  BX,OFFSET  TABLE
(9)立即数送存储器
MOV  BYTE PTR MEM,30H
注意:
立即数送存储器时,必须说明存储器的操作类型。
可以用BYTE PTR或WORD PTR说明是字节操作还是字操作。

注意:

  1. 立即数只能作为源操作数,不能作为目的操作数。
  2. 立即数不能直接传送到段寄存器,但可以通过通用寄存器传送。
  3. MOV 指令的两个操作类型必须相同,即两个操作数的位数相同。
  4. CPU 中的寄存器除 IP 外,都可以通过 MOV 指令访问。
  5. CS 只能作为源操作数,不能直接作为目的操作数。
  6. 段寄存器之间不能直接传送数据,两个内存单元之间不能直接传送。

二、交换指令 XCHG

指令格式:XCHG dst, src
执行操作:(dst)<——>(src)
标志位:不影响
该指令把源操作数和目的操作数进行交换。该指令可以实现字节交换,也可以实现子交换,可以实现数据在 CPU 的内部寄存器之间进行交换,也可以实现数据在CPU内部寄存器和存储单元之间进行交换。
XCHG格式:

XCHG reg, reg/mem
XCHG mem, reg

例如:

XCHG   AX,BX
XCHG   AL,BH
XCHG   BX,[1000H]
XCHG   [2100H],DH
XCHG   SI,AX

注意:

  1. 源操作数与目的操作数不能同时为内容单元。
  2. 不能使用 CS、IP 作为操作数。
  3. XCHG 指令不影响标志位。

三、堆操作指令 PUSH 和 POP

1、入栈指令 PUSH
指令格式:PUSH src
执行操作:(SP)<——(SP)-2; ((SP))<——(src)L; ((SP)+1)<——(src)H
标志位:不影响
该指令首先使SP的内容减2,再将 src 推入堆栈。src可以为16位寄存器数或16位存储器数。
入栈指令格式:

PUSH mem16/reg16/segreg

在这里插入图片描述

2、出栈指令 POP
指令格式:POP dst
执行操作:(dst)L<——((SP)); (dst)H<——((SP)+1); (SP)<——(SP)+2
标志位:不影响
该指令首先使栈顶内容弹出到目的操作数 dst,再使SP的内容加2。dst 可以为16位寄存器数或16位存储器数。
出栈指令格式:

POP mem16/reg16/segreg

在这里插入图片描述
注意:

  1. 8086的堆栈操作都是字(16位)操作。
  2. 堆栈指令的操作数只能是存储器和寄存器操作数,而不能是立即数。
  3. 堆栈指令中堆栈指针SP是隐藏的操作数。
  4. 入栈时“先减后压”(SP先减2,再压入操作数),出栈时“先弹后加”(弹出操作数,SP加2)。
  5. CS寄存器可以入栈PUSH,但是不能出栈POP。因为POP CS会改变代码段寄存器CS的内容。

四、累加器专用传送指令XLAT、IN、OUT

1、XLAT(换码指令、查表指令)
指令格式:XLAT
执行操作:(AL)<——((BX)+(AL))
标志位:不影响
该指令通过 AL 和 BX 寄存器进行表格查找,即将累加器 AL 中的一字节转换为内存表格中的数据,表格的偏移地址有 BX 和 AL内容之和确定。
在这里插入图片描述
2、输入指令IN
指令格式:IN AL/AX, port
执行操作:(AL)/(AX)<——(port)
标志位:不影响
数据输入指令,即将一个字节或一个字从输入端口传送到AL或AX寄存器。

3、输出指令OUT
指令格式:OUT port,AL/AX
执行操作:(port)<——(AL)/(AX)
标志位:不影响
数据输出指令,即将AL或AX寄存器中的一个字节或一个字传送到输出端口。

注意:

  1. 8086系统的 I/O指令有两种寻址方式:(a)直接寻址,00H—FFH;(b)寄存器间接寻址,FFH—FFFFH,端口地址由 DX 寄存器进行数据传送。
  2. 只能用累加器 AL/AX 与I/O 端口进行数据传送。

五、地址传送指令LEA、LDS、LES

1、取有效地址指令LEA(Load Effective Address)
指令格式:LEA reg16, mem
执行操作:(reg16)<——offset mem
标志位:不影响
注释:该指令把存储单元内容的有效地址送到指定的寄存器中。
MEM必须是各种寻址方式的存储器操作数;
REG必须是16位的寄存器。
用途:用一个寄存器作内存单元的地址指针。

2、全指针地址传送指令LDS(Load pointer with DS)
指令格式:LDS reg16, mem32
执行操作:(reg16)<——(mem32)、DS<——(mem32)+2
标志位:不影响
注释:该指令把MEM指出的前两个存储单元的内容送入REG中,后两个存储单元的内容送入DS中。
MEM表示双字(四个字节)的各种寻址方式的存储器操作数的首地址。
REG必须是16位的寄存器,但不能是段寄存器。

3、全指针地址传送指令LES(Load pointer with ES)
指令格式:LES reg16, mem32
执行操作:(reg16)<——(mem32)、ES<——(mem32)+2
标志位:不影响
注释:该指令与LDS大致相同,不同之处是以ES代替DS。
通常:指定REG为DI寄存器。

六、标志寄存器传送指令LAHF、SAHF、PUSHF、POPF

1、LAHF(Load AH with Flags)标志位送AH
格式:LAHF
执行的操作:AH ← Flag/PSW的低位字节
在这里插入图片描述
2、SAHF(Store AH into Flags) AH送标志寄存器
格式:SAHF
执行的操作: Flag/PSW的低位字节 ← AH
在这里插入图片描述
3、PUSHF(Push the Flags) 标志进栈
格式:PUSHF
执行的操作:
(SP)<——(SP)-2; ((SP))<——(FLAG)L; ((SP)+1)<——(FLAG)H

4、POPF(Pop the Flags) 标志出栈
格式:POPF
执行的操作:
(FLAG)L<——((SP)); (FLAG)H<——((SP)+1); (SP)<——(SP)+2

PUSHF 指令和 POP 指令分别起保护标志和恢复标志的作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值