Assembly 它是一个堆叠的框架吗?
我不明白gcc为什么会在代码中涉及%esp:Assembly 它是一个堆叠的框架吗?,assembly,x86-64,Assembly,X86 64,我不明白gcc为什么会在代码中涉及%esp: int foo(char *); int bar(char** a) { if (!a[1]) { return 1; } if (foo(a[1]) == -1) { return 1; } return 0; } 通过-O2生成的: bar: .LFB0: .cfi_startproc movq 8(%rdi), %rdi
int foo(char *);
int bar(char** a)
{
if (!a[1]) {
return 1;
}
if (foo(a[1]) == -1) {
return 1;
}
return 0;
}
通过-O2
生成的:
bar:
.LFB0:
.cfi_startproc
movq 8(%rdi), %rdi
movl $1, %eax
testq %rdi, %rdi
je .L7
subq $8, %rsp
.cfi_def_cfa_offset 16
call foo
cmpl $-1, %eax
sete %al
addq $8, %rsp
.cfi_def_cfa_offset 8
movzbl %al, %eax
.L7:
rep ret
而clang在开始时按%rax
,然后将其弹出到%rdx
中,甚至做了一些疯狂的事情
是否分配堆栈帧?这与这些
.cfi
指令有关吗?因为在x64中,堆栈必须是16字节对齐的,并且调用指令使堆栈不平衡。这段特定的代码并不关心,但编译器无法知道foo中的任何指令都是关心的
事实上,它在调用时总是不对齐的,应该在prolog代码中重新对齐;然而,优化器将序言和epilog弄得面目全非。因为在x64中,堆栈必须是16字节对齐的,并且调用指令使堆栈不平衡。这段特定的代码并不关心,但编译器无法知道foo中的任何指令都是关心的 事实上,它在调用时总是不对齐的,应该在prolog代码中重新对齐;然而,优化器将序言和尾声弄得面目全非。好的,我在§2.2OK中找到了参考,我在§2.2中找到了参考