一、同一个文件下arm调用thumb并且返回:
AREA EXAMPLE,CODE,READONLY
CODE16 ;thumb 代码
ThumbSeg
MOV R0,#10
BX LR ;返回到arm状态
ENTRY ;程序入口处
CODE32
Start
MOV R0,#1
ADR R1,ThumbSeg + 1
MOV LR,PC ; 保存返回地址
BX R1 ; 切换到thumb状态
MOV R0,#20
NOP ; 空操作
END
二、两个文件下arm调用thumb并且返回:
注意此时用的是BL进行跳转,因为中间要经历一个veneers
1、arms.s文件,内容为:
AREA EXAMPLE,CODE,READONLY
IMPORT ThumbSeg ;导入thumb标号
ENTRY ;程序入口处
CODE32
Start
MOV R0,#1
BL ThumbSeg ; 切换到thumb状态,注意用的是BL,内部会经历一个veneers
MOV R0,#20
NOP