ARM 汇编 memcpy 等价物
ARM assembly memcpy equivalent
我正在查看此函数的汇编输出:
extern void write(char * buff);
void test(int x)
{
// copy "EXAMPLE[=10=][=10=][=10=][=10=][=10=]..."
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[=11=]0"
.space 8
.text
我对从 .L4
到堆栈的复制发生在哪里感到非常困惑?
我看到堆栈指针移动了 16B,我看到了 '0'+x
的 adds
指令,但是哪个指令复制了数据?
抱歉新手问题,谢谢!
执行复制的指令与其他指令交错。
ldr r2, .L4
ldm r2, {r0, r1}
mov r2, sp
stm r2, {r0, r1}
movs r4, #0
strd r4, r4, [sp, #8]
由于编译器知道buff的内容,它可以直接存储0而不是复制它们。
生成的代码取决于优化类型:
尺寸优化:
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
我正在查看此函数的汇编输出:
extern void write(char * buff);
void test(int x)
{
// copy "EXAMPLE[=10=][=10=][=10=][=10=][=10=]..."
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[=11=]0"
.space 8
.text
我对从 .L4
到堆栈的复制发生在哪里感到非常困惑?
我看到堆栈指针移动了 16B,我看到了 '0'+x
的 adds
指令,但是哪个指令复制了数据?
抱歉新手问题,谢谢!
执行复制的指令与其他指令交错。
ldr r2, .L4
ldm r2, {r0, r1}
mov r2, sp
stm r2, {r0, r1}
movs r4, #0
strd r4, r4, [sp, #8]
由于编译器知道buff的内容,它可以直接存储0而不是复制它们。
生成的代码取决于优化类型: 尺寸优化:
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