从下面的一个ARM 汇编小程序要弄懂的以下三个问题:
1).在ARM状况转到THUNB状况和BX的运用
2).汇编的架构
3).SWI指令的运用
AREA ADDREG,CO
ENTRY
MAIN
ADR r0,ThunbProg 1 ;(为什么要加1呢?由于BX指令跳转到指定的地址履行程序 时, 若 (BX{cond} Rm)Rm的位[0]为1,则跳转时主动将CPSR中的标志T置位即把方针 代码解释为 Thunb代码)
BX r0
CO
ThunbProg
mov r2,#2
mov r3,#3
add r2,r2,r3
ADR r0,ARMProg
BX ro
CO
ARMProg
mov r4,#4
mov r5,#5
add r4,r4,r5
stop mov r0,#0x18
LDR r1,=0x20026
SWI 0x123456
END
SWI--软中止指令:
SWI指令用于发生软中止,从支持形式变换到管理形式,CPSR保存到管理形式的SPSR中.
SWI{cond} immed_24 ;immed_24为软中止号(服务类型)
运用SWI指令时,一般运用以下两种办法进行传递参数,SWI 异常中止处理程序就可以供给相关的服务,这两种办法均是用户软件协议.SWI异常中止处理程序要经过读取引起软中止的SWI指令,以获得24位当即数.
(1) 指令中的24位当即数指定了用户恳求的服务类型,参数经过通用寄存器传递.
mov r0,#34 ;设置子功用号位34
SWI 12 ;调用12号软中止
(2) 指令中的24位当即数被疏忽,用户恳求的服务类型有寄存器RO的值决议,参数经过其他的通用寄存器传递.
mov r0,#12 ;调用12号软中止
mov r1,#34 ;设置子功用号位34
SWI 0
在SWI异常中止处理程序中,取出SWI当即数的过程为:首要确认引起软中止的SWI指令是ARM指令仍是Thunb指令,这可经过对SPSR拜访得到;然后获得该SWI指令的地址,这可经过拜访LR寄存器得到;接着读出指令,分解出当即数.如如下程序:
T_bit EQU 0X20
SWI_Handler
STMFD SP!,{R0-R3,R12,LR} ;现场维护
MRS R0,SPSR ;读取SPSR
STMFD SP!,{R0} :保存SPSR
TST R0,#T_bit
LDRNEH R0,[LR,#-2] ;若是Thunb指令,读取指令码(16位)
BICNE R0,#0XFF00 :获得Thunb指令的8位当即数
LDREQ R0,[LR,#-4] ;若是ARM指令,读取指令码(32位)
BICEQ R0,#0XFF000000 ;获得ARM指令的24位当即数
....
LDMFD SP!,{R0-R3,R12,PC}^ ;SWI异常中止回来