【问题标题】:ARM assembly memcpy equivalentARM 程序集 memcpy 等效项
【发布时间】:2018-12-20 21:00:03
【问题描述】:

我正在查看这个函数的汇编输出:

extern void write(char * buff);

void test(int x)
{
    // copy "EXAMPLE\0\0\0\0\0..."
    char buff[16] = "EXAMPLE";

    // set byte 10 to '0'+x
    buff[10] = '0' + x;

    // write
    write(buff);
}

它看起来像like this

test:
        push    {r4, lr}
        ldr     r2, .L4
        mov     r3, r0
        ldm     r2, {r0, r1}
        sub     sp, sp, #16
        mov     r2, sp
        adds    r3, r3, #48
        stm     r2, {r0, r1}
        movs    r4, #0
        mov     r0, r2
        strd    r4, r4, [sp, #8]
        strb    r3, [sp, #10]
        bl      write
        add     sp, sp, #16
        pop     {r4, pc}
.L4:
        .word   .LANCHOR0
        .cfi_endproc
.LFE0:
        .size   test, .-test
        .section        .rodata
        .align  2
        .set    .LANCHOR0,. + 0
        .ascii  "EXAMPLE\000"
        .space  8
        .text

我完全不知道从.L4 复制到堆栈发生在哪里?

我看到堆栈指针移动了 16B,并且我看到 '0'+xadds 指令,但是哪个指令复制了数据?

对不起,新手问题,谢谢!

【问题讨论】:

    标签: c assembly arm array-initialization


    【解决方案1】:

    执行复制的指令与其他指令交错。

            ldr     r2, .L4
            ldm     r2, {r0, r1}
            mov     r2, sp
            stm     r2, {r0, r1}
            movs    r4, #0
            strd    r4, r4, [sp, #8]
    

    由于编译器知道buff的内容,它可以直接存储0而不是复制它们。

    【讨论】:

      【解决方案2】:

      生成的代码取决于优化类型: 尺寸优化:

          push    {r0, r1, r2, r3, r4, lr}
          mov     r2, #8
          ldr     r1, .L3
          mov     r4, r0
          mov     r0, sp
          bl      memcpy
          mov     r3, #0
          add     r4, r4, #48
          mov     r0, sp
          str     r3, [sp, #8]
          str     r3, [sp, #12]
          strb    r4, [sp, #10]
          bl      write
          add     sp, sp, #16
          pop     {r4, pc}
      

      -O3

          str     lr, [sp, #-4]!
          sub     sp, sp, #20
          mov     r2, sp
          mov     ip, #0
          ldr     r1, .L4
          add     r3, r0, #48
          ldm     r1, {r0, r1}
          stm     r2, {r0, r1}
          mov     r0, r2
          str     ip, [sp, #8]
          str     ip, [sp, #12]
          strb    r3, [sp, #10]
          bl      write
          add     sp, sp, #20
          ldr     pc, [sp], #4
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-07
        • 1970-01-01
        • 1970-01-01
        • 2012-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多