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的值就是中斷中最后操作的值,那么,你這個延時程序就出錯了
你不要都是想著堆棧滿不滿的,基本不會的,完全可以先不管堆棧的大小問題
專注找你自己代碼的問題
|