2

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

4

1 回答 1

5

你确定代码段subl $8, %esp错误吗?

在您的代码中,您从堆栈指针中减去 8,但从不恢复该值。执行时返回的地址不再是堆栈中最新的东西ret

该指令

movl %esp, %ebp

%esp复制to的原始值%ebp。当你返回时,你恢复了原来的%ebpwith popl,但永远不会恢复%esp,所以你返回了一些垃圾地址。

行前

popl %ebp

添加

movl %ebp, %esp

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

于 2019-07-26T17:30:06.520 回答