数据传送类指令

合集下载

数据传送类指令

数据传送类指令

05
06
不允许直接向段寄存器传送立即数。
该指令不影响标志位。
06
数据传送类指令
例3-12
指出下列指令中的错误 (1)MOV [DI], [SI] (2)MOV DS, 1000H (3)MOV 2000H, AX
(1)两个操作数不能同时为存 储器操作数。
(2)不能直接向段寄存器传送 立即数,正确的指令应为:
(1)在CPU内部寄存器之间 进行数据传送。
例如,MOV BL, AL MOV BX, AX MOV DS, AX
(2)在CPU内部寄存器与存 储器之间进行数据传送。
例如,MOV AX, [1000H] MOV BX, [SI][BX] MOV DATA[BP], ES
(3)将立即数传送给寄存器。 例如,MOV AX, 1234H MOV SI, 1000H
例3-14
数据传送类指令
已知:(BX)=1122H,(DS)=3000H,(31000H)=1234H。执行指令: XCHG BX, [1000H] 源操作数的物理地址为:(DS)×16+1000H=31000H。 指令执行的结果为:(BX)=1234H,(31000H)=1122H。
要实现两个存储单元X与Y之间的数据交换, 可以执行如下指令:
数据传送类指令
例3-15 已知:(DS)=3000H,(32000H)=12H,(32001H)
=34H,(32002H)=56H,(32003H)=78H。执行指令: LDS SI, [2000H]
地址传送指令
1.5 输入输出指令
数据传送类指令
输入输出指令用于在I/O端口与CPU之间传送数据。
MOV AX, 1000H MOV DS, AX (3)立即数不能作为目的操 作数。

数据传送类指令

数据传送类指令
微机原理与接口技术
数据传送类指令
1. 通用数据传送
2. 堆栈操作
3. 地址传送
4. 标志位传送
5. I/O数据传送
传送类指令执行后对标志位都没有影响(除SAHF、 POPF和POPFD外)。
-.通用数据传送指令
指令书写格式
指令功能
MOV REG/MEM/SEG,REG/MEM/SEG/IMM XCHG REG/MEM,REG/MEM XLAT BSWAP REG32
2009年6月2日星期二
8
PUSH/POP指令
PUSH指令:①SP-N→SP; ②16/32/64位的源操作数压入堆栈
源操作数可以是通用寄存器、段寄存器和存储器,N为源操作数的 字节数2或4或8 。 POP指令:①从栈顶弹出操作数到目标操作数;
② SP+N→SP 目标操作数可以是通用寄存器、段寄存器(CS除外)或存储器。
注意:
①不能在两个存储单元之间直接交换数据;
②段寄存器和立即数不能作为操作数。
2009年6月2日星期二
5
(3)查表转换指令XLAT
指令格式:XLAT 功能:完成一个字节的查表转换,将数据段中偏移地址为
BX/ebx/RBX与AL寄存器之和的存储单元的内容送入AL寄存器, 即:[BX+AL]→AL。 例:若(BX)=0100H,(AL)=05H,执行XLAT指令后,(AL)=2CH。 注意:由于AL只有8位,所以表的长度不能超过256字节。
2009年6月2日星期二
10
(3)PUSHAD/POPAD
386新增指令 PUSHAD指令将所有扩展通用寄存器的内容
压入堆栈,压入的顺序是:EAX、ECX、 EDX、EBX、ESP、EBP、ESI、EDI; POPAD弹出的顺序与PUSHAD压入的相反 (弹出到ESP的值被丢弃)。

数据传送类指令

数据传送类指令

【例】: 设内部RAM(30H)=40H,(40H)=10H,(10H)=00H,(P1)=0CAH,分析以 下程序执行后,各单元、寄存器、P2口的内容。
MOV R0,#30H
;R0←30H
MOV A,@R0
;A←((R0))
MOV R1,A
;R1←(A)
MOV B,@R1
;B←((R1))
MOV @R1,P1
;A←00H
MOV @DPTR,A
;((DPTR))←(A)
程序段执行后,(DPTR)=2023H,(30H)=0FH,(A)=00H,(2023H)=00H,表示 把片外RAM 2023H单元的内容0FH送到内部RAM的30H单元,然后把外部RAM 2023H单元和累加器A清0。
若采用R0和R1间接寻址,必须把高8位地址先送到P2口,上述程序段将改为:
单片机原理与应用
助记符有:MOV,MOVX,MOVC,XCH,XCHD,PUSH,POP,SWAP。 格式:MOV [目的操作数],[源操作数] 功能:目的操作数← 源操作数中的数据 源操作数可以是:A、Rn、direct、@Ri、#data 目的操作数可以是:A、Rn、direct、@Ri
注意:一般不影响标志,只有一种堆栈操作可能直接修改程序状态字 PSW。另外,如果目的操作数为ACC,将会影响奇偶标志P。
MOV A,@Ri
A←((Ri)) √ × × × Ri内容指向的地址单元中的内容送到累加器A
【例】: 设外部RAM(2023H)=0FH,执行以下程序段:
MOV DPTR,#2023H ;DPTR←2023H
MOVX A,@DPTR
;A←((DPTR))
MOV 30H,A
;30H←(A)

[信息与通信]MCS-51单片机指令系统-数据传送类指令

[信息与通信]MCS-51单片机指令系统-数据传送类指令

