Thumb指令集之: ARM和Thumb的混合编程
arm_function();
printf("And goodbye from Thumb World\n");
return (0);
}
/*********************
*armsub.c *
**********************/
#include <stdio.h>
void arm_function(void)
{
printf("Hello and Goodbye from ARM world\n");
}
使用下面的命令对程序进行编译连接。
① 编译生成带互交的Thumb代码。
armcc --thumb -c -g --apcs /interwork -o thumbmain.o thumbmain.c
② 编译生成带互交的ARM代码。
armcc -c -g --apcs /interwork -o armsub.o armsub.c
③ 连接目标文件。
armlink thumbmain.o armsub.o -o thumbtoarm.axf
另外,可以使用--info选项使连接器输出由于互交所增加的代码大小。
armlink armsub.o thumbmain.o -o thumbtoarm.axf --info veneers
输出信息如下所示。
Adding Veneers to the image
Adding TA veneer(4 bytes, Inline) for call to'arm_function'from thumbmain.o(.text).
Adding AT veneer (8 bytes, Inline) for call to '__0printf' from armsub.o(.text).
Adding AT veneer (8 bytes, Inline) for call to '__rt_lib_init' from kernel.o(.text).
Adding AT veneer (12 bytes,Long) for call to'__rt_lib_shutdown'from kernel.o(.text).
Adding TA veneer (4 bytes, Inline) for call to '__rt_memclr_w' from stdio.o(.text).
Adding TA veneer (4 bytes, Inline) for call to '__rt_raise' from stdio.o(.text).
Adding TA veneer (8 bytes, Short) for call to '__rt_exit' from exit.o(.text).
Adding TA veneer (4 bytes, Inline) for call to '__user_libspace' from free.o(.text).
Adding TA veneer (4 bytes, Inline) for call to '_fp_init' from lib_init.o(.text).
Adding TA veneer (4 bytes, Inline) for call to '__heap_extend' from malloc.o(.text).
Adding AT veneer (8 bytes, Inline) for call to '__raise' from rt_raise.o(.text).
Adding TA veneer (4 bytes, Inline) for call to '__rt_errno_addr' from ftell.o(.text).
12 Veneer(s) (total 72 bytes) added to the image.
(3)Thumb状态下的功能指针
任何指向Thumb函数(由Thumb指令完成的功能函数并且其返回状态也为Thumb状态)的指针,其最低有效位(LSB)必为1。
当重定位Thumb代码中的地址标号时,连接器将自动设置地址的最低有效位。如果在程序中使用绝对地址,连接器将无法完成该设置。因此,如果在Thumb代码中使用绝对地址时,必须手工设置为其地址加1。
下面的例子显示了Thumb代码的功能指针的使用。
typedef int (*FN)();
myfunc() {
FN fnptrs[] = {
(FN)(0x8084 + 1), // 有效的Thumb地址
(FN)(0x8074) // 无效的Thumb地址
};
FN* myfunctions = fnptrs;
myfunctions[0](); // 调用成功
myfunctions[1](); // 调用失败
}
Thumb指令集 ARM 混合编程 Veneer AAPCS 相关文章:
- Thumb指令集之: Thumb指令的特点及实现(08-30)
- Thumb指令集之: Thumb跳转指令(08-30)
- Thumb指令集之: Thumb指令应用(08-30)
- Thumb指令集与ARM指令集的区别(11-21)
- Thumb指令集之: Thumb指令应用(09-30)
- Thumb指令集之: 多寄存器数据传送指令(09-30)