新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 中斷保護(hù)現(xiàn)場(chǎng)

中斷保護(hù)現(xiàn)場(chǎng)

作者: 時(shí)間:2016-11-17 來源:網(wǎng)絡(luò) 收藏
對(duì)于中斷處理程序中使用到的寄存器,如果主程序中也要使用該寄存器就會(huì)發(fā)生沖突。常見的需要保護(hù)的寄存器有A、B、DPTR、PSW和工作寄存器組。
由于本技能訓(xùn)練的中斷處理程序十分簡(jiǎn)單,對(duì)主程序沒有影響,所以未進(jìn)行保護(hù)現(xiàn)場(chǎng),而一般的中斷處理程序均需要保護(hù)現(xiàn)場(chǎng)。常見的幾種保護(hù)現(xiàn)場(chǎng)的方法如下:
(1)累加器A的保護(hù)
累加器A是程序中使用最為頻繁的寄存器,中段處理程序中如果需要使用累加器A,就會(huì)改變A的數(shù)值。這樣中斷調(diào)用返回后,主程序中的輸出控制字就被破壞了,造成輸出錯(cuò)誤。為了防止這種現(xiàn)象的出現(xiàn),在中斷處理程序中首先將需要使用的寄存器壓入堆棧保存,中段處理程序完成后再使其彈出堆棧。以流水燈的中斷程序?yàn)槔@一程序如下:
K1:PUSHACC;將累加器A壓入堆棧
MOVR6,#0FFH;中斷處理程序
...............
K2:POPACC;從堆棧中彈出數(shù)據(jù)到累加器A中
RETI;中斷返回
注意:將累加器A壓入堆棧的指令不是PUSHA,而是PUSHACC。這里ACC是匯編語言默認(rèn)的符號(hào),它代表累加器A的地址0E0H。
(2)程序狀態(tài)字的保護(hù)
由于程序狀態(tài)字寄存器PSW有幾個(gè)標(biāo)志位是執(zhí)行指令時(shí)自動(dòng)設(shè)置的,如果子程序中有改變程序狀態(tài)字寄存器PSW的指令,則一定要將PSW壓入堆棧保護(hù)。
例如:主程序指令如下:
ADDA,#0FH
JCL1
其中第一條指令會(huì)根據(jù)運(yùn)算結(jié)果改變進(jìn)位標(biāo)志位C的狀態(tài),而第二條指令需要根據(jù)C的狀態(tài)決定是否轉(zhuǎn)移。如果執(zhí)行完第一條指令后發(fā)生中斷,中斷處理程序中有改變了C的狀態(tài),這樣終端返回後在執(zhí)行JCL1 時(shí)就會(huì)發(fā)生錯(cuò)誤。盡管在主程序和子程序中并未直接出現(xiàn)PSW ,但是卻出現(xiàn)了PSW 寄存器沖突。為了避免這種情況的出現(xiàn),子程序中只要使用了能影響PSW中某一位的指令,則一定要將PSW壓入堆棧保護(hù)。
影響PSW中標(biāo)志位的指令參考指令表。
(3)工作寄存器組的保護(hù)
由于并沒有PUSHRn指令,所以需要將工作寄存器壓入堆棧是只能使用地址。例如:要將R6對(duì)應(yīng)的地址壓入堆棧。但是根據(jù)PSW中RS0和RS1的數(shù)值,R6可能對(duì)應(yīng)4格地址,即06H、0EH、16H、1EH,究竟應(yīng)當(dāng)壓哪一個(gè)地址判斷起來比較麻煩。工作寄存器族的設(shè)置則提供了一個(gè)保護(hù)工作寄存器的簡(jiǎn)單方法。
程序設(shè)計(jì)前可以將4格工作寄存器組安排在不同的程序段中,如第0組安排在主程序中使用、第1組安排在外部中斷0中使用等。在外部中斷0的處理程序中首先將PSW壓入堆棧,然后設(shè)置RS1=0、RS0=1,這樣再使用工作寄存器時(shí)就會(huì)直接使用第1組工作寄存器組,而不影響第0組工作寄存器組。中斷處理程序執(zhí)行完后彈出PSW,就直接恢復(fù)了程序中的工作寄存器組。工作寄存器組及其對(duì)應(yīng)地址見表:
工作寄存器組及其對(duì)應(yīng)的地址
PSW.4 RS1PSW.3RS0PSWR0-R7
00#00H第0組00H-07H
01#08H第1組08H-0FH
10#10H第2組10H-17H
11#18H第3組18H-1FH
保護(hù)方法舉例如下:
PUSHPSW;將PSW壓入堆棧
MOVPSW,#08H;使用第1組工作寄存器組
.......................;中斷處理程序
POPPSW;恢復(fù) PSW
RET;中斷返回
(4)DPTR的保護(hù)
DPTR是一個(gè)常用的地址指針,它是一個(gè)16位的寄存器,壓入堆棧保護(hù)時(shí)必須分別將高8位和低8位壓入。操作如下:
.........................
PUSHDPH;將DPTR高8位壓入堆棧
PUSHDPL;將DPTR低8位壓入堆棧
.........................
POPDPL;將DPTR低8位彈出堆棧
POPDPH;將DPTR高8位彈出堆棧
.........................
注意:根據(jù)堆棧先進(jìn)后出的操作原理,先壓入的必須后彈出,不得顛倒順序。


評(píng)論


技術(shù)專區(qū)

關(guān)閉