在使用T版本的ARM内核的处理器时,经常要使用ARM/Thum交互工作,总结了一些需要注意的问题:编写汇编被调过程、编译时应该注意的问题、ARM/Thumb间的相互调用。
一.编写汇编被调过程
如果需要交互工作,则所编写的函数应该遵循ATPCS标准。
1.叶函数(函数内不包括函数的调用)
使用BX LR返回。
2.非叶函数
(1)在入口处保护返回地址(lr)以及寄存器(r0-r7,r8-r12(ARM))
(2)返回前恢复保护的寄存器
(3)使用BX返回
二.编译时应该注意的问题
1.编译用于交互工作的ARM汇编代码
armasm -32 -apcs /interwork
2.编译用户交互工作的Thumb汇编代码
armasm -16 -apcs /interwork
***说明:
(1)关于汇编代码,也可在程序中使用CODE32或CODE16命令明确告知汇编程序下面的代码是ARM代码还是Thumb代码,这样在汇编时则无需使用-32、-16选项
(2)当然也可在单个汇编原文件中混合使用ARM以及Thumb代码,这是需要使用CODE32以及CODE16命令,并且需要注意状态的切换,使用BX Rn,根据Rn的Bit[0]来确定目标是ARM代码还是Thumb代码
3.编译用于交互工作的ARM C代码
armcc -apcs /interwork
4.编译用于交互工作的Thumb C代码
tcc -apcs /interwork
***说明:基于ADS1.2
三.ARM/Thumb之间的相互调用
交互的调用遵循以下原则:
一.编写汇编被调过程
如果需要交互工作,则所编写的函数应该遵循ATPCS标准。
1.叶函数(函数内不包括函数的调用)
使用BX LR返回。
2.非叶函数
(1)在入口处保护返回地址(lr)以及寄存器(r0-r7,r8-r12(ARM))
(2)返回前恢复保护的寄存器
(3)使用BX返回
二.编译时应该注意的问题
1.编译用于交互工作的ARM汇编代码
armasm -32 -apcs /interwork
2.编译用户交互工作的Thumb汇编代码
armasm -16 -apcs /interwork
***说明:
(1)关于汇编代码,也可在程序中使用CODE32或CODE16命令明确告知汇编程序下面的代码是ARM代码还是Thumb代码,这样在汇编时则无需使用-32、-16选项
(2)当然也可在单个汇编原文件中混合使用ARM以及Thumb代码,这是需要使用CODE32以及CODE16命令,并且需要注意状态的切换,使用BX Rn,根据Rn的Bit[0]来确定目标是ARM代码还是Thumb代码
3.编译用于交互工作的ARM C代码
armcc -apcs /interwork
4.编译用于交互工作的Thumb C代码
tcc -apcs /interwork
***说明:基于ADS1.2
三.ARM/Thumb之间的相互调用
交互的调用遵循以下原则: