单片机中,能否使用LJMP指令从主程序转入子程序或从子程序跳转回主程序,为什么

单片机中,能否使用LJMP指令从主程序转入子程序或从子程序跳转回主程序,为什么... 单片机中,能否使用LJMP指令从主程序转入子程序或从子程序跳转回主程序,为什么 展开
 我来答
zhxiufan
2018-07-05 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38385
国家科技进步奖

向TA提问 私信TA
展开全部
这个当然是能使用LJMP指令重主程序跳转到子程序,或从子程序跳回主程序,但一般是不允许这样使用LJMP指令的,很容易造成程序运行混乱。因为调用子程序保护现场要将当前的地址压入堆栈,子程序返回时,会弹出该地址赋值给PC指针。如果使用,必须满足以下条件:
1、跳出跳入成对出现,也就是说,从主程序用LJMP跳转到子程序,那么在子程序中的RET前,必须是用LJMP指令跳回。
2、不成对出现,但是如果子程序是LJMP跳转来的控制,那么在RET前,需要压入返回位置的地址。比如:
主程序:
.....
LJMP  SUB01
 ........
CON: ;返回地址
......
SUB: ;子程序
....
SUB01: ;跳转到的地址
....
MOV DPTR,#CON ;返回前处理。
PUSH DPH
PUSH DPL
RET
张哥小技术
推荐于2018-04-14 · TA获得超过324个赞
知道小有建树答主
回答量:178
采纳率:87%
帮助的人:93万
展开全部
不能这样写程序。
如果这样写了,程序也会按照指令顺序运行,但是很容易出现问题,导致程序跑飞。
由于单片机的RAM是有限的,程序在进入子程序之前经常会使用RAM来临时存储一些数据,包括SP指针在执行完子程序之后需要跳回的地址信息。也就是堆栈的“压栈”(PUSH)。
子程序执行完后,要执行一个RET指令结束子程序,指针指向的堆栈单元读取堆栈数据,这个过程叫做“出栈”(pop ),然后指针会正常的运行下去。
假如在子程序内直接用LJMP指令跳出到主程序,就会把堆栈压入的数据没有读出,造成数据丢失,SP指针指向的地址没有正确返回,造成堆栈不断增加,直到不够用了就会溢出。
再假如从主程序内直接用LJMP指令跳入子程序,在执行RET退出子程序时,就会造成错误的读出堆栈内的数据。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wgq930
2016-10-10 · TA获得超过2262个赞
知道大有可为答主
回答量:4926
采纳率:51%
帮助的人:1932万
展开全部
绝对不可以
会造成逻辑的混乱,因为堆栈会乱。

CALL的子程序的最后的返回需用 RET 语句

而长转移只能用在本段程序内(如主程序内或子程序内)
而步能在2个之间跳转。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
快乐珍惜6
2016-10-09 · TA获得超过343个赞
知道小有建树答主
回答量:109
采纳率:0%
帮助的人:89万
展开全部
如果是ljmp 跳转的返回时需要 跳转返回,不能使用 ret返回;
如果是call 调用子函数,的返回可以使用 ret 返回;
主要原因是call 的时候有自动 堆栈 动作,ret 会自动出栈,使栈保持平衡;否则会导致堆栈破坏和堆栈溢出;

满意的话赞一个!
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式