<P1>=0CAH,分析以下程序执行后各单元及寄存
器、P2口的内容.
• MOV R0,#30H
;R0=30H
• MOV A,R0
;A=40H
• MOV R1,A
;R1=40H
• MOV B,R1
;B=10H
• MOV R1,P1
;<40H>
• MOV P2,P1
=0CAH
• MOV

•执行上述指10令H后,#的20结H果为:<R0>=3<0PH2,<>R=10>C=A<HA>=40H,
3.3 MCS-51指令系统
3.3.1 数据传送类指令〔29条〕 传送类指令分成两大类
1. MOV,一般传送 2.Байду номын сангаас非MOV,特殊传送, 如:MOVC、MOVX、PUSH、
POP、 对PSW的X影C响H、XCHD及SWAP.
• 1. 访问片内数据存储器的一般数据传送指令
• 该类指令的功能是实现数在片内RAM单元之间、 寄存器之间、寄存器与RAM单元之间的传送.所 有指令具有统一的格式,其格式如下:
MOV Rn,
A direct
#data
例:若〔60H〕= 30H 执行 MOV R6,60H
结果:〔R6〕= 30H.
3> 以direct 为目的操作数的指令
MOV direct,
A Rn direct1 Ri
#data
例:若〔R0〕=30H,〔30H〕=25H 执行MOV 40H,R0 指令
结果:〔40H〕=25H.
RAM20H单元 • 外部ROM 2000H单元中的内容送到外部

数据传送指令

数据传送指令

3.访问外部RAM的指令
MOVX A, @Ri ;A←外部RAM(读) MOVX @Ri,A ; 外部RAM←A(写)
256个单元的范围,即:0000H—00FFH
MOVX A, @DPTR;A←外部RAM(读) MOVX @DPTR,A ; 外部RAM←A(写)
64KB范围,即:0000H—FFFFH 也作为外部扩展I/O口的操作!
XCH A,Rn
;A
XCH A,DIR ; A
XCH A,@Ri ; A
Rn (DIR) (Ri)
2.半字节交换指令 XCHD XCHD A,@Ri ;A0-3
(Ri)0-3
请看下一节:算术运算指令
4.3.3 堆栈操作指令
1. 进栈 PUSH PUSH DIR
如:PUSH ACC
; ①SP←SP+1 ; ②(SP)←(DIR) ;
2.出栈 POP
POP DIR
; ①(DIR)←(SP),
; ②SP←SP-1
如:POP ACC ;
主要用于保护现场(子程序中)
4.3.4 数据交换指令
1. 字节交换指令 XCH
2. 直接寻址:
MOV A , DIR
;A←(DIR)
MOV DIR, A
;(DIR)←A
MOV Rn, DIR
;Rn←(DIR)
MOV @Ri, DIR
;(Ri)←(DIR)
MOV dir2,DIR1 ;(dir2)←(DIR1)
n: 0,1,2,3,4,5,6,7
i: 0,1
Hale Waihona Puke 3. 间接寻址 MOV A , @Ri MOV @Ri, A MOV dir, @Ri

4-4 指令类型

4-4 指令类型

程序控制类指令
返回地址是转子指令的下一条指令的地址,保 存址、用寄存器存放返回地址或用 堆栈保存返回地址。
程序控制类指令
从子程序转向主程序的指令称为返回指令,其 助记符一般为RET,子程序的最后一条指令一定是 返回指令。返回地址存放的位置决定了返回指令的 格式,通常返回地址保存在堆栈中,所以返回指令 常是零地址指令。
循环移位按是否与进位位一起循环又分为小循 环(不带进位)和大循环(带进位)。
程序控制类指令
程序控制类指令用于控制程序的执行顺序,并 使程序具有测试、分析与判断的能力。因此,它们 是指令系统中一组非常重要的指令,主要包括转移 指令、子程序调用和返回指令等。
程序控制类指令
转移指令又分无条件转移和条件转移两种。 无条件转移又称必转,它在执行时将改变程序 的常规执行顺序,不受任何条件的约束,直接把程 序转向该指令指出的新的位置执行,其助记符一般 为JMP。
运算类指令
移位指令分为算术移位、逻辑移位和循环移位3 类,它们又可分为左移和右移两种。
算术移位的对象是带符号数,在移位过程中必 须保持操作数的符号不变。当左移一位时,如不产 生溢出,则数值×2;而右移一位时,如不考虑因移 出舍去的末位尾数,则数值÷2。
运算类指令
逻辑移位的对象是无符号数,因此移位时不必 考虑符号问题。
指令类型
数据传送类指令
数据传送类指令是最基本的指令类型,主要用 于实现寄存器与寄存器之间,寄存器与主存单元之 间以及两个主存单元之间的数据传送。数据传送类 指令又可以细分为一般传送、堆栈操作和数据交换 指令。
数据传送类指令
一般传送指令具有数据复制的性质,即数据从 源地址传送到目的地址,而源地址中的内容保持不 变。一般传送类指令常用助记符MOV表示。

传送及比较指令总结

传送及比较指令总结

传送及比较指令总结传送指令是计算机系统中常用的一类指令,用于将数据从一个位置移动到另一个位置。

这些指令通常用于数据的复制、转移和重排等任务。

在本文中,我将总结一些常见的传送指令,并比较它们的异同。

1.MOV指令:MOV (Move) 指令用于将数据从一个位置复制到另一个位置。

它可以在寄存器之间、寄存器和内存之间、寄存器和端口之间进行数据的传送。

MOV 指令通常具有两个操作数,一个目标操作数和一个源操作数。

