假设这种高级语言与 C 没有任何冲突,您可以使用 arm C 编译器从您的代码片段创建汇编代码。例如,如果您在 test.c 中有以下内容,
void test() {
register int i asm("r0");
register int *a asm("r8");
register int *b asm("r9");
register int *c asm("r10");
for (i = 0; i < 10000; i++) {
a[i] = b[i] + c[i];
}
}
你可以跑
arm-linux-androideabi-gcc -O0 -S test.c
创建一个 test.s 文件,该文件将包含您的测试功能的汇编代码以及一些额外的东西。你可以在下面看到你的循环是如何编译成程序集的。
<snipped>
.L3:
mov r2, r8
mov r3, r0
mov r3, r3, asl #2
add r3, r2, r3
mov r1, r9
mov r2, r0
mov r2, r2, asl #2
add r2, r1, r2
ldr r1, [r2, #0]
mov ip, sl
mov r2, r0
mov r2, r2, asl #2
add r2, ip, r2
ldr r2, [r2, #0]
add r2, r1, r2
str r2, [r3, #0]
mov r3, r0
add r3, r3, #1
mov r0, r3
.L2:
mov r2, r0
ldr r3, .L5
cmp r2, r3
ble .L3
sub sp, fp, #12
ldmfd sp!, {r8, r9, sl, fp}
bx lr
<snipped>
现在这种方法的问题是相信编译器会为您的研究生成最佳代码,这可能并非总是如此,但您将得到的是对上述问题的快速答案,而不是等待人们:)
- 额外的 -
GCC 允许您将变量放入某些寄存器,请参阅相关文档。
您可以在此处获取 arm 指令备忘单。
正如预期的那样,较新版本的 GCC 创建了更好的 arm 代码。以上截图由 4.4.3 版本生成,我可以确认Linaro的 4.7.1 证明了我的主张。因此,如果您采用我的方法,请使用您可以获得的最新工具链。