Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 它是一个堆叠的框架吗?_Assembly_X86 64 - Fatal编程技术网

Assembly 它是一个堆叠的框架吗?

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

我不明白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
        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中找到了参考