例如,`MOV AX, BX` 将寄存器 BX 中的值复制到寄存器 AX 中。

MOV 指令在大多数计算机体系结构中都是支持的,因为它是一种非常基本和常见的操作。

2.LDR和STR指令:LDR (Load) 和 STR (Store) 指令用于将数据从内存中加载到寄存器或将数据从寄存器存储到内存中。

这些指令主要在ARM架构中使用。

LDR指令将内存中的数据加载到寄存器中,例如,`LDR R0, [R1]` 将 R1 寄存器中的地址所对应的内存单元中的数据加载到 R0 寄存器中。

STR 指令则将寄存器中的数据存储到内存中,例如,`STR R0, [R1]` 将 R0 寄存器中的数据存储到 R1 寄存器中的地址所对应的内存单元中。

3.PUSH和POP指令:PUSH指令用于将数据压入栈中,而POP指令用于从栈中弹出数据。

这两个指令通常用于实现函数调用和中断处理等操作。

PUSH指令将数据放入栈顶,然后栈指针下移;而POP指令则将栈顶数据读取到寄存器中,并将栈指针上移。

例如,`PUSHAX`将AX寄存器中的数据压入栈中,`POPAX`将栈顶数据弹出到AX寄存器中。

4.XCHG指令:XCHG (Exchange) 指令用于交换两个操作数的值。

这个指令可以用于两个寄存器之间的值交换,或者寄存器和内存之间的交换。

例如,`XCHG AX, BX` 将寄存器 AX 和 BX 中的数据进行交换。

XCHG 指令常用于实现数据交换、排序和互斥访问等场景。

arm常用的数据传送指令

arm常用的数据传送指令

ARM指令集中的数据传送指令主要用于在寄存器和内存之间传输数据。

以下是一些常用的数据传送指令:
1. LDR - 加载寄存器指令。

用于从内存加载数据到寄存器。

2. STR - 存储寄存器指令。

用于将数据从寄存器存储到内存。

3. LDRB - 加载字节指令。

用于从内存加载一个字节的数据到寄存器。

4. STRB - 存储字节指令。

用于将一个字节的数据从寄存器存储到内存。

5. LDRH - 加载半字指令。

用于从内存加载一个半字的数据到寄存器。

6. STRH - 存储半字指令。

用于将一个半字的数据从寄存器存储到内存。

7. LDRD - 加载双字指令。

用于从内存加载一个双字的数据到寄存器。

8. STRD - 存储双字指令。

用于将一个双字的数据从寄存器存储到内存。

9. PUSH - 入栈指令。

用于将寄存器的值推送到堆栈中。

10. POP - 出栈指令。

用于从堆栈中弹出值并将其存储到寄存器中。

这些指令可以配合使用 ARM 的地址计算和跳转指令来完成更复杂的内存操作和数据处理任务。

请注意,具体支持的指令可能会因ARM 架构版本和处理器型号而有所不同。

数据传送指令

数据传送指令

数据传送指令数据传送指令包括数据的传送、交换、堆栈数据的压入与弹出,是最基本、使用率最高的一类指令。

助记符有MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP共八种。

1.MOV类指令及功能(16条)这类指令的功能是从源操作数到目的操作数的数据传送。

MOV A, Rn ;Rn→A,寄存器Rn的内容送到累加器AMOV A, direct ;(direct)→A,直接地址中的内容送AMOV A, @Ri ;(Ri)→A,Ri间址的内容送AMOV A, #data ;data→A,立即数送AMOV Rn,, A ;A→Rn,累加器A中的内容送寄存器RnMOV Rn, direct ;(direct)→Rn;直接地址中的内容送RnMOV Rn, #data ;data→Rn;立即数送RnMOV direct, A ;A→(direct),A中的内容送入直接地址中MOV direct, Rn ;Rn→(direct),寄存器内容送入直接地址中MOV direct, direct ;(direct) →(direct),源操作数直接地址的内容送入;目的操作数的直接地址中MOV direct, @Ri ;(Ri)→(direct),Ri间址内容送入直接地址中MOV direct, #data ;data→(direct),立即数送入直接地址中MOV @Ri, A ;A→(Ri),A中内容送到Ri间址单元中MOV @Ri, direct ;(direct)→(Ri),直接地址中内容送入Ri间址单元中MOV @Ri, #data ;data→(Ri),立即数送入Ri间址单元中MOV DPTR, #data16 ;data16→DPTR,16位常数送入数据指针DPTR中,高8 ;位送入DPH,低8位送入DPH,低8位送入DPL中从上述指令可以看出目的操作数有A累加器、Rn寄存器、直接地址direct及间接地址@Ri,源操作数除此之外还多一种立即数data。

3.3 数据传送类指令

3.3 数据传送类指令

⑵ 以工作寄存器Rn为目的字节的传送指令(3条) ① MOV Rn,A ;A→Rn,n=0~7 ② MOV Rn,direct;(direct)→Rn,n=0~7 ③ MOV Rn,#data ;data→Rn,n=0~7
【例3-2】 执行:MOV R1 , #50H 结果: (R1)=?
目的字节 A Rn MOV direct @Ri
④ MOVX @DPTR,A ;(A)→((DPTR))
【例3-7】若(DPTR)=3000H,(3000H)=30H, 执行: MOVX A , @DPTR;
结果: (A)=((DPTR))=30H
【例3-8】若(R1)=48H,(A)=66H, 执行: MOVX @R1, A;
结果: ((R1))=(A)=66H
【例3-6】若(PC)=1000H,(A)=20H,
执行: MOV A,@A+PC;
结果: (A)=((PC)+1+(A))=(1001H+20H)= (1021H)
2、外RAM传送指令(4条)
① MOVX A,@Ri
;((Ri))→(A),i=0、1
② MOVX A,@DPTR ;((DPTR))→(A) ③ MOVX @Ri,A ;(A)→((Ri)),i=0、1
(40H)=? (40H)=18H
⑷ 以寄存器间址为目的字节的传送指令(3条)
目的字节 A Rn MOV direct @Ri
源字节 A Rn direct @Ri # data
① MOV @Ri,A ;A→(Ri),i=0、1 ② MOV @Ri,direct;(direct)→(Ri),i=0、1 ③ MOV @Ri,#data ;data→(Ri),i=0、1

