概述
数据传送(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说明是字节操作还是字操作。
注意:
- 立即数只能作为源操作数,不能作为目的操作数。
- 立即数不能直接传送到段寄存器,但可以通过通用寄存器传送。
- MOV 指令的两个操作类型必须相同,即两个操作数的位数相同。
- CPU 中的寄存器除 IP 外,都可以通过 MOV 指令访问。
- CS 只能作为源操作数,不能直接作为目的操作数。
- 段寄存器之间不能直接传送数据,两个内存单元之间不能直接传送。
二、交换指令 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
注意:
- 源操作数与目的操作数不能同时为内容单元。
- 不能使用 CS、IP 作为操作数。
- 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
注意:
- 8086的堆栈操作都是字(16位)操作。
- 堆栈指令的操作数只能是存储器和寄存器操作数,而不能是立即数。
- 堆栈指令中堆栈指针SP是隐藏的操作数。
- 入栈时“先减后压”(SP先减2,再压入操作数),出栈时“先弹后加”(弹出操作数,SP加2)。
- 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寄存器中的一个字节或一个字传送到输出端口。
注意:
- 8086系统的 I/O指令有两种寻址方式:(a)直接寻址,00H—FFH;(b)寄存器间接寻址,FFH—FFFFH,端口地址由 DX 寄存器进行数据传送。
- 只能用累加器 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 指令分别起保护标志和恢复标志的作用。
最后
以上就是贤惠火车为你收集整理的8086CPU指令系统——数据传送类指令的全部内容,希望文章能够帮你解决8086CPU指令系统——数据传送类指令所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复