Cyb*_*hot 5 assembly arm for-loop
for (int i = 0; i < 10000; i++)
a[i] = b[i] + c[i]
Run Code Online (Sandbox Code Playgroud)
这种高级语言的ARM程序集是什么样的?
编辑:我还假设A的基地址在R8中,B的基地址在R9中,C的基地址在R10中,A,B,C都是int数组
非常感激
我试过了:
MOV R0, #0 ; Init r0 (i = 0)
Loop:
a[i] = b[i] + c[i] //How to fix this?
ADD R0, R0, #1 ;Increment it
CMP R0, #1000 ;Check the limit
BLE Loop ;Loop if not finished
Run Code Online (Sandbox Code Playgroud)
假设这种高级语言与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];
}
}
Run Code Online (Sandbox Code Playgroud)
你可以跑
arm-linux-androideabi-gcc -O0 -S test.c
Run Code Online (Sandbox Code Playgroud)
创建一个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>
Run Code Online (Sandbox Code Playgroud)
现在这种方法的问题是信任编译器为你的研究生成最佳代码,这可能并非总是如此,但你会得到的是快速回答你的问题,而不是等待人们:)
- 额外 -
GCC允许您将变量放入某些寄存器,请参阅相关文档.
你可以在这里获得手臂指导备忘单.
较新版本的GCC可以像预期的那样创建更好的arm代码.剪切版本是由版本4.4.3生成的,我可以确认Linaro的4.7.1证明了我的主张.因此,如果您采用我的方法,请使用最新的工具链.