<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 中斷保護現場(chǎng)

中斷保護現場(chǎng)

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


評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>