|
|
DPTR,R0,R1什么的,你在多個(gè)地方用到了,就進(jìn)行保護(hù),如果用不到就不用管
匯編子程序的原則是你在調(diào)用的時(shí)候,如果在其它地方你也用到某個(gè)地址的RAM.那就進(jìn)行保護(hù),每個(gè)子程序都要保護(hù)
常用的就是R0R1之類,比如DELAY:
PUSH R0 PUSH R1
MOV R0,#100
MOV R1,#100
NEXT:
DJNZ R1,NEXT
DJNZ R0,NEXT
POP R1
POP R0
RET
這就是一個(gè)延時(shí)程序,這樣的話,你在其它的程序中包括中斷,再使用R0R1,也同樣的PUSH,POP,那么這個(gè)程序就不會(huì)出問(wèn)題
假設(shè)你整個(gè)完整的程序中,只有這一個(gè)地方用到R0R1,那么,這個(gè)PUSH,POP就是多余的
還有R0-R7這幾個(gè)地址,默認(rèn)的情況下,在整個(gè)程序地址是固定的,你在任何一個(gè)地方修改了R0-R7其中一個(gè)的值,它在其它地方的也是會(huì)改變的
假設(shè)你延時(shí)中用到了R0,中斷中也用到R0,那么當(dāng)延時(shí)程序被中斷打斷之后,如果不用PUSH,POP保護(hù)R0的話,等到中斷中修改了R0之后
RETI返回之后,R0的值就是中斷中最后操作的值,那么,你這個(gè)延時(shí)程序就出錯(cuò)了
你不要都是想著堆棧滿不滿的,基本不會(huì)的,完全可以先不管堆棧的大小問(wèn)題
專注找你自己代碼的問(wèn)題
|
|