【发布时间】: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