关于中止处理程序中运用到的寄存器,假如主程序中也要运用该寄存器就会产生抵触。常见的需求维护的寄存器有A、B、DPTR、PSW和作业寄存器组。
因为本技术练习的中止处理程序非常简略,对主程序没有影响,所以未进行维护现场,而一般的中止处理程序均需求维护现场。常见的几种维护现场的办法如下:
(1)累加器A的维护
累加器A是程序中运用最为频频的寄存器,中段处理程序中假如需求运用累加器A,就会改动A的数值。这样中止调用回来后,主程序中的输出操控字就被破坏了,形成输出过错。为了防止这种现象的呈现,在中止处理程序中首先将需求运用的寄存器压入仓库保存,中段处理程序完成后再使其弹出仓库。以流水灯的中止程序为例,这一程序如下:
K1:PUSHACC;将累加器A压入仓库
MOVR6,#0FFH;中止处理程序
……………
K2:POPACC;从仓库中弹出数据到累加器A中
RETI;中止回来
留意:将累加器A压入仓库的指令不是PUSHA,而是PUSHACC。这儿ACC是汇编语言默许的符号,它代表累加器A的地址0E0H。
(2)程序状况字的维护
因为程序状况字寄存器PSW有几个标志位是履行指令时主动设置的,假如子程序中有改动程序状况字寄存器PSW的指令,则必定要将PSW压入仓库维护。
例如:主程序指令如下:
ADDA,#0FH
JCL1
其间第一条指令会依据运算成果改动进位标志位C的状况,而第二条指令需求依据C的状况决议是否搬运。假如履行完第一条指令后产生中止,中止处理程序中有改动了C的状况,这样终端回来後在履行JCL1 时就会产生过错。虽然在主程序和子程序中并未直接呈现PSW ,可是却呈现了PSW 寄存器抵触。为了防止这种状况的呈现,子程序中只需运用了能影响PSW中某一位的指令,则必定要将PSW压入仓库维护。
影响PSW中标志位的指令参阅指令表。
(3)作业寄存器组的维护
因为并没有PUSHRn指令,所以需求将作业寄存器压入仓库是只能运用地址。例如:要将R6对应的地址压入仓库。可是依据PSW中RS0和RS1的数值,R6或许对应4格地址,即06H、0EH、16H、1EH,终究应当压哪一个地址判别起来比较费事。作业寄存器族的设置则供给了一个维护作业寄存器的简略办法。
程序设计前能够将4格作业寄存器组组织在不同的程序段中,如第0组组织在主程序中运用、第1组组织在外部中止0中运用等。在外部中止0的处理程序中首先将PSW压入仓库,然后设置RS1=0、RS0=1,这样再运用作业寄存器时就会直接运用第1组作业寄存器组,而不影响第0组作业寄存器组。中止处理程序履行完后弹出PSW,就直接康复了程序中的作业寄存器组。作业寄存器组及其对应地址见表:
作业寄存器组及其对应的地址
PSW.4 RS1 |
PSW.3RS0 |
PSW |
组 |
R0-R7 |
0 |
0 |
#00H |
第0组 |
00H-07H |
0 |
1 |
#08H |
第1组 |
08H-0FH |
1 |
0 |
#10H |
第2组 |
10H-17H |
1 |
1 |
#18H |
第3组 |
18H-1FH |
维护办法举例如下:
PUSHPSW;将PSW压入仓库
MOVPSW,#08H;运用第1组作业寄存器组
…………………..;中止处理程序
POPPSW;康复 PSW
RET;中止回来
(4)DPTR的维护
DPTR是一个常用的地址指针,它是一个16位的寄存器,压入仓库维护时有必要分别将高8位和低8位压入。操作如下:
…………………….
PUSHDPH;将DPTR高8位压入仓库
PUSHDPL;将DPTR低8位压入仓库
…………………….
POPDPL;将DPTR低8位弹出仓库
POPDPH;将DPTR高8位弹出仓库
…………………….
留意:依据仓库先进后出的操作原理,先压入的有必要后弹出,不得倒置次序。
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/268473.html