传送类指令
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据传送和交换类指令
• (1) 数据传送类指令共29条,它是指令系统中最活跃、使用最 多的一类指令。一般的操作是把源操作数传送到目的操作数 , 即指令执行后目的操作数改为源操作数 ,而源操作数保持不变。 (2)psw寄存器影响:数据传送类指令不影响进位标志CY、半 进位标志AC和溢出标志OV,但当传送或交换数据后影响累加器A 的值时,奇偶标志P的值则按A的值重新设定。
地址 相加=3055H
3055H 66H
A 取出
66H
55H
分析执行下列程序后A的值是多少?
• MOV A, #01H • MOV DPTR, #M2 • MOVC A ,@A+DPTR • M1:RET • M2:DB 0,1,4,9……
• 例:在累加器A中存放有0~9间的某个数,现要求查出该数 的平方数,并数值传回累加器。
MOVX @DPTR,SBUF MOVX @DPTR,R2
MOVX @DPTR,@R1 都是错误的
• 思考:如果要将内部RAM中40H单元中的数据传递到外部 RAM的2000H单元中,应如何解决?试写出相应程序。
•
MOV DPTR,#2000H
•
MOV A,40H
•
MOVX @DPTR,A
四、查表指令(读ROM指令)
例如:设(SP)=60H,(A)=30H,(B)=70H,执行以下指令: PUSH A PUSH B 执行结果为?
• 例如:设(SP)=62H内部RAM60h~62h的内容分别是20h, 23h,01h,执行以下指令后DPTR和SP的值为多少: POP DPH POP DPL
• POP SP
六、字节交换指令(3+1+1)
• MOV direct,Rn
; direct ←(Rn)
30H
30H
Eg:MOV 30H,#33H 33H
XX
33H
31H
30H
30H
Eg:MOV 30H,31H 55H
XX
55H
A Eg:MOV 30H,A 33H
R0 Eg:MOV 30H,@R0 55H
30H XX
30H 33H
地址
55H
30H
•
MOVC @A+DPTR , A
MOVC @A+PC , A
都是错误的。
五、堆栈操作指令
• 堆栈操作指令包含入栈(PUSH)和出栈(POP)。在使用堆栈之 前要首先给堆栈指针SP赋值。
• 指令格式:PUSH direct
•
POP direct
• 操作规则:入栈:指针上移------→数据压入
•
出栈:数据弹出------- →指针下移
• 字节交换指令XCH源操作数有3种;
• 字节交换指令XCH,半字节交换指令XCHD和 累加器高低半字节交换指令SWAP,三种指 令都是以A作为其目的操作数;
小结
➢数据传送类指令有几种类型? • 数据传送类: • MOV 内部数据传送(按目的操作数不同可分为4组15条 • +1条dptr赋值) • MOVC 程序存储器传送(只能读取,不能写入2条) • MOVX 外部数据传(包括读和写操作各2条) • 堆栈操作(入栈和出栈2条) • 交换类指令(字节交换3条且目的操作数只能是A; 半 字节交换,A高低半字节交换)
• 一、内部RAM单元间的数据传递
• (可以根据指令中目标操作数不同进行分类,分为以下4 类) ➢ 以累加器为目的的传送指令 ( 4条) • MOV A,#data ; A ← data • MOV A,direct ; A ←(direct) • MOV A,Rn ; A←(Rn)
• MOV A,@Ri ; A←((Ri))
MOV Rn,A ; Rn ← (A) MOV Rn,direct ; Rn←(direct)
MOV Rn,#data ; Rn← data
A
R2
R2
Eg:MOV R2,A 33H
XX
33H
30H Eg:MOV R2,30H 55H
Eg:MOV R2,#30H 30H
R2 XX R2 XX
R2 55H R2 30H
Eg:MOV A,30H
30H 33H
A
A
结果
XX
33H
Eg:MOV A,#10H 10H
A
A
结果
XX
10H
E.g.: MOV A,R2
R2
A
A
33H
XX
33H
E.g. : MOV A,@R0
地址
R0
55H
55H
78H
A
取出
78H
注意:在使用Ri进行间址寻址时,只能够使用R0和R1。
➢ 以通用寄存器Rn为目的的传送指令:( 3条)
练习:
• 1、设(30h)=40h,(40h)=20h,(20h)=0ffh,p1=55h. 执行以下程序后A,R1,B,40H,30H,10H的值为?:
• MOV R0,#30H • MOV A,@R0 • MOV R1,A • MOV B,@R1 • MOV @R1,P1 • MOV 10H,#20H • MOV 30H,10H
➢ 以直接地址为目的的传送指令:( 5条)
• MOV direct ,#data ; direct ← data
• MOV direct1,direct2 ; direct1 ←(direct2)
• MOV direct,A
; direct ←(A)
• MOV direct ,@Ri ; direct ←((Ri))
元;
3、修正下列指令中的错误,保证指令功能不 变
• (1)MOV A,2000H • (2)MOVX 20H,2000H • (3)MOVC A,2000H • (4)XCH 40H,50H • (5)MOV R0,#90H • MOV A,@R0
Eg:MOV @R1,30H
A 78H 30H 78H
R1(地址) 55H
55H
78H
R1(地址) 55H
55H
78H
Eg:MOV @R1,#30H
R1(地址) 55H
30H 55H
30H
二、数据指针赋值指令(16位数据指针)
• 当要对片外的RAM和I/O接口进行访问时,或进行查表操作时, 通常要对DPTR赋值。DPTR可分为高八位寄存器DPH和低八位寄存 器DPL。 • 指令为: • MOV DPTR, #data16
如何记忆这些指令?
• 对于MOV指令,其目的操作数按A、Rn、direct、@Ri的 顺序书写,则可以记住MOV的15条指令。例如:
•
MOV A,#data/direct/Rn/@Ri
MOV Rn,#data/direct/A
MOV direct,#data/direct/A/Rn/@Ri
MOV @Ri,#data/direct/A
A
内部RAM单元
• 2、低半字节交换指令
•
XCHD A, @Ri ; (A) 3~0 ← →((Ri))3~0
执行指令前
A A7 A6 A5 A4 A3 A2 A1 A0 ((Ri)) D7 D6 D5 D4 D3 D2 D1 D0
指令执行后 A A7 A6
A5 A4 D3
D2 D1 D0
((Ri)) D7 D6 D5 D4 A3 A2 A1 A0
MCS-51单片机指令系统
MCS-51单片机指令系统包括111条指令 按功能可以划分为以下5类:
1. 数据传送和交换指令(29条):mov,xch,push 2. 算术运算指令(24条)add,subb,mul,div 3. 逻辑运算指令(24条)与、或、异或等 4. 控制转移指令(17条) 5. 位操作指令(17条)
• 解决方案:在程序存储器中划出一个区域用于存放0~9的平 方值,比如将代码存放在0400H开始的地方。程序如下:
•
……
MOV DPTR, #0400H
MOVC A , @A+DPTR
……
ORG 0400H
DB 0 ;
DB 1 ;
DB 4 ;
DB 9 ;
DB 16 ;
……
• 注意:我们只能将程序存储器中的数据传出(读出), 而不能将数据传入(写入)程序存储器。因此,语句:
• (3)按数据传送类指令的操作方式,又可把传送类指令分为3种 类型:数据传送、数据交换和堆栈操作,并使用8种助记符:MOV、 MOVX、 MOVC、 XCH、 XCHD、 SWAP、 PUSH及POP。
• 常用助记符: • MOV 单片机内部RAM中的数据传递(经常使用) • MOVX 累加器和单片机外部数据存储器间数据传递 • MOVC 累加器和程序存储器之间的数据传递 • XCH 累加器和某个内部RAM单元进行数据交换 • XCHD 累加器和某个内部RAM单元进行低半字节数据交换 • PUSH 将某个内部RAM单元的数据压入堆栈 • POP 将堆栈内的数据弹出
MOVX MOVX MOVX MOVX
注意:
A, @DPTR A,@Ri
@DPTR,A @Ri,A
;A ←((DPTR))片外 ;A ←((Ri))片外
;(DPTR)片外←(A) ;(Ri)片外←(A)
该指令用于在单片机和外部RAM、扩展I/O口的数据传送
(读和写); 使用Ri时,只能访问低8位地址为00H~FFH地址段;高八位 默认为当前p2口指明的地址;使用DPTR时,能访问0000H ~
• 字节交换指令指内部RAM中的某个单元和累加器A之间进行数 据交换,可以是整个字节,也可以是半个字节。包含3种交换方
式:
• 1、整字节交换指令 ( 指令记忆 )
•
XCH
A, Rn
; (A) ← →(Rn)
•
XCH
A,
direct ; (A) ← →(direct)
•
XCH
A,
@Ri
; (A) ← →((Ri))
注:在学习传送类指令、运算类指令要掌握并注意一下
几种操作数:立即数(#数字)、直接寻址(直接地址如: 50H)、寄存器(R0-R7,B)、累加器A、寄存器间接寻址
(@+R0/R1)
• 数据传送和交换类指令主要有以下几种: • 内部数据传递指令
1. 数据指针(dptr寄存器)赋值指令 2. 片外数据传送指令 3. ROM数据访问指令 4. 栈操作指令 5. 数据交换指令
• 3、累加器A高低半字节的交换指令 • SWAP A
执行前 执行后
A7 A6 A5 A4 A3 A2 A1 A0 A3 A2 A1 A0 A7 A6 A5 A4
例: 假设在执行指令之前(A)= 70H,则在指令执行完后, (A)= 07H。
执行前 执行后
01110000 00000111
• 注意:
2、写出程序实现以下功能?
• (1)将片内ram30h内容送到片外ram100单元; • (2)将片外ram2100单元内容送到片内50单元; • (3)将片外ram2100h单元内容送到片外3000H单
元; • (4)将rom2000h单元内容送到r1; • (5)将rom2000h单元内容送到片外ram1000h单
Eg:将数据指针DPTR指向外部RAM的2000H单元。
MOV DPTR, #2000H
DPTR
DPTR
2000H
XXXX
2000H
Eg:将数据指针DPTR指向存于ROM中的表格首地址。 MOV DPTR,#TABLE
MOV指令的数据传送路线图可以用下图进行描述
三、片外数据传递指令
使用DPTR和Ri进行间接寻址
FFFFH地址段。
应用举例:
• 例: MOV DPTR,#2003H
•
MOV A, #00H
•
MOVX @DPTR,A
• 指令执行过程:
A
DPTR(地址)
00H
2003H
2003H 00H
• 注意:只有累加器A才能把数据传到外部RAM,或接收从外 部数据存储器传回的数据。(即只能用A做源操作数
• 或者目地操作数,A是CPU与片外RAM进行数据交流的中转) 比如:MOVX 20H, @DPTR
• 注意:先入后出原则
• 程序举例:
•
MOV SP , #30H
•
PUSH a; SP ← (SP)+1, 31H←(a)
•
PUSH 60H ; SP ← (SP)+1, 32H←(60H)
•
……
•
POБайду номын сангаас 60H ; 60H ←( 32H), SP ← (SP)-1
•
POP a; a ←(31H), SP ←(SP)-1
(ROM数据传送指令)2条,只能读操作,不能写 • 指令格式:(指令执行时的区别) • MOVC A, @A+DPTR ;A ←((A)+(DPTR)) • MOVC A, @A+PC ;A ←((A)+(PC))
DPTR 3000H
A
Eg:MOV DPTR, #3000H
MOV A, #55H
MOVC A, @A+DPTR
取出
78H
78H
R3 Eg:MOV 30H,R3 33H
30H XX
30H 33H
➢ 以通用寄存器间接地址为目的的传送指令:( 3条)
MOV @Ri,A ; (Ri) ← (A)
MOV @Ri,direct ; (Ri) ←(direct)
MOV @Ri,#data ; (Ri) ← data
Eg. : MOV @R1,A 设(R1)=55h