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



使用汇编代码并想知道为什么我在指令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

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

相关内容

  • 没有找到相关文章

最新更新