C51单片机汇编语言

请教各位;我写的一段汇编程序:alarm:clrp0.0ret我使用的是条件判跳指令jbp3.5,alarm,当程序执行到ret之后,程序指针pc却每次都跑到0(程序开头... 请教各位;我写的一段汇编程序:
alarm:
clr p0.0
ret

我使用的是条件判跳指令jb p3.5,alarm,当程序执行到ret之后,程序指针pc却每次都跑到0(程序开头)那里了,这是怎么回事?
我感觉程序应该是继续向下执行才对
展开
 我来答
意法半导体(中国)投资有限公司 2023-06-12
展开全部
MAIN: MOV SP,#50H MOV DPTR,#TAB;读入字模指针 MOV 30H,DPL; 存起来 ;堆栈低8位 MOV 31H,DPH ;堆栈高8位 MOV 32H,30H;再记录指针,留作移动了多少位的判断 用。 MOV 3H,31H ;3H记录字模数据的高位地址 INC 3H;3H高位地址+5,表示数据有5X256列之多。 ROL: MOV R2,#01H;设扫描次数 INI1: MOV DPL,30H;这段是扫描一次32列 MOV DPH,31H MOV R4,#32 MOV R3,#0 LOP1 P1,R3 CLR A MOVC A,@A+DPTR MOV P0,A INC DPTR CLR A MOVC A,@A+DPTR MOV P2,A INC DPTR CAL DELAY INC R3 DJNZ R4,LOP1 DJNZ R2,INI1;这条预留扫描次数用可以调整速度 MOV DPL,3…
还是别说话SN
2008-11-12 · TA获得超过708个赞
知道小有建树答主
回答量:333
采纳率:50%
帮助的人:168万
展开全部
你用的是跳转指令进入程序段,而不是子程序调用,所以不能用RET返回,只能同样跳回去

用LCALL或者ACALL命令调用子程序时会把当前的程序地址压入堆栈当前点,在遇到RET指令时就会把保存的断点地址弹回PC寄存器,继续调用之前的执行,但是JMP系列指令不会保存断点地址,所以RET时就会把堆栈当前点数据装入PC,上电后RAM中未初始化的单元都是0,所以就会把0装入PC,于是程序就回到0地址了。
意法半导体(中国)投资有限公司
2023-06-12 广告
单片机是一种集成电路芯片。又称单片微控制器,是把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。一块芯片就成了一台计算机。特点是体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。 单... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
aihuidaodi
2008-11-12 · TA获得超过1314个赞
知道小有建树答主
回答量:1066
采纳率:0%
帮助的人:450万
展开全部
ret 是子程序返回指令,他是配合CALL 用的。
CALL 是调用子程序的语句。
你把RET拿掉就会往下执行了。
多看看指令吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友fc51b10
2008-11-12 · TA获得超过3435个赞
知道小有建树答主
回答量:999
采纳率:0%
帮助的人:748万
展开全部
ACALL
LCALL

JMP
AJMP
LJMP

跳转 跟 调用子程序 要弄明白.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tianhj2001
2008-11-12 · TA获得超过189个赞
知道小有建树答主
回答量:409
采纳率:0%
帮助的人:183万
展开全部
你的指令出错了,当你运行JB跳转时,他不是子程序跳转,而是直接跳转到你指向的地址,不是象CALL语句那样调用是子程序,而当你将ALARM程序执行完后,在执行RET语句的时候,你就可能跳到从你堆栈中取出的两个数据组成的地址,这个地址是可能改变的,如果你的语句很短,没有调用子程序,那就可能从堆栈中取出的数字组成的地址0000h,那就是回到程序的最开始执行的地方。所以当你执行完ALARM之后你应该用JMP语句跳转到你需要到的地方!!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
罗门大佬
2008-11-12 · TA获得超过1523个赞
知道小有建树答主
回答量:320
采纳率:0%
帮助的人:434万
展开全部
并不是每次都跑到00H,ret指令的功能是把PC指针从栈堆里出来,它是配合LCALL和ACALL使用,因为LCALL和ACALL的功能是把PC指针先入栈,再跳转,所以PC指针在栈堆里,还要RET指令返回。而你的是条件跳转指令,功能是跳到目的程序段,要返回可以用SJMP或LJMP
例如:
jb p3.5,alarm
next:
mov a,#0
。。。。。
alarm:
clr p0.0
SJMP next
这样就返回了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
总之之
2008-11-12
知道答主
回答量:20
采纳率:0%
帮助的人:9.1万
展开全部
RET是子程序返回指令,它只是用在子程序里,主函数里不会有这个指令出现的,所以把它放在主函数里当然会出错啦
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式