Thumb指令集之: ARM和Thumb的混合编程

时间:2013-09-30来源:网络

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”标注。

1 2 3 4 5 6

关键词: Thumb指令集 ARM 混合编程 Veneer AAPCS

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版