假设这个高级语言没有任何与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允许你把变量放到特定的寄存器,见related documentation。
您可以获取arm指令备忘单here。
GCC的较新版本创建更好的代码,如预期的那样。上面的剪切版本是由4.4.3版生成的,我可以确认Linaro的4.7.1版本证明了我的说法。所以,如果你采用我的方法,可以使用最新的工具链。
到目前为止您尝试过什么? – 2012-08-16 02:13:55
你可能想澄清你在这里问的问题--ARM风格的Assembly和Android编程是两个完全不同的东西; Android是像Java这样的VM风格环境;你不能使用Assembly,因为代码是由运行时解释的,而不是直接在处理器上运行。 – 2012-08-16 02:20:47
关于你的编辑;你在什么地方尝试了ASM;你使用什么软件/设备? – 2012-08-16 02:23:51