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

Assembly 为什么在移动堆栈指针时出现分段错误?,assembly,x86,segmentation-fault,att,stack-pointer,Assembly,X86,Segmentation Fault,Att,Stack Pointer,处理汇编代码,并想知道为什么指令subl$8出现seg错误,%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

处理汇编代码,并想知道为什么指令subl$8出现seg错误,%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

subl$8,%esp上的segfault是否确定
subl$8,%esp上的代码segfault

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

指令

movl %esp, %ebp
%esp
的原始值复制到
%ebp
。返回时,使用
popl
还原
%ebp
的原始文件,但从不还原
%esp
,因此返回到某个垃圾地址

排队前

popl %ebp


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

非常好的建议,我在LL2中更新了堆栈指针。谢谢kindly@AYCHSTACKS如果一个答案解决了你的问题,你就可以把它作为你问题的公认答案。我不是想强迫你接受我的答案,只是要确保你知道你可以这么做。@AYCHSTACKS特别指出,如果你不知道如何接受答案,或者想知道如何接受答案(以及为什么),你可以在这里找到有用的信息:
movl %ebp, %esp