2.6 使用汇编器
本节介绍如何使用KF32汇编器从汇编文件构建目标文件,以及如何从C/C++源文件调用该目标文件中的函数。
有时为了操作接近硬件底层的硬件或取得更加极致的性能,您可能需要手动编写汇编代码来实现某些功能,为了编译这部分代码,您需要使用kf32clang的汇编器功能来进行编译。
2.6.1 示例代码
这个汇编示例是一个单独的汇编源文件add.s,其中包含一个用于执行简单整数加法的函数:
.text
.file "add.c"
.globl add
.p2align 3
.type add,@function
add:
ADD r0, r1, r0
JMP lr
.text 是汇编中的段(section)标识符,表示接下来的内容属于程序的代码段。
.file 表示该汇编代码来自源文件add.c。
.p2align 伪指令将后续代码对齐到8字节边界。这种对齐是为了符合KF32应用程序过程调用标准。
.global 指令将符号add标记为全局符号。这使得该符号可以被外部文件引用。
.type 伪指令将符号add的类型设置为函数。这有助于链接器在从代码跳转到该符号时使用正确的链接方式。
2.6.2 汇编源文件
在汇编代码时,必须首先确定目标文件要在哪个目标平台上运行。--target选项决定了要为哪个目标状态进行编译。该选项是一个必填选项。
要为kf32r目标汇编上述源文件:
kf32clang --target=kf32r -march=kf32r -c add.s
此命令会创建一个目标文件 add.o。
--target选项用于指定编译的目标平台。
-march选择用来指定支持的指令集架构。
2.6.3 C/C++代码调用汇编函数
在汇编文件中编写经过优化的函数,并从C/C++代码中调用它们时,要确保汇编函数使用的寄存器符合调用标准。
以下C语言示例是一个单独的C源文件main.c,其中包含对add函数的调用,用于将两个整型数字进行相加:
extern int add(int left, int right);
int main(void)
{
int result = add(3, 5);
return result;
}
已为add函数添加了外部函数声明,返回类型和函数参数必须手动检查。
如果要从C++源文件调用汇编函数,必须使用extern "C"而非extern来禁用C++的名称修饰。
2.6.4 编译和链接C源文件
要为kf32r架构编译上述源文件:
kf32clang --target=kf32r -march=kf32r -c main.c
此命令会创建一个目标文件 main.o。
要将两个目标文件 main.o 和 add.o 链接起来并生成可执行文件:
kf32ld main.o add.o -T kf32demo.ld -o add.elf
此命令会创建一个可执行文件add.elf。