ESP寄存器解除引用分段错误,x86

问题描述

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

(gdb) disassemble
Dump of assembler code for function main:
   0x0000000100000fa2 <+0>: pushq  $0x32
=> 0x0000000100000fa4 <+2>: mov    (%esp),%eax
   0x0000000100000fa8 <+6>: mov    $0x0,%rdi
   0x0000000100000faf <+13>:    mov    $0x2000001,%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位,这不是有效的内存地址。