| x51架構(gòu)使用一個(gè)硬件堆棧為CALL指令存儲(chǔ)返回地址,也用于PUSH和POP指令的臨時(shí)存儲(chǔ)。使用這些指令的8051應(yīng)用程序必須把堆棧指針設(shè)置到一個(gè)不允許其它變量使用的存儲(chǔ)區(qū)域。 對(duì)于傳統(tǒng)的8051,必須定義一個(gè)堆棧段,堆?臻g必須按下面的方法保留。這種定義也適用于擴(kuò)展的8051和251,而一般情況下,這些控制指令也可以在其它區(qū)域設(shè)置堆棧。 | STACK | SEGMENT | IDATA | | | | RSEG | STACK | ; 選擇堆棧段 | | | DS | 10h | ; 保留16個(gè)字節(jié)的空間 | 然后,你必須在程序的開始初始化堆棧指針。 | CSEG | AT | 0 | ; 復(fù)位向量 | | | JMP | STARTUP | ; 跳轉(zhuǎn)到啟動(dòng)代碼 | | STARTUP: | | | ; 在復(fù)位時(shí)執(zhí)行的代碼 | | | MOV | SP, #STACK - 1 | ; 裝入堆棧指針 | 對(duì)于Philips 80C51MX或者Intel/Atmel WM 251,可以定義一個(gè)堆棧段,而且必須按下面的方法保留堆?臻g。 | STACK | SEGMENT | EDATA | | | | RSEG | STACK | ; 選擇堆棧段 | | | DS | 100h | ; 保留256個(gè)字節(jié)的空間 | 然后,你必須在程序的開始初始化堆棧指針。 | CSEG | AT | 0 | ; 復(fù)位向量 | | | JMP | STARTUP | ; 跳轉(zhuǎn)到啟動(dòng)代碼 | | STARTUP: | | | ; 在復(fù)位時(shí)執(zhí)行的代碼 | | ;為Philips 80C51MX設(shè)置堆棧 | | | ORL | MXCON, #0x02 | ; 使能擴(kuò)展的堆棧 | | | MOV | SPE, #HIGH (STACK - 1) | ; 裝入堆棧高字節(jié) | | | MOV | SP, #LOW (STACK - 1) | ; 裝入堆棧低字節(jié) | | | | | | | 為Intel/Atmel WM 251設(shè)置堆棧 | | | MOV | DR60, #STACK - 1 | ; 裝入堆棧指針 | 如果你要使匯編接口到C,你可能不需要設(shè)置堆棧。這在C啟動(dòng)代碼中已經(jīng)為你做好了。 |