ARM汇编循环

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)

aus*_*len 7

假设这种高级语言与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证明了我的主张.因此,如果您采用我的方法,请使用最新的工具链.