使用汇编代码并想知道为什么指令 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
subl $8 上出现段错误,%esp
最佳答案
您确定代码在 subl $8, %esp
上出现段错误吗?
在您的代码中,您从堆栈指针中减去 8,但从未恢复该值。当您执行ret
时,要返回的地址不再是堆栈中最新的内容。
说明
movl %esp, %ebp
将%esp
的原始值复制到%ebp
。当你返回时,你用popl
恢复了%ebp
的原始状态,但从未恢复%esp
,所以你返回到了一些垃圾地址。
行前
popl %ebp
添加
movl %ebp, %esp
在返回之前更正堆栈指针。
关于assembly - 为什么在移动堆栈指针时会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57224411/