使用汇编代码并想知道为什么我在指令subl $8,%esp上出现seg错误?
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
以在返回之前更正堆栈指针。