关于单片机汇编编程

[复制链接]
查看11 | 回复2 | 2010-6-13 19:09:04 | 显示全部楼层 |阅读模式
ORG 0
AJMP BEGIN
BEGIN: MOV DPTR,#TABLE
MAIN: MOV SP,#60H
MOV A,#00H
MOVC A,@A+DPTR
MOV P2,A
MOV P0,A
JNB P3.2,ZL
AJMP BEGIN
ZL: INC DPTR
ACALL DELAY
RET
DELAY: MOV R1,#20
D2: MOV R2,#20
D1: DJNZ R2,D1
DJNZ R1,D2

RET
TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;段码表
DB 01H
;结束符
END
问题:为什么执行完ZL子程序却返回到第二行“AJMP BEGIN",而不是返回到第十行"AJMP MAIN"???????

回复

使用道具 举报

千问 | 2010-6-13 19:09:04 | 显示全部楼层
JNB P3.2,ZL;P3.2为0 时,转标号为ZL的程序运行这个ZL并非子程序 ,如果是,应该用ACALL ZL,子程序结束用RET,返回调用子程序处后面一条继续执行。这里程序 有错。
回复

使用道具 举报

千问 | 2010-6-13 19:09:04 | 显示全部楼层
ZL程序段并非子程序。你后面的RET不是准确的写法。因为JNB P3.2,ZL的意思是此端口为0的话转移。这个转移就是跳转。跳转后你却又写了一个RET。等到程序执行完ACALL DELAY后,下一步就是执行RET。但是,具体回到哪里就不知道了。所以,你如果想在调用一个DELAY后跳转到MAIN的话,可以直接在ACALL DELAY后面加一句AJMP MAIN
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行