数据传递类指令

数据传递类指令

(数据传递类指令)MOV A,Rn 寄存器传送到累加器 1 1MOV A,direct 直接地址传送到累加器 2 1 MOV A,@Ri 累加器传送到外部RAM(8) 1 1 MOV A,#data 立即数传送到累加器 2 1MOV Rn,A 累加器传送到寄存器 1 1MOV Rn,direct 直接地址传送到寄存器 2 2 MOV Rn,#data 累加器传送到直接地址 2 1 MOV direct,Rn 寄存器传送到直接地址 2 1 MOV direct,direct 直接地址传送到直接地址 3 2MOV direct,A 累加器传送到直接地址 2 1 MOV direct,@Ri 间接RAM 传送到直接地址 2 2 MOV direct,#data 立即数传送到直接地址 3 2 MOV @Ri,A 直接地址传送到直接地址 1 2 MOV @Ri,direct 直接地址传送到间接RAM 2 1 MOV @Ri,#data 立即数传送到间接RAM 2 2 MOV DPTR,#data16 16 位常数加载到数据指针 3 1MOVC A,@A+DPTR 代码字节传送到累加器 1 2 MOVC A,@A+PC 代码字节传送到累加器 1 2 MOVX A,@Ri 外部RAM(8)传送到累加器 1 2 MOVX A,@DPTR 外部RAM(16)传送到累加器 1 2 MOVX @Ri,A 累加器传送到外部RAM(8) 1 2 MOVX @DPTR,A 累加器传送到外部RAM(16) 1 2 PUSH direct 直接地址压入堆栈 2 2POP direct 直接地址弹出堆栈 2 2XCH A,Rn 寄存器和累加器交换 1 1XCH A, direct 直接地址和累加器交换 2 1XCH A, @Ri 间接RAM 和累加器交换 1 1 XCHD A, @Ri 间接RAM 和累加器交换 1 1低4 位字节(算术运算类指令)INC A 累加器加1 1 1INC Rn 寄存器加1 1 1INC direct 直接地址加1 2 1INC @Ri 间接RAM 加1 1 1INC DPTR 数据指针加1 1 2DEC A 累加器减1 1 1DEC Rn 寄存器减1 1 1DEC direct 直接地址减1 2 2DEC @Ri 间接RAM 减1 1 1MUL AB 累加器和B 寄存器相乘 1 4DIV AB 累加器除以B 寄存器 1 4DA A 累加器十进制调整 1 1ADD A,Rn 寄存器与累加器求和 1 1ADD A,direct 直接地址与累加器求和 2 1ADD A,@Ri 间接RAM 与累加器求和 1 1ADD A,#data 立即数与累加器求和 2 1ADDC A,Rn 寄存器与累加器求和(带进位) 1 1 ADDC A,direct 直接地址与累加器求和(带进位) 2 1ADDC A,@Ri 间接RAM 与累加器求和(带进位) 1 1ADDC A,#data 立即数与累加器求和(带进位) 2 1 SUBB A,Rn 累加器减去寄存器(带借位) 1 1 SUBB A,direct 累加器减去直接地址(带借位) 2 1 SUBB A,@Ri 累加器减去间接RAM(带借位) 1 1 SUBB A,#data 累加器减去立即数(带借位) 2 1 (逻辑运算类指令)ANL A,Rn 寄存器“与”到累加器 1 1ANL A,direct 直接地址“与”到累加器 2 1 ANL A,@Ri 间接RAM“与”到累加器 1 1ANL A,#data 立即数“与”到累加器 2 1ANL direct,A 累加器“与”到直接地址 2 1 ANL direct, #data 立即数“与”到直接地址 3 2 ORL A,Rn 寄存器“或”到累加器 1 2ORL A,direct 直接地址“或”到累加器 2 1 ORL A,@Ri 间接RAM“或”到累加器 1 1ORL A,#data 立即数“或”到累加器 2 1ORL direct,A 累加器“或”到直接地址 2 1 ORL direct, #data 立即数“或”到直接地址 3 1 XRL A,Rn 寄存器“异或”到累加器 1 2XRL A,direct 直接地址“异或”到累加器 2 1 XRL A,@Ri 间接RAM“异或”到累加器 1 1 XRL A,#data 立即数“异或”到累加器 2 1XRL direct,A 累加器“异或”到直接地址 2 1 XRL direct, #data 立即数“异或”到直接地址 31CLR A 累加器清零 1 2CPL A 累加器求反 1 1RL A 累加器循环左移 1 1RLC A 带进位累加器循环左移 1 1RR A 累加器循环右移 1 1RRC A 带进位累加器循环右移 1 1SWAP A 累加器高、低4 位交换 1 1(控制转移类指令)JMP @A+DPTR 相对DPTR 的无条件间接转移 1 2 JZ rel 累加器为0 则转移 2 2JNZ rel 累加器为1 则转移 2 2CJNE A,direct,rel 比较直接地址和累加器,不相等转移 3 2CJNE A,#data,rel 比较立即数和累加器,不相等转移 3 2CJNE Rn,#data,rel 比较寄存器和立即数,不相等转移 2 2CJNE @Ri,#data,rel 比较立即数和间接RAM,不相等转移 3 2DJNZ Rn,rel 寄存器减1,不为0 则转移 3 2 DJNZ direct,rel 直接地址减1,不为0 则转移 3 2 NOP 空操作,用于短暂延时 1 1ACALL add11 绝对调用子程序 2 2LCALL add16 长调用子程序 3 2RET 从子程序返回 1 2RETI 从中断服务子程序返回 1 2AJMP add11 无条件绝对转移 2 2LJMP add16 无条件长转移 3 2SJMP rel 无条件相对转移 2 2(布尔指令)CLR C 清进位位 1 1CLR bit 清直接寻址位 2 1SETB C 置位进位位 1 1SETB bit 置位直接寻址位 2 1CPL C 取反进位位 1 1CPL bit 取反直接寻址位 2 1ANL C,bit 直接寻址位“与”到进位位 2 2 ANL C,/bit 直接寻址位的反码“与”到进位位 2 2ORL C,bit 直接寻址位“或”到进位位 2 2 ORL C,/bit 直接寻址位的反码“或”到进位位 2 2MOV C,bit 直接寻址位传送到进位位 2 1 MOV bit, C 进位位位传送到直接寻址 2 2JC rel 如果进位位为1 则转移 2 2JNC rel 如果进位位为0 则转移 2 2JB bit,rel 如果直接寻址位为1 则转移 3 2 JNB bit,rel 如果直接寻址位为0 则转移 3 2 JBC bit,rel 直接寻址位为1 则转移并清除该位2 2(伪指令)ORG 指明程序的开始位置DB 定义数据表DW 定义16 位的地址表EQU 给一个表达式或一个字符串起名DATA 给一个8 位的内部RAM 起名XDATA 给一个8 位的外部RAM 起名BIT 给一个可位寻址的位单元起名END 指出源程序到此为止(指令中的符号标识)Rn 工作寄存器R0-R7Ri 工作寄存器R0 和R1@Ri 间接寻址的8 位RAM 单元地址(00H-FFH) #data8 8 位常数#data16 16 位常数addr16 16 位目标地址,能转移或调用到64KROM 的任何地方addr11 11 位目标地址,在下条指令的2K 范围内转移或调用Rel 8 位偏移量,用于SJMP 和所有条件转移指令,范围-128~+127Bit 片内RAM 中的可寻址位和SFR 的可寻址位Direct 直接地址,范围片内RAM 单元(00H-7FH)和80H-FFH$ 指本条指令的起始位置结束在讲指令系统前我们先来复习一下数制的概念。

