Register Protection

10.10 Register Protection

One very important rule applies to all interrupt handlers: interrupts must leave the processor in the same state as it was in when the interrupt initiated. Re- member, the idea behind interrupts is that the main program is not aware that they are executing in the background. However, consider the following code:

CLR

C

;Clear carry

MOV

A,#25h

;Load the accumulator with 25h

ADDC A,#10h ;Add 10h, with carry

After the above three instructions are executed, the accumulator will contain a value of 35H.

However, what would happen if an interrupt occurred right after the MOV in- struction? During this interrupt, the carry bit was set and the value of the accu- mulator changed to 40H. When the interrupt finished and control was passed back to the main program, the ADDC would add 10H to 40H, and also add an additional 01H because the carry bit is set. The accumulator will contain the value 51H at the end of execution.

In this case, the main program has seemingly calculated the wrong answer. How can 25H + 10H yield 51H as a result? It does not make sense. A developer that was unfamiliar with interrupts would be convinced that the microcontroller was damaged in some way, provoking problems with mathematical calculations.

What has happened, in reality, is the interrupt did not protect the registers it used. Restated: an interrupt must leave the processor in the same state as it was in when the interrupt initiated.

This means if an interrupt uses the accumulator, it must insure that the value of the accumulator is the same at the end of the interrupt as it was at the begin- ning. This is generally accomplished with a PUSH and POP sequence at the beginning and end of each interrupt handler. For example:

INTERRUPT_HANDLER:

 

PUSH ACC

;Push the initial value of

accumulator

 

;onto stack

 

PUSH PSW

;Push the initial value of

PSW SFR onto stack

MOV A,#0FFh

;Use accumulator & PSW for

whatever you want

ADD A,#02h

;Use accumulator & PSW for

whatever you want

POP PSW

;Restore the initial value of the PSW from

 

;the stack

 

POP ACC

;Restore initial value of the accumulator

 

;from stack

 

10-16

Page 122
Image 122
Texas Instruments MSC1210 manual Register Protection, Push PSW