发布网友 发布时间:2023-05-07 03:18
共1个回答
热心网友 时间:2023-11-28 14:12
不能这样写程序。如果这样写了,程序也会按照指令顺序运行,但是很容易出现问题,导致程序跑飞。由于单片机的RAM是有限的,程序在进入子程序之前经常会使用RAM来临时存储一些数据,包括SP指针在执行完子程序之后需要跳回的地址信息。也就是堆栈的“压栈”(PUSH)。子程序执行完后,要执行一个RET指令结束子程序,指针指向的堆栈单元读取堆栈数据,这个过程叫做“出栈”(pop),然后指针会正常的运行下去。假如在子程序内直接用LJMP指令跳出到主程序,就会把堆栈压入的数据没有读出,造成数据丢失,SP指针指向的地址没有正确返回,造成堆栈不断增加,直到不够用了就会溢出。再假如从主程序内直接用LJMP指令跳入子程序,在执行RET退出子程序时,就会造成错误的读出堆栈内的数据。追问你这说的是什么呀,你有看我的问题吗,我哪里从主程序跳子程序和从子程序跳主程序了,我那本来就是完全不同的两个程序。
热心网友 时间:2023-11-28 14:12
不能这样写程序。如果这样写了,程序也会按照指令顺序运行,但是很容易出现问题,导致程序跑飞。由于单片机的RAM是有限的,程序在进入子程序之前经常会使用RAM来临时存储一些数据,包括SP指针在执行完子程序之后需要跳回的地址信息。也就是堆栈的“压栈”(PUSH)。子程序执行完后,要执行一个RET指令结束子程序,指针指向的堆栈单元读取堆栈数据,这个过程叫做“出栈”(pop),然后指针会正常的运行下去。假如在子程序内直接用LJMP指令跳出到主程序,就会把堆栈压入的数据没有读出,造成数据丢失,SP指针指向的地址没有正确返回,造成堆栈不断增加,直到不够用了就会溢出。再假如从主程序内直接用LJMP指令跳入子程序,在执行RET退出子程序时,就会造成错误的读出堆栈内的数据。追问你这说的是什么呀,你有看我的问题吗,我哪里从主程序跳子程序和从子程序跳主程序了,我那本来就是完全不同的两个程序。