代码之家  ›  专栏  ›  技术社区  ›  Lou

臂组件memcpy等效物

  •  2
  • Lou  · 技术社区  · 7 年前

    我正在查看此函数的程序集输出:

    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,我看到 adds 指导 '0'+x ,但哪个指令复制数据?

    2 回复  |  直到 6 年前
        1
  •  3
  •   prl    7 年前

            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
  •  1
  •   0___________    7 年前

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

        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}
    

        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