【问题标题】:ESP register dereference segmentation fault, x86 [duplicate]ESP 寄存器取消引用分段错误,x86 [重复]
【发布时间】:2021-01-16 17:28:42
【问题描述】:

我正在尝试在 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

【问题讨论】:

  • 这是一个 32 位的教程。如果要将其移植到 64 位模式,则必须了解其中的差异。如果您执行info reg,那么在 GDB 中应该很明显 RSP 的值大于 32 位,因此 RSP != ESP。
  • bleh,你使用的唯一一个我有金色徽章的标签是 [x86],你漏掉了 [assembly]。由于这是一个专门的 x86-64 问题,因此我重新标记了它,然后无法使用 dup-hammer。
  • 请注意,在遵循教程时,您真的不应该将教程移植到不同的架构。
  • @PeterCordes prl 解决了我的问题

标签: macos assembly stack x86-64 cpu-registers


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-02-03
  • 2014-02-04
  • 1970-01-01
  • 2017-09-07
  • 2012-05-02
  • 2012-01-28
  • 2012-02-17
  • 2012-01-11
相关资源
最近更新 更多