ESP register dereference segmentation fault, x86 [ซ้ำ]

Oct 01 2020

ฉันพยายามทำตามบทช่วยสอนนี้บนสแต็กในชุดประกอบ x86 สำหรับฉันแล้วดูเหมือนว่า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

คำตอบ

1 prl Oct 01 2020 at 09:06

ในโหมด 64 บิตตัวชี้สแต็กคือ RSP ไม่ใช่ ESP การใช้ ESP จะใช้รีจิสเตอร์ที่ต่ำ 32 บิตซึ่งไม่ใช่ที่อยู่หน่วยความจำที่ถูกต้อง