编译器是否为字节溢出提供了额外的堆栈空间?

时间:2014-04-30 11:50:02

标签: compiler-construction disassembly

从我得到的here下面的示例代码中,我不明白为什么在执行字节溢出时寄存器的值会移动到堆栈中的特定部分。

        pushq        %rbp
        movq        %rsp, %rbp
        subq        $96, %rsp
        leaq        L__unnamed_cfstring_23(%rip), %rax
        leaq        L__unnamed_cfstring_26(%rip), %rcx
        movl        $42, %edx
        leaq        l_objc_msgSend_fixup_alloc(%rip), %r8
        movl        $0, -4(%rbp)
        movl        %edi, -8(%rbp)
        movq        %rsi, -16(%rbp)
        movq        %rax, -48(%rbp)         ## 8-byte Spill
        movq        %rcx, -56(%rbp)         ## 8-byte Spill
        movq        %r8, -64(%rbp)          ## 8-byte Spill
        movl        %edx, -68(%rbp)         ## 4-byte Spill
        callq        _objc_autoreleasePoolPush
        movq        L_OBJC_CLASSLIST_REFERENCES_$_(%rip), %rcx
        movq        %rcx, %rdi
        movq        -64(%rbp), %rsi         ## 8-byte Reload
        movq        %rax, -80(%rbp)         ## 8-byte Spill
        callq        *l_objc_msgSend_fixup_alloc(%rip)
        movq        L_OBJC_SELECTOR_REFERENCES_27(%rip), %rsi
        movq        %rax, %rdi
        movq        -56(%rbp), %rdx         ## 8-byte Reload
        movl        -68(%rbp), %ecx         ## 4-byte Reload

而且,我不知道字节溢出的目的是什么,因为如果函数是保存将在其中使用的寄存器值的函数,则仍然可以实现程序逻辑。

我真的不知道为什么会这样。请帮我理解这一点。

0 个答案:

没有答案