本次主要学习分支和循环结构汇编程序的编写与调试。
在51单片机的汇编语言中设计分支和循环程序主要是采用条件转移指令来实现的。
本次涉及的主要转移指令有JMP,JC,JNC,DJNC。JMP是无条件转移指令,JC是判Cy转移指令,以PSW中的进位标志Cy作为检测条件,根据Cy的情况决定是否转移。具体转移流程见下图。
JC转移指令
“JC转移指令流程图”
JNC转移指令
“JNC转移指令流程图”
DJNZ转移指令
“DJNZ转移指令流程图”
练习:数据块求和(运用循环、16位加法运算)。
要求:计算数据块(30H至37H)中,8个8位二进制数的和,最终结果放入R1、R0中。
老师给了两组数据块数值:
case1:01H,02H,03H,04H,05H,06H,07H
case2:0FFH,0FFH,0FFH,01H,02H,03H,04H,05H
首先我们分析题目画出流程图:
“数据块求和流程图”
然后写出程序:
ORG 30H
MOV 30H,#01H
MOV 31H,#02H
MOV 32H,#03H
MOV 33H,#04H
MOV 34H,#05H
MOV 35H,#06H
MOV 36H,#07H
MOV 37H,#08H
MOV R0,#07H ;设置循环次数
MOV R1,#31H ;循环起始位置
MOV R2,#00H ;暂定和的高八位数值
MOV A,30H
LOOP: CLR C
ADD A,@R1
JNC OVER ;Cy位为0,则跳过高八位加1
INC R2
OVER: INC R1
DJNZ R0,LOOP ;循环判定R0 = 0
MOV R0,A
MOV A,R2
MOV R1,A
END
需要注意的一点是最后将结果送R0,R1的时候,R2是不能直接送R0的,需要借助A进行传送。
运行结果:
case1:R1 = 00,R0 = 24
case2:R1 = 03,R0 = 0C
这只是本题的一种设计思路,思路不唯一,就不一一列举了。