This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

>> convert to RR not RRC

Hi,

I need to put a statement in a interrupt routine to shift a variable right one-bit. Like this:

dat >>=1;

It generated assembly code like this:

MOV A,dat
CLR C
RRC A
MOV dat,A

What statement in C language sould be written to complete the shift operation but not effect the "C,carry" bit?

This is to save the "PUSH PSW", "POP PSW" instruction in my ISR. The inline assembly statement is not good to me, since I am not familar with it.

Thanks, John

Parents
  • "2.PUSH and POP cost total 48 cycle on my system, ..."

    Given your tight timing budget, writing the whole ISR in assembly seems really to be your best way.

    The context saving/restore code can be effectively optimized if you use banked registers. By selecting the ISR bank in RS1:RS0 you save 8 push/pop instructions. If your ISR handler can be written using only the 8 banked registers, you don't even need to set up local variables, since the ISR banked regs will hold their value between interrupts.

    About the RR/RRC:
    Using

        CLR C
        RRC A
    


    takes one program byte less than

        RR  A
        ANL A, #0x7F
    


    ... and you can always save the CLR C by preceding the RRC A with an operation that guarantees leaving the carry cleared.

Reply
  • "2.PUSH and POP cost total 48 cycle on my system, ..."

    Given your tight timing budget, writing the whole ISR in assembly seems really to be your best way.

    The context saving/restore code can be effectively optimized if you use banked registers. By selecting the ISR bank in RS1:RS0 you save 8 push/pop instructions. If your ISR handler can be written using only the 8 banked registers, you don't even need to set up local variables, since the ISR banked regs will hold their value between interrupts.

    About the RR/RRC:
    Using

        CLR C
        RRC A
    


    takes one program byte less than

        RR  A
        ANL A, #0x7F
    


    ... and you can always save the CLR C by preceding the RRC A with an operation that guarantees leaving the carry cleared.

Children
No data