lec07 数据传送类指令

lec07 数据传送类指令
* 不影响标志位
* 不能用立即寻址方式
* DST不能是CS
PUSH 1234H
POP CS


堆栈段的特点: • 从较大地址开始分配和使用(数据段、代码段从较小地址开 始分配和使用); • SP指向的存储单元称为“栈顶”,堆栈操作时,数据总是在 “栈顶” 位置存入( “压入”)、取出( “弹出”);
MOV BX, TABLE MOV BX, OFFSET TABLE LEA BX, TABLE LDS BX, TABLE
LES BX, TABLE
; (BX)=0040H ; (BX)=1000H ; (BX)=1000H ; (BX)=0040H ; (DS)=3000H ; (BX)=0040H ; (ES)=3000H
进栈指令:
执行操作:
PUSH SRC
(SP) (SP) – 2 ( (SP)+1, (SP) ) (SRC)
出栈指令:
执行操作:
POP DST
(DST) ( (SP)+1, (SP) )
(SP) (SP) + 2
堆栈:‘先进后出’的存储区,段地址存放在SS中,
SP在任何时候都指向栈顶,进出栈后自动修改SP。 注意: * 堆栈操作必须以字为单位。
例:(AX) = 0BA45H CWD ; (DX)=0FFFFH (AX)=0BA45H CBW ; (AX)=0045H 注意: * 无操作数指令 * 隐含对AL 或AX 进行符号扩展 * 不影响标志位
小结
通用数据传送指令 MOV、XCHG 堆栈操作指令 PUSH、POP 换码指令 XLAT 地址传送指令 LEA、LDS、LES 符号扩展指令 CBW、CWD 作业:P86 2-5,2-10

数据传送类指令

数据传送类指令

