DPTR,R0,R1什么的,你在多个地方用到了,就进行保护,如果用不到就不用管
汇编子程序的原则是你在调用的时候,如果在其它地方你也用到某个地址的RAM.那就进行保护,每个子程序都要保护
常用的就是R0R1之类,比如DELAY:
PUSH R0 PUSH R1
MOV R0,#100
MOV R1,#100
NEXT:
DJNZ R1,NEXT
DJNZ R0,NEXT
POP R1
POP R0
RET
这就是一个延时程序,这样的话,你在其它的程序中包括中断,再使用R0R1,也同样的PUSH,POP,那么这个程序就不会出问题
假设你整个完整的程序中,只有这一个地方用到R0R1,那么,这个PUSH,POP就是多余的
还有R0-R7这几个地址,默认的情况下,在整个程序地址是固定的,你在任何一个地方修改了R0-R7其中一个的值,它在其它地方的也是会改变的
假设你延时中用到了R0,中断中也用到R0,那么当延时程序被中断打断之后,如果不用PUSH,POP保护R0的话,等到中断中修改了R0之后
RETI返回之后,R0的值就是中断中最后操作的值,那么,你这个延时程序就出错了
你不要都是想着堆栈满不满的,基本不会的,完全可以先不管堆栈的大小问题
专注找你自己代码的问题
|