×
单片机 > 单片机程序设计 > 详情

中断保护现场

发布时间:2020-06-10 发布时间:
|
对于中断处理程序中使用到的寄存器,如果主程序中也要使用该寄存器就会发生冲突。常见的需要保护的寄存器有A、B、DPTR、PSW和工作寄存器组。
    由于本技能训练的中断处理程序十分简单,对主程序没有影响,所以未进行保护现场,而一般的中断处理程序均需要保护现场。常见的几种保护现场的方法如下:
    (1)累加器A的保护
     累加器A是程序中使用最为频繁的寄存器,中段处理程序中如果需要使用累加器A,就会改变A的数值。这样中断调用返回后,主程序中的输出控制字就被破坏了,造成输出错误。为了防止这种现象的出现,在中断处理程序中首先将需要使用的寄存器压入堆栈保存,中段处理程序完成后再使其弹出堆栈。以流水灯的中断程序为例,这一程序如下:
          K1:PUSH  ACC               ;将累加器A压入堆栈
              MOV   R6,#0FFH         ;中断处理程序
              ...............
 
          K2:POP   ACC           ;从堆栈中弹出数据到累加器A中        
              RETI                ;中断返回
      注意:将累加器A压入堆栈的指令不是PUSH   A,而是PUSH  ACC。这里ACC是汇编语言默认的符号,它代表累加器A的地址0E0H。
     (2)程序状态字的保护
    由于程序状态字寄存器PSW有几个标志位是执行指令时自动设置的,如果子程序中有改变程序状态字寄存器PSW的指令,则一定要将PSW压入堆栈保护。
    例如:主程序指令如下:
          ADD    A,#0FH
          JC      L1
    其中第一条指令会根据运算结果改变进位标志位C的状态,而第二条指令需要根据C的状态决定是否转移。如果执行完第一条指令后发生中断,中断处理程序中有改变了C的状态,这样终端返回後在执行JC  L1 时就会发生错误。尽管在主程序和子程序中并未直接出现PSW ,但是却出现了PSW 寄存器冲突。为了避免这种情况的出现,子程序中只要使用了能影响PSW中某一位的指令,则一定要将PSW压入堆栈保护。
    影响PSW中标志位的指令参考指令表。
    (3)工作寄存器组的保护
      由于并没有PUSH  Rn指令,所以需要将工作寄存器压入堆栈是只能使用地址。例如:要将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.3  RS0  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
     保护方法举例如下:
         PUSH    PSW             ;将PSW压入堆栈
         MOV     PSW,#08H        ;使用第1组工作寄存器组
      .......................    ;中断处理程序
         POP     PSW             ;恢复 PSW
         RET                     ;中断返回
    (4)DPTR的保护
      DPTR是一个常用的地址指针,它是一个16位的寄存器,压入堆栈保护时必须分别将高8位和低8位压入。操作如下: 
       .........................
         PUSH    DPH             ;将DPTR高8位压入堆栈
         PUSH    DPL             ;将DPTR低8位压入堆栈
       ......................... 
         POP     DPL             ;将DPTR低8位弹出堆栈
         POP     DPH             ;将DPTR高8位弹出堆栈       
       .........................
      注意:根据堆栈先进后出的操作原理,先压入的必须后弹出,不得颠倒顺序。
关键字:中断保护现场  寄存器 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会