MOVX @DPTR,A;(DPTR)←(A)
例:将外部RAM2000H单元的内容送内部RAM30H单 元。
解:MOV DPTR,#2000H
MOVX A, @DPTR
MOV 30H,A
三、程序存储器取数指令
完成从ROM中读取数据并送往累加器A中。
MOVC A, @A+PC;A←((A)+(PC)+1)
功能:以PC作为基址寄存器,A的内容作为无符号数和PC当前值 (下一条指令的第一字节地址)相加后得到一个16位的地址,把 该地址所指的ROM单元内容送到A中。
[例3-14] 已知(A)=30H,执行下列指令后
200OV 78H,A
结果:将ROM中共中央031H单元中的内容送A,然后又送给内部 RAM78H单元。
XCH A, @R1;A←Y,片内20H←X
MOVX @R1,A;片外20H←Y
五、堆栈操作指令
PUSH direct;SP←(SP)+1,(SP)←( direct),压栈指令
POP direct; direct←((SP)),SP←(SP)-1,弹栈指令
PUSH:先将SP的内容加1,再将直接地址单元中的数据存入到了 SP所批示的单元中。
数据传送类指令
指令特点:1、把源操作数传送到目的操作数,指令执行后,源操作数不 变,目的操作数修改为源操作数;2、除传送到了A的指令外,一般不影 响PSW中的标志位;3、涉及到了的助记符:片内RAM:MOV、PUSH、 POP、XCH、XCHD、SWAP 片外RAM:MOVX 片内外ROM:
MOVC
结果:将ROM中8140H单元中的内容(片外)送A中。
四、数据交换指令
1、全字节交换:A与片内RAM单元内容的全字节交换。

2.5.1数据传送类

2.5.1数据传送类

指令书写格式 MOV 目标,源 PUSH 源 POP 目标 XCHG 目标,源 XLAT LEA 目标,源 LDS 目标,源 LES 目标,源 LAHF SAHF PUSHF POPF IN 累加器,端口 OUT 端口,累加器
1、通用数据传送指令 (1)MOV 传送指令 (2)堆栈操作指令(PUSH、POP) (3) 数据交换指令XCHG (4)换码指令XLAT
(1)取有效地址指令LEA (Load effective address) 格式:LEA 目标,源 功能:将源操作数的有效地址EA传送到目标操作数 源操作数:存储器寻址 目的操作数:16位通用寄存器 例如:LEA BX,TABLE
等效:MOV BX,OFFSET TABLE
(2) 指针送寄存器和DS指令——LDS
例如,MOV AL,1000H;指令有类型错误。
(3)除立即方式外,两个操作数不能同在存储器中。
例如,MOV [100],[200H];错误 MOV [100],3;正确
(4)不能改变CS的值。
例如,MOV CS,AX;是错误的
(5)段寄存器赋值不能用立即方式(必须使用通用寄存 器如AX中转 :立即数->AX->段寄存器),段寄存 器间的数据也不能直接传送。
SP
SP
BX 4X8XH 6XBHX
SP
6BH 48H
(3) 数据交换指令XCHG(1B或1W)
格式:XCHG 目标操作数,源操作数
源操作数:通用寄存器、存储单元
目标操作数:通用寄存器或存储单元
例如: XCHG AX,BX XCHG AX,[BX] XCHG AX,DAT2[BX][SI]
注:XCHG DATA1,AX 正确指令
(3)标志压栈指令——PUSHF(字)(Push the flags) 格式:PUSHF 功能:将16位标志寄存器FLAGS内容入栈保护

关于第七讲 数据传送类指令

关于第七讲 数据传送类指令

第七讲数据传送类指令教学方法:讲授法教学目的:1、熟悉数据传送的三种方式及特点2、熟悉ROM数据传送(查表)3、熟练掌握RAM数据传送教学重点、难点:堆栈操作指令、查表指令主要教学内容(提纲):一、数据传送的三种方式二、ROM数据传送三、RAM数据传送复习:1、MCS-51系列指令格式?2、六种寻址方式分别是什么?讲授要点§3-2 数据传送类指令一、内部RAM数据传送类1、一般数据传送指令回忆前述操作数描述符:A,direct,Rn,@Ri,#data,DPTR等。

经排列组合可写出下列指令:MOV A,Rn ;(A)(Rn)以下类似。

MOV A,directMOV A,@RiMOV A,#dataMOV Rn,AMOV Rn,directMOV Rn,#dataMOV direct,AMOV direct,RnMOV direct,directMOV direct,@RiMOV direct,#dataMOV @Ri,AMOV @Ri, directMOV @Ri,#dataMOV DPTR,#data16 ;唯一的16位数据传送指令。

上述指令不影响任何标志位,但PSW的P位除外。

注意:MOV Rn,RnMOV @Ri, @RiMOV Rn, @RiMOV #data, A等指令是非法指令。

2、栈操作指令PUSH directPOP direct不影响任何标志位。

PUSH direct 指令执行中,机器自动进行两步操作:(1)(SP)(SP)+ 1(2)((SP))(direct)例1、设(SP)= 09H,(DPTR)= 0123H,分析:执行PUSH DPLPUSH DPH后,各单元中的内容。

POP direct 指令执行中,机器也自动进行两步操作:(1)(direct)((SP))(2)(SP)(SP)-1例2、设(SP)= 0BH,(0BH)= 01H,(0AH)= 23H执行POP DPHPOP DPL后,各单元中的内容。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3.2.1 数据传送类指令数据传送指令用于实现寄存器与存储器之间、寄存器之间、累加器AL/AX与I/O端口之间、立即数到寄存器或存储器之间的字节或字的传送。

这类指令的共同特点是不影响标志寄存器的内容(SAHF,POPF除外)。

堆栈操作指令、标志位传送指令和地址传送指令也归入这一类中,共14条指令,又可分为4组,如表3.4所示。

1.通用数据传送指令通用数据传送指令包括传送指令MOV、堆栈操作指令PUSH、POP、输入/输出指令(累加器传送指令)、数据交换指令XCHG和查表转换指令XLAT。

这类指令是唯一允许以段寄存器作为操作数的指令(XCHG除外)。

