Assembly 为什么在移动堆栈指针时出现分段错误?
处理汇编代码,并想知道为什么指令subl$8出现seg错误,%espAssembly 为什么在移动堆栈指针时出现分段错误?,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
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