ESP 寄存器取消引用分段错误,x86

ESP register dereference segmentation fault, x86

我正在尝试在 x86 程序集的堆栈上遵循此 tutorial。在我看来,esp 是一个包含指向堆栈顶部指针的寄存器——为了测试这一点,我取消了对 esp 的引用,并尝试将其值存储在 eax 中。这给了我一个分段错误,我不知道为什么。使用 GDB,我能够确认这个取消引用导致了错误:

(gdb) disassemble
Dump of assembler code for function main:
   0x0000000100000fa2 <+0>: pushq  [=10=]x32
=> 0x0000000100000fa4 <+2>: mov    (%esp),%eax
   0x0000000100000fa8 <+6>: mov    [=10=]x0,%rdi
   0x0000000100000faf <+13>:    mov    [=10=]x2000001,%rax
   0x0000000100000fb6 <+20>:    syscall
End of assembler dump.
(gdb)

但我想不通为什么。有熟悉 x86 堆栈的人知道我做错了什么吗?

我的组装方式:gcc -masm=intel access_stack_via_pointer.asm 同样重要的是要注意我在 MacOS 上。

    .global _main
    .text
_main:
    push 50

    # why the segmentation fault?
    # eax should have 50 in it
    mov eax, [esp]

    mov rdi, 0
    mov rax, 0x2000001
    syscall

在64位模式下,堆栈指针是RSP,不是ESP。使用 ESP 使用寄存器的低 32 位,这不是有效的内存地址。