我的例子很简单:
extern int fun(int arr[]);
int foo(void)
{
int arr[64] = {0};
return fun(arr);
}
当我使用clang进行编译时,asm代码非常简单:
foo: # @foo
.cfi_startproc
# %bb.0:
subq $264, %rsp # imm = 0x108
.cfi_def_cfa_offset 272
xorps %xmm0, %xmm0
movaps %xmm0, 240(%rsp)
movaps %xmm0, 224(%rsp)
movaps %xmm0, 208(%rsp)
movaps %xmm0, 192(%rsp)
movaps %xmm0, 176(%rsp)
movaps %xmm0, 160(%rsp)
movaps %xmm0, 144(%rsp)
movaps %xmm0, 128(%rsp)
movaps %xmm0, 112(%rsp)
movaps %xmm0, 96(%rsp)
movaps %xmm0, 80(%rsp)
movaps %xmm0, 64(%rsp)
movaps %xmm0, 48(%rsp)
movaps %xmm0, 32(%rsp)
movaps %xmm0, 16(%rsp)
movaps %xmm0, (%rsp)
movq %rsp, %rdi
callq fun
addq $264, %rsp # imm = 0x108
.cfi_def_cfa_offset 8
retq
虽然gcc会生成较短的asm代码,但我不太了解。这是gcc的代码:
foo:
.LFB0:
.cfi_startproc
subq $264, %rsp
.cfi_def_cfa_offset 272
xorl %eax, %eax
movl $32, %ecx
movq %rsp, %rdi
rep stosq
movq %rsp, %rdi
call fun@PLT
addq $264, %rsp
.cfi_def_cfa_offset 8
ret
我是汇编代码新手。对不起,如果我的问题很愚蠢。但是任何指导都是欢迎的。