问题描述
我正在尝试在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位,这不是有效的内存地址。