assembly - 为什么在移动堆栈指针时会出现段错误?

标签 assembly x86 segmentation-fault att stack-pointer

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

相关文章:

c - malloc() 中的段错误?

perl - 调试 Perl 段错误

c - RTOS 相对于单个顺序程序的优点

assembly - 组装中的 EBP、ESP 和堆栈框架

assembly - 如何使用组件 emu8086 在键盘上打开大写锁定灯

c# - NGEN x86 与 x64 与 .NET 可执行文件

c++ - 英特尔引脚 : analysis routine detects ah register instead of rsp (REG_STACK_PTR)

c++ - 内联汇编 (__asm) block 是否会阻止功能优化?

c - 将 c 控制台输入拆分为整数

Codevision 生成 `.ASM` 输出