热门搜索 :
考研考公

...嵌入汇编程序运行到RET总是返回到程序开始执行,子程序为清51RAM程序...

发布网友 发布时间:2024-10-24 11:23

我来回答

1个回答

热心网友 时间:2024-11-10 13:49

这是牵扯C51单片机内部RAM多用问题,牵扯到寄存器R0---R7,堆栈区问题。
程序调用子程序时,把返回主程序时执行指令的地址存入堆栈内(内部RAM),堆栈地址由sp指定,如果你把内部RAM清零了,子程序返回时,返回地址就为0x0000H,即从新转入程序入口。
MOV R0,#255
CLR A
IDATA_LOOP: MOV @R0,A
DJNZ R0,IDATA_LOOP
就是这一段程序把返回地址清除为0x0000hH。
这段程序要谨慎使用,它会把寄存器R0----R7,的内容也同时清零了,
除非你知道寄存器和堆栈区地址在内部RAM哪两段区间;可以分段清零;
还有一种方法,把寄存器地址设置在00h--07h区间,进入该子程序时对返回地址进行保护,方法是
POP R1
POP R2
MOV R0,#255
MOV R3 ,#248 //注意00h---07h不清零,它已经指定寄存器区R0---R7
CLR A
IDATA_LOOP: MOV @R0,A
DEC R0
DJNZ R3,IDATA_LOOP
PUSH R2
PUSH R1
把返回地址存入R1,R2进行保护,操作完成再返还堆栈,至少内部00h,01h,02h,03h不清零
这只适用于主程序调用,如果出现子程序调用或者中断调用(程序嵌套)就要保护的多了,
最好的方法还是不对寄存器区和堆栈区清零。
我一般使用寄存器组区在内部RAM:00h---1fh,堆栈区在20h---3fh;小一点可以在20h---2fh
选择,系统默认寄存器为组0,00h---07h;堆栈区从08h开始,你可以不设置,选择默认,注意堆栈区上限。
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
Top