根据这个帖子,使用较短的字符串文本初始化数组会用零填充数组。
那么,当编译为ARM Cortex M4时,这两个函数(
那么,当编译为ARM Cortex M4时,这两个函数(
test1
和test2
)产生不同结果的原因是什么?extern void write(char * buff);
void test1(void)
{
char buff[8] = {'t', 'e', 's', 't', 0, 0, 0, 0 };
write(buff);
}
void test2(void)
{
char buff[8] = "test";
write(buff);
}
我在x86-64上获得了相同的汇编代码,但在ARM gcc上却获得不同的结果:
test1:
str lr, [sp, #-4]!
sub sp, sp, #12
mov r3, sp
ldr r2, .L4
ldm r2, {r0, r1}
stm r3, {r0, r1}
mov r0, r3
bl write
add sp, sp, #12
ldr pc, [sp], #4
.L4:
.word .LANCHOR0
test2:
mov r3, #0
str lr, [sp, #-4]!
ldr r2, .L8
sub sp, sp, #12
ldm r2, {r0, r1}
str r0, [sp]
mov r0, sp
strb r1, [sp, #4]
strb r3, [sp, #5]
strb r3, [sp, #6]
strb r3, [sp, #7]
bl write
add sp, sp, #12
ldr pc, [sp], #4
.L8:
.word .LANCHOR0+8
\0
之后的内存没有被使用(由于外部链接,在这里它不能),因此似乎这是某种错误。如果我将“test2”更改为“char buff [8] =“ test \ 0 \ 0 \ 0”;”(4个尾随零),我在ARM上的两种情况下都获得相同的机器代码。 - Lundin{'t','e','s','t',0}
,buff也会被填满0
。我期望这将产生与字符串字面值版本相同的汇编输出。 - Stephan Lechner