假设这种高级语言与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证实了我的说法。因此,如果你采用我的方法,请使用你能够获得的最新工具链。