- 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
- LDRNEH R0,[LR,#-2]
- BICNE R0,R0,#0xFF00
- LDREQH R0,[LR,#-4]
- BICNE R0,R0,#0xFF00000
-
- LDMFD SP!,{R0-R3,R12,PC}
-
- B START
-
- END
这段代码我想问当运行到"LDREQH R0,[LR,#-4]"这行时,LR的值应该是多少,我在ADS里面看到R14始终为0,那么LR,#-4又是哪个地址,还有BICNE R0,R0,#0xFF00000,应该是吧R0的低20bit~27bit全部清零,但我发现并没有清零、
这是一段 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指令中的立即数。
谢谢楼上,我刚才看书,书上说LR有个功能就是当发生异常时LR保存异常发生的返回地址,和返回子程序的类似,就是说LR保存的是发生异常时的下一条指令的地址,那么[code]的意思是否就是把发生异常时的下一条指令的地址的上一条指令,也就是发生异常的那条指令的地址中的值给R0??