它是一个堆栈框架?

时间:2016-02-26 18:05:11

标签: assembly x86-64

我不明白为什么gcc甚至触及%esp代码:

function getWorkedDaysExcludingHolidays() {

  // calculation $days here based on holidays

  return $days;   
}

使用int foo(char *); int bar(char** a) { if (!a[1]) { return 1; } if (foo(a[1]) == -1) { return 1; } return 0; }

生成
-O2

并且clang在开始时推动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 然后将其弹出到%rax中,从而做了一些甚至疯狂的事情。

是否要分配堆栈帧?这与这些%rdx指令有关吗?

1 个答案:

答案 0 :(得分:0)

因为在x64中,堆栈必须是16字节对齐,并且调用指令使堆栈失衡。这个特殊的代码没有任何关心,但编译器无法知道foo内部的任何指令。

实际上它总是在调用时未对齐,并且应该在prolog代码中重新对齐;然而,优化者将序言和epilog误认为是无法识别的。