转移指令及位操作指令
7
• 例:利用子程序调用编写令20H-2AH, 30H-3EH,40H-4FH 三个区域清零的程 序
可编辑版
8
ORG 1000H
MOV SP,#70H
MOV R0,#20H
MOV R2,#0BH
ACALL ZERO
MOV R0,#30H
MOV R2,#0FH
ACALL ZERO
MOV R0,#40H
• 1、已知某单片机监控程序始址为A080H, 问用什么办法是单片机开机后自动执行 监控程序
• 2、已知MA=0500H,问8051单片机执行 如下指令
•
MOV SP ,#70H
• MA:LCALL 8192H
• 堆栈中数据如何变化,PC中内容是什么
可编辑版
11
• 3、已知外部RAM中以3000H为始址的数 据块以零为结束标志,试编程将之传送 到以30H为始址的内部RAM区
LCALL 标号 ;标号表示子程序首地址 ACALL 标号 来调用子程序。
可编辑版
5
(2)返回指令 (2条)
子程序执行完后必须回到主程序,如何返
回呢?只要执行一条返回指令就可以了。
RET
;子程序返回指令
RETI
;中断子程序返回指令
两者不能互换使用。
可编辑版
6
4. 空操作指令(1条)
NOP
可编辑版
可编辑版
17
(2)判位直接寻址位转移指令 JB bit,rel JNB bit,rel JBC bit,rel 第一条指令:如果指定的(bit)=1,则转移,否 则顺序执行,第二条指令功能相反。
同样理解:JB bit,标号 第三条指令是如果指定的(bit)=1,则转移, 并把该位清0,否则顺序执行。
ANL C,bit ANL C,/bit ORL C,bit ORL C,/bit
可编辑版
16
4. 位控制转移指令(5条)
(1)判Cy转移指令
JC rel JNC rel
第一条指令的功能是如果Cy=1就转移,否
则就顺序执行。 第二条指令则和第一条指令相反,即如果
Cy=0就转移,否则就顺序执行。
同样理解: JNC 标号
可编辑版
18
例1:内部RAM的M1和M2单元各有一个 无符号8位二进制数,试编程比较它们的 大小,并把大数送到MAX单元
MOV A, M1 CJNE A, M2,LOOP LOOP: JNC LOOP1 MOV A,M2 LOOP1:MOV MAX,A
可编辑版
19
• 例2:已知外部RAM以2000H开始有一个 数据缓冲区,该缓冲区中数据以回车符 (ASCII码为0DH)为结束标志,试编一 程序把正数送入片内RAM以30H为起始 地址的正数区,把负数送入片内RAM以 50H为起始地址的负数区。(假设输入数 据不超过32个)
21
LOOP:MOV @R1,A INC R1 INC DPTR SJMP NEXT
DONE:END
可编辑版
22
可编辑版
20
ORG 0100H
MOV DPTR, #2000H
MOV R0,#30H
MOV R1,#50H
NEXT: MOVX A, @DPTR
CJNE A,#0DH,COMP
SJMP DONE
COMP:JB ACC.7 ,LOOP
MOV @R0,A
INC R0
INC DPTR
SJMP NEXT 可编辑版
可编辑版
1
2. 条件转移指令(8条)
条件转移指令是指在满足一定条件时进行相对转 移,否则程序继续执行本指令的下一条指令。
(1)判A内容是否为0转移指令(2条)
JZ rel ;如果A=0,则转移,否则顺序执行。 JNZ rel ;如果A≠0,就转移。 我们在编写汇编语言源程序时,可以直接写成: JZ 标号 ;即转移到标号处。 JNZ 标号 ;即转移到标号处
可编辑版
3
(3)减1条件转移指令(2条)
DJNZ Rn,rel DJNZ direct,rel
可编辑版
4
3.子程序调用和返回
(1)调用指令(2条)
LCALL addr16 ACALL addr11
;长调用指令 ;短调用指令
上面两条指令都是在主程序中调用子程序,两者的区别: 对短调用指令,被调用子程序入口地址必须与调用指令的 下一条指令的第一字节在相同的2KB存储区之内。 使用时可以用:
可编辑版
14
2 位变量修改指令(4条)
▪ 位清0指令 : CLR C
CLR bit 例:CLR P1.0 ;即使P1.0变为0
▪ 位置1指令: SETB C
SETB bit 例:SETB P1.0 ;使P.0变为1 位取反指令: CPL C
CPL bit
可编辑版
15
3.位 逻辑运算指令 (4条)
MOV R2,#10H
ACALL ZERO
ZERO: MOV @R0,#00H
INC R0
DJNZ R2,ZERO
RET
END
可编辑版
9
例:从P1口的P1.0管脚输出周期为10个机器 周期的方波 CLR P1.0
LOOP: CPL P1.0 NOP NOP SJMP LOOP
可编辑版
10
• 练习:
控制转移指令
• 1、无条件转移指令:
• 长转移类指令:LJMP addr16
• 绝对转
间接转移指令:JMP @A+DPTR
• 我们在编写汇编语言源程序时,可以直接写成:
LJMP 标号 ;即转移到标号处
AJMP 标号
SJMP 标号
JMP 标号
可编辑版
12
位操作指令
可编辑版
13
1.位传送指令 (2条)
MOV C,bit ;bit →C MOV bit,C ;C →bit
这组指令的功能是实现CY和其它位地址之间的 数据传递。
例:MOV C,P1.0 ;将P1.0的状态送给C。
MOV P1.0,C ;将C中的状态送到P1.0 ;引脚上去。
可编辑版
2
(2)比较转移指令(4条)
CJNE A,#data,rel CJNE A,direct,rel CJNE Rn,#data,rel CJNE @Ri,#data,rel 同样地,使用时,我们可以将rel理解成标号,即: CJNE A,#data,标号 CJNE A,direct,标号 CJNE Rn,#data,标号 CJNE @Ri,#data,标号