ARM7 关于LR寄存器值的问题

zdy2005   2009-3-3 22:58 楼主
  1. T_bit        EQU                0x20
  2.                
  3.                 AREA        Example1,CODE,READONLY
  4.                 ENTRY
  5.                 CODE32
  6. START        LDR                SP,=0x40003F00
  7.                 STMFD        SP!,{R0-R3,R12,LR}
  8.                 MRS                R0,SPSR
  9.                 STMFD        SP!,{R0}
  10.                 TST                R0,#T_bit
  11.                 LDRNEH        R0,[LR,#-2]
  12.                 BICNE        R0,R0,#0xFF00
  13.                 LDREQH        R0,[LR,#-4]
  14.                 BICNE        R0,R0,#0xFF00000
  15.                
  16.                 LDMFD        SP!,{R0-R3,R12,PC}
  17.                
  18.                 B                START
  19.                
  20.                 END

这段代码我想问当运行到"LDREQH        R0,[LR,#-4]"这行时,LR的值应该是多少,我在ADS里面看到R14始终为0,那么LR,#-4又是哪个地址,还有BICNE        R0,R0,#0xFF00000,应该是吧R0的低20bit~27bit全部清零,但我发现并没有清零、

回复评论 (3)

这是一段 SWI异常中断处理程序
T_bit    EQU        0x20
        
        AREA    Example1,CODE,READONLY
        ENTRY
        CODE32
START    LDR        SP,=0x40003F00
        STMFD    SP!,{R0-R3,R12,LR}
        MRS        R0,SPSR
        STMFD    SP!,{R0}
        TST        R0,#T_bit  //判断SWI指令是ARM指令,还是THUMB指令 Z=0为THUMB指令,Z=1为ARM指令

        LDRNEH    R0,[LR,#-2]    //读取16位SWI指令码
                BICNE    R0,R0,#0xFF00  

        LDREQH    R0,[LR,#-4]      //读取32位SWI指令码
        BICNE    R0,R0,#0xFF00000  //应该为BICEQ R0,R0,#0xFF00000         
        LDMFD    SP!,{R0-R3,R12,PC}
        
        B        START

       END

BICNE    R0,R0,#0xFF00 和 BICNE    R0,R0,#0xFF00000  是取出SWI指令中的立即数。

点赞  2009-3-4 13:54
谢谢楼上,我刚才看书,书上说LR有个功能就是当发生异常时LR保存异常发生的返回地址,和返回子程序的类似,就是说LR保存的是发生异常时的下一条指令的地址,那么[code]的意思是否就是把发生异常时的下一条指令的地址的上一条指令,也就是发生异常的那条指令的地址中的值给R0??
点赞  2009-3-5 20:37
是的,异常处理后总要返回的吧。
点赞  2009-3-6 12:29
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复