为什么在移动堆栈指针时出现分段错误?

AYC*_*CKS 2 x86 assembly segmentation-fault att stack-pointer

使用汇编代码,想知道为什么我的subl $ 8,%esp指令出现段错误?

        pushl %ebp
    movl %esp, %ebp

        movl 16(%ebp), %esi
        movl 12(%ebp), %edi
        movl 8(%ebp), %eax
        movl $0, %ebx
        subl $8, %esp
        jmp .LL1

.LL1:
        cmpl %ebx, %esi
        je .LL2
        movl %ebx, 4(%esp)
        movl %eax, (%esp)
        addl $1, %ebx
        jmp .LL1

.LL2:
    popl %ebp
    ret
Run Code Online (Sandbox Code Playgroud)

在subl $ 8上出现segfault,%esp

Tho*_*ger 5

您确定代码段错误subl $8, %esp吗?

在您的代码中,您从堆栈指针中减去了8,但从未恢复该值。执行时,返回的地址不再是堆栈中的最新内容ret

指令

movl %esp, %ebp
Run Code Online (Sandbox Code Playgroud)

将的原始值复制%esp%ebp。返回时,您将还原%ebpwith 的原始内容popl,但从不还原%esp,因此您将返回到一些垃圾地址。

上线前

popl %ebp
Run Code Online (Sandbox Code Playgroud)

movl %ebp, %esp
Run Code Online (Sandbox Code Playgroud)

在返回之前更正堆栈指针。

  • @AYCHSTACKS具体来说,如果您不知道如何接受答案或想要有关如何接受答案的信息(以及原因),则可以在此处找到有用的信息:https://meta.stackexchange.com/a/5235/ 271768 (2认同)