1楼:匿名用户
在单片机汇编程序中,如果ljmp到子程
序(如果不是调用且用ret返回的话就不能专叫子程序了,)那么属必须再用ljmp跳回来才行,如果是lcall调用,但ljmp跳回,那么将破还堆栈结构,程序就会出现混乱了。有如下关系:
lcall
.......
ret这必须成对出现。
2楼:匿名用户
楼上说的没错 你进入函数时断点的地址入栈了 但是没有ret 你的地址没有出栈 你的堆栈就整体错位了如果你上面的程序 在ljmp loop 前面 加入两个pop指令那就没问题了
单片机中,能否使用ljmp指令从主程序转入子程序或从子程序跳转回主程序,为什么
3楼:匿名用户
这个当复
然是能使用ljmp指令重主程序跳转制到子程序,或从子程序跳回主程序,但一般是不允许这样使用ljmp指令的,很容易造成程序运行混乱。因为调用子程序保护现场要将当前的地址压入堆栈,子程序返回时,会弹出该地址赋值给pc指针。如果使用,必须满足以下条件:
1、跳出跳入成对出现,也就是说,从主程序用ljmp跳转到子程序,那么在子程序中的ret前,必须是用ljmp指令跳回。
2、不成对出现,但是如果子程序是ljmp跳转来的控制,那么在ret前,需要压入返回位置的地址。比如:
主程序:
.....
ljmp sub01
........
con: ;返回地址
......
sub: ;子程序
....
sub01: ;跳转到的地址
....
mov dptr,#con ;返回前处理。
push dph
push dplret
4楼:匿名用户
不能这样bai写程序。
如果这样写了du,程序也zhi会按照指令顺序运行dao,但是很容易出现内
问题,导致程序跑容飞。
由于单片机的ram是有限的,程序在进入子程序之前经常会使用ram来临时存储一些数据,包括sp指针在执行完子程序之后需要跳回的地址信息。也就是堆栈的“压栈”(push)。
子程序执行完后,要执行一个ret指令结束子程序,指针指向的堆栈单元读取堆栈数据,这个过程叫做“出栈”(pop ),然后指针会正常的运行下去。
假如在子程序内直接用ljmp指令跳出到主程序,就会把堆栈压入的数据没有读出,造成数据丢失,sp指针指向的地址没有正确返回,造成堆栈不断增加,直到不够用了就会溢出。
再假如从主程序内直接用ljmp指令跳入子程序,在执行ret退出子程序时,就会造成错误的读出堆栈内的数据。
5楼:匿名用户
绝对不可以
会造成逻辑的混乱,因为堆栈会乱。
call的子程序的最后的返回需用 ret 语句而长转移只能用在本段程序内(如主程序内或子程序内)而步能在2个之间跳转。
6楼:快乐珍惜
如果是bailjmp 跳转du的返回时需要 跳转返回,不能使用zhi ret返回;
如果是call 调用dao子函回数,的返回可以使答用 ret 返回;
主要原因是call 的时候有自动 堆栈 动作,ret 会自动出栈,使栈保持平衡;否则会导致堆栈破坏和堆栈溢出;
满意的话赞一个!
单片机汇编语言,求大神解答,单片机汇编语言,求大神帮忙看下程序什么意思
1楼 单片机没有负数 做完运算后正负由c来表示 单片机汇编语言,求大神帮忙看下程序什么意思 2楼 匿名用户 程序很简单,就是让p1口全高电平一小段时间 执行delay延时子程序所需时间 后,再让p1口全低电平持续20倍的时间,不断重复上述过程。 0000h start mov p1 0ffh 让p1...
单片机程序问题stc双串口,stc89c52单片机怎么实现用两个串口控制两个模块?
1楼 这东西还得自己去多思考,多琢磨 串口通信 由串口1发出至上位机 你上位机是完全没收到数据吗? 波特率,校验位之类的设置对没? 你可以一步一步的来调 先调通串口2 再调串口1 最后联调 2楼 匿名用户 不用示波器光看程序太费劲了,用示波器看看是哪个地方的问题,没有示波器用万用表看看电影值是否变动...
求简单的51单片机c语言程序设计
1楼 凤凰与涅槃射手 机的外部结构 1 dip40 双列直插 2 p0,p1 ,p2,p3 四个8位准双向 i o引脚 作为 i o输入时,要先输出高电平 3 电源 vcc pin40 和地线 gnd pin20 4 高电平复位 reset pin9 10uf 电容接vcc 与reset ,即可实现...