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