Thumb指令集之: ARM和Thumb的混合编程
11.10ARM和Thumb的混合编程
11.10.1互交工作基础
Thumb以其较高的代码密度和在窄存储器上的性能,使得它在很多系统中得到广泛应用。但在很多情况下,还是不得不使用ARM指令,这是因为:
①ARM代码比Thumb代码有更快的执行速度;
②ARM处理器的一些特定功能必须由ARM指令实现,其中包括PSR指令、协处理器指令;
③异常发生时,处理器自动进入ARM状态,如果异常处理程序需要使用Thumb指令也必须通用一个ARM程序头(ARMassemblerheader)。
基于以上原因,即使程序需要由Thumb代码实现,也必须通过ARM-Thumb互交(ARM-Thumbinterworking)进入Thumb状态。
ARM-Thumb互交是指对汇编语言和C/C++语言的ARM和Thumb代码进行连接的方法,它进行两种状态(ARM和Thumb状态)间的切换。在进行这种切换时,有时需使用额外的代码,这些代码被称为Veneer。AAPCS定义了ARM和Thumb过程调用的标准。
从一个ARM例程调用一个Thumb例程,内核必须进行状态切换。状态的变化由CPSR的T位来显示。在跳转到一个例程时BX指令可用于ARM和Thumb状态切换,具体用法如下。
在Thumb状态调用ARM例程时,采用:
BXRn;
在ARM状态调用Thumb例程时,采用:
BX{cond}Rn;
其中,Rn可以是r0~r15中的任意寄存器。
这种带状态切换的跳转指令BX,将寄存器Rn的内容拷贝到程序计数器寄存器PC,因此可以实现4G空间的跳转。指令根据寄存器Rn的bit[0]来决定处理器是否进行状态切换,详细内容参见ARM指令一节。
下面是一段ARM程序,该程序调用虚拟的SWI_writeC子程序从存储器的固定地址取出字符串“helloworld”并输出。
AREAHello,CODE,READONLY
SWI_WriteCEQU0 ;软中断调用参数
SWI_ExitEQU11 ;程序退出软中断调用参数
ENTRY
STARTADRr1,TEXT ;取字符串地址
LOOPLDRBr0,[r1],#1 ;取下一字节内容
CMPr0,#0 ;判断是否为字符串尾
SWINESWI_WriteC ;软中断调用打印字符
BENLOOP ;循环
SWISWI_Exit ;软中断调用退出程序执行
TEXT=“HelloWorld”,0a,0d,0
END
下面的代码将上面的ARM代码转换成等价的Thumb代码。
AREAHelloW_Thumb,CODE,READONLY
SWI_WriteCEQU0 ;软中断调用参数
SWI_ExitEQU11 ;程序退出软中断调用参数
ENTRY ;程序入口点
CODE32进入ARM状态
ADRr0,START+1 ;取得Thumb代码入口地址
BXr0 ;进入Thumb代码
CODE16 ;Thumb代码入口点
STARTADRr1,TEXT ;r1->HelloWorld
LOOPLDRBr0,[r1] ;取下一字节内容
ADDr1,r1,#1 ;地址指针加1**T
CMPr0,#0 ;判断是否为字符串尾
BEQDONE ;完成?**T
SWISWI_WriteC ;如果不是字符串尾
BLOOP ;继续循环
DONESWISWI_Exit ;程序退出
ALIGN ;字对齐
TEXTDATA
HelloWorld,0a,0d,00
END
上例中,ARM代码到Thumb代码转换过程中新增加的指令用“**T”标注。
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码