表3.4 数据传送类指令指令类型指令书写格式指令功能通用数据传送指令MOV 目标,源PUSH 源POP 目标XCHG 目标,源XLAT 字节或字传送字压入堆栈字弹出堆栈字节或字交换字节翻译目标地址传送指令LEA 目标,源LDS 目标,源LES 目标,源装入有效地址装入DS寄存器装入ES寄存器标志位传送指令LAHFSAHFPUSHFPOPF 将FR低字节装入AH寄存器将AH内容装入FR低字节将FR内容压入堆域从堆栈弹出FR内容I/O数据传送指令IN 累加器,端口OUT 端口,累加器从端口输入字节或字将字节或字输出到端口(1)MOV 传送指令指令格式:MOV OPD,OPS指令功能:将源操作数OPS传送到目的操作数OPD,即(OPD)→(OPS)。

源操作数OPS可以是8/16位的通用寄存器、段寄存器、存储器中某单元或8/16位的立即数。

(2)PUSH进栈(压入)指令指令格式:PUSH OPS指令功能:将源操作数OPS压入堆栈,即SP–2 → SP,OPS → (SPH,SP)。

源操作数0PS可以是16位通用寄存器、段寄存器或存储器中的数据字,以保证堆栈按“字”操作。

源操作数OPS不能是立即数。

由于堆栈是按“后进先出”方式工作,所以每次执行PUSH指令时,总是首先修改栈指针(S P)–2 → SP (即SP先减2),使之指向新栈顶,然后把源操作数压入堆栈中SP所指示的位置,高字节在较高地址单元,低字节在较低地址单元中(真正的栈顶单元)。

由于堆栈总是按字操作,所以,SP总是指向字地址单元,堆栈段基址由SS确定。

堆栈最大容量为64K。

(3)POP出栈(弹出)指令指令格式:POP OPD指令功能:将堆栈中当前SP所指示的栈顶的一个字传送到指定的目的操作数OPD中,同时修改栈指针,即(SP+1,SP)→ OPD,(SP)+ 2 → SP,出栈操作是进栈操作的逆过程。

目的操作数OPD可以是16位通用寄存器、段寄存器或存储单元,但CS不能作目的操作数。

和进栈指令不同的是,出栈操作时是先将数据弹出送入目标地址,然后修改栈指针,即将S P减2送SP,这时SP向高地址端移动,指向新的栈顶。

(4)XCHG数据交换指令指令格式:XCHG OPD,OPS指令功能:把一个字或字节的源操作数OPS与目的操作数OPD互相交换位置。

即(OPD)→ OPS,(OPS)→ OPD。

源操作数OPS可为通用寄存器或存储器,目的操作数OPD只能为通用寄存器。

因此,交换指令可以在通用寄存器之间、通用寄存器与累加器之间、通用寄存器与存储器之间进行。

段寄存器不能作为操作数。

(5)XLAT查表转换指令(换码指令)指令格式:XLAT 转换表或XLAT指令功能:将[BX]为首址,[AL]为位移量的字节存储器单元中的数据→ AL,即[BX+AL] → AL。

查表转换指令XLAT可用来将一种代码转换成另一种代码,或者说可使累加器中的一个值变换为内存表格中的某一个值。

具体实现是这样的:使用XLAT指令之前必须先在内存(数据段)中建立一个表格,表格的内容就是所需要转换的代码,表格最多不超过256个字节,将表格的起始地址事先装入BX寄存器中,AL中存放所要查找的对象(表中某一项)到表首地址间的位移量。

执行XLAT指令时,就将BX 中的内容和AL中的内容相加作为有效地址,将表格中与该地址相对应的单元中的内容取出并传送到AL中。

也就是说,指令执行后所要查找的对象(即转换后的代码)就在AL中,BX中内容保持不变。

可见,只要改变AL的值即可从表中找到不同的代码。

例:利用XLAT指令将一位十六进制数转换为对应的ASCII码。

为实现这一转换,首先应在内存数据段建立一个表格,表中存放着十六进制数0,1,…,F 的ASCII码,并将表格的首地址置于BX中,AL中置入所要查找的十六进制数距表头的位移量,比如现在要查找表中第5项内容,则AL中应置入4。

实现上述操作的程序如下:DATA SEGMENTTAB DB ‘0 1 2 3 4 5 6 7 8 9 A B C D E F’DATA ENDMOV BX,OFFSET TAB ;变量TAB的有效地址FA → BX,即表示首址MOV AL,4 ;TAB表中第5项的位移量4 → ALXLAT TAB ;([BX+AL])=(TAB+4)=34H → AL上述过程如图3.5所示。

程序中DATA SEGMENT到DATA END之间的语句是十六进制数的ASCII码表。

2.地址传送指令8086/8088指令系统中有3条专门用于传送地址的指令:LEA、LDS和LES。

可用来传送操作数的段地址或偏移地址。

(1)LEA取有效地址指令指令格式:LEA OPD,OPS指令功能:按源操作数OPS提供的寻址方式计算偏移地址(即EA),并将该偏移地址传送到目的操作数OPD所指示的16位寄存器中。

注意:LEA指令中要求源操作数OPS所提供的必须是一个存储器单元地址,而目的操作数OPD必须是一个除段寄存器以外的16位寄存器。

另外,使用LBA指令时应注意它与MOV 指令的区别,MOV指令传送的是源操作数中的内容,而LEA指令传送的是源操作数的有效地址。

注意下面两条指令的区别:MOV AX,[SI] ;将SI所指示的存储单元中的内容送AXLEA AX,[SI] ;将SI所指的存储单元的EA送AX下列两条指令是等价的,都是将变量NUM的EA送SI中。

