单片机中,能否使用LJMP指令从主程序转入子程序或从子程序跳转回主程序,为什么
展开全部
这个当然是能使用LJMP指令重主程序跳转到子程序,或从子程序跳回主程序,但一般是不允许这样使用LJMP指令的,很容易造成程序运行混乱。因为调用子程序保护现场要将当前的地址压入堆栈,子程序返回时,会弹出该地址赋值给PC指针。如果使用,必须满足以下条件:
1、跳出跳入成对出现,也就是说,从主程序用LJMP跳转到子程序,那么在子程序中的RET前,必须是用LJMP指令跳回。
2、不成对出现,但是如果子程序是LJMP跳转来的控制,那么在RET前,需要压入返回位置的地址。比如:
主程序:
.....
LJMP SUB01
........
CON: ;返回地址
......
SUB: ;子程序
....
SUB01: ;跳转到的地址
....
MOV DPTR,#CON ;返回前处理。
PUSH DPH
PUSH DPL
RET
1、跳出跳入成对出现,也就是说,从主程序用LJMP跳转到子程序,那么在子程序中的RET前,必须是用LJMP指令跳回。
2、不成对出现,但是如果子程序是LJMP跳转来的控制,那么在RET前,需要压入返回位置的地址。比如:
主程序:
.....
LJMP SUB01
........
CON: ;返回地址
......
SUB: ;子程序
....
SUB01: ;跳转到的地址
....
MOV DPTR,#CON ;返回前处理。
PUSH DPH
PUSH DPL
RET
展开全部
不能这样写程序。
如果这样写了,程序也会按照指令顺序运行,但是很容易出现问题,导致程序跑飞。
由于单片机的RAM是有限的,程序在进入子程序之前经常会使用RAM来临时存储一些数据,包括SP指针在执行完子程序之后需要跳回的地址信息。也就是堆栈的“压栈”(PUSH)。
子程序执行完后,要执行一个RET指令结束子程序,指针指向的堆栈单元读取堆栈数据,这个过程叫做“出栈”(pop ),然后指针会正常的运行下去。
假如在子程序内直接用LJMP指令跳出到主程序,就会把堆栈压入的数据没有读出,造成数据丢失,SP指针指向的地址没有正确返回,造成堆栈不断增加,直到不够用了就会溢出。
再假如从主程序内直接用LJMP指令跳入子程序,在执行RET退出子程序时,就会造成错误的读出堆栈内的数据。
如果这样写了,程序也会按照指令顺序运行,但是很容易出现问题,导致程序跑飞。
由于单片机的RAM是有限的,程序在进入子程序之前经常会使用RAM来临时存储一些数据,包括SP指针在执行完子程序之后需要跳回的地址信息。也就是堆栈的“压栈”(PUSH)。
子程序执行完后,要执行一个RET指令结束子程序,指针指向的堆栈单元读取堆栈数据,这个过程叫做“出栈”(pop ),然后指针会正常的运行下去。
假如在子程序内直接用LJMP指令跳出到主程序,就会把堆栈压入的数据没有读出,造成数据丢失,SP指针指向的地址没有正确返回,造成堆栈不断增加,直到不够用了就会溢出。
再假如从主程序内直接用LJMP指令跳入子程序,在执行RET退出子程序时,就会造成错误的读出堆栈内的数据。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
绝对不可以
会造成逻辑的混乱,因为堆栈会乱。
CALL的子程序的最后的返回需用 RET 语句
而长转移只能用在本段程序内(如主程序内或子程序内)
而步能在2个之间跳转。
会造成逻辑的混乱,因为堆栈会乱。
CALL的子程序的最后的返回需用 RET 语句
而长转移只能用在本段程序内(如主程序内或子程序内)
而步能在2个之间跳转。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果是ljmp 跳转的返回时需要 跳转返回,不能使用 ret返回;
如果是call 调用子函数,的返回可以使用 ret 返回;
主要原因是call 的时候有自动 堆栈 动作,ret 会自动出栈,使栈保持平衡;否则会导致堆栈破坏和堆栈溢出;
满意的话赞一个!
如果是call 调用子函数,的返回可以使用 ret 返回;
主要原因是call 的时候有自动 堆栈 动作,ret 会自动出栈,使栈保持平衡;否则会导致堆栈破坏和堆栈溢出;
满意的话赞一个!
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询