MOV SI,OFFSET NUM ;将变量NUM的EA送SI中,;OFFSET为数值返回运算符LEA SI,NUM ;与上条MOV指令等效,将NUM的EA送SI;这说明有时可用MOV指令来代替LEA指令。

(2)LDS送偏移地址及数据段首址指令指令格式:LDS OPD,OPS指令功能:(OPS)→ OPD,(OPS+2)→ DS该指令执行时是把从源操作数OPS所指示的连续4个字节(双字)存储器单元中的操作数送到目的寄存器OPD和DS中,其中低位地址的两个字节传送到OPD指示的寄存器中,高位地址的两个字节传送到段寄存器DS中。

可见,LDS指令要求:OPD一定要是一个16位通用寄存器,常用SI寄存器。

OPS所提供的一定要是一个存储器地址,且是一个地址指针,从指针所指示的地址单元开始,连续4个字节单元的内容分别送入OPD和DS中。

(3)LES传送偏移地址及附加数据段首址指令指令格式:LES OPD,OPS指令功能:(OPS)→ OPD,(OPS+2)→ ESLES指令功能与LDS类似,所不同的是将OPS所指示的4个连续单元中的后两个字节(高地址)单元中的内容送入附加数据段寄存器ES中而不是送入DS,前两个字节(低地址)单元中的内容送OPD所指示的16位寄存器中。

3.标志位传送指令标志位传送指令共有4条:LAHF(标志装入AH)、SAHF(AH的内容存入标志寄存器)、PUSHF(标志压入堆栈)和POPF(标志出栈)。

这些都是单字节指令,指令的操作数是隐含的,因此这些指令都是无操作数指令。

通过这些指令的执行,可以读出当前标志寄存器中的内容,也可以对标志寄存器设置新值。

(1)LAHF标志寄存器低字节送AH指令指令格式:LAHF指令功能:把标志寄存器FR中SF,ZF,AF,PF和CF(8080和8085所具有的标志)分别送到AH中第7,6,4,2和0位,AH中第5,3,1位内容未定义,可任意,标志寄存器本身内容不变。

(2)SAHF AH送标志寄存器低字节指令指令格式:SAHF指令功能:SAHF的功能与LAHF指令相反,是将AH中第7,6,4,2和0位状态传送至标志寄存器FR中的SF,ZF,AF,PF和CF位,取代这些标志位原内容,而OF,IF,TF,DF标志不受影响。

可见,通过该指令可以对标志位进行重新设置,所以该指令也叫设置标志指令。

(3)PUSHF标志进栈指令指令格式:PUSHF指令功能:把整个标志寄存器的内容压入堆栈,同时修改栈指针,即SP–2 → SP,该指令执行后不影响标志位。

(4)POPF标志出栈指令指令格式:POPF指令功能:POPF的功能正好与PUSHF相反,是将当前堆栈指针SP所指的一个字传送到标志寄存器FR中,同时修改栈指针即SP+2 → SP。

PUSHF和POPF这两条指令用于人为地保存和恢复标志寄存器,常用过程调用和中断服务程序的开头与结尾,用来保存主程序的状态标志。

这两条指令的另一个用途是用来改变跟踪单步标志TF,8086/8088指令系统中没有能直接改变TF的指令,若要改变TF,可先用PUSHF指令将标志寄存器压入堆栈,然后设法改变栈顶单元中D8位(TF位),然后再用POPF指令把堆栈中修改过的内容送回标志寄存器。

这样,只有TF位被改变,其它标志位不变。

4.输入/输出指令(累加器专用传送指令)输入/输出数据传送指令简称I/O指令,共两条,一条是输入指令IN,另一条是输出指令OUT。

I/O指令用来完成累加器AL/AX与I/O端口问的数据传送,指令中给出I/O端口的地址,当端口地址值≤255时,端口地址由指令中直接给出,当端口地址值≥256时用间接方式,先将端口地址位置于DX中,然后指令中用DX作间址方式表示。

因此,I/O指令有两种格式。

(1)IN输入指令指令格式:直接方式(长格式):IN AL,端口地址;字节(8位)传送IN AX,端口地址;字(16位)传送间接方式(短格式):IN AL,DX ;端口地址放在DX寄存器中IN AX,DX指令功能:将端口地址中的8位或16位数传送到AL或AX中,将端口中的16位数输入时,先将指定端口中的字节数送入AL中,再将端口地址+1,然后将该端口中的字节数送入A H中。

由上可知,IN指令有两种格式,当端口地址为00~FFH时用直接方式,端口地址值包含在指令中;当端口地址为0000~FFFFH时,用间接方式,即先将端口地址放在DX中,指令中用DX代替端口地址。

注意,这时指令的书写形式与寄存器寻址方式相似,但这里实际上是间址方式。

例:IN AL,02FH ;将02FH端口的一个字节数送入ALIN AX,060H ;将060H端口的内容送AL,将061H端口的内容送AHMOV DX,300H ;先将端口地址300H送人DX中IN AL,DX ;将300H端口的内容送入AL中(2)OUT输出指令指令格式:直接方式:OUT端口地址,AL ;字节(8位)输出OUT端口地址,AX ;字(16位)输出间接方式:OUT DX,AL ;DX中为端口地址OUT DX.AX指令功能:将累加器(AL/AX)中的内容输出传送到指定的I/O端口中。

相关文档
最新文档