Почему вызов «pop» в этом фрагменте кода сборки вызывает ошибку сегментации? - PullRequest
1 голос
/ 29 сентября 2019

Я играю со сборкой x86-64 в Mac OS (используя NASM 2.09 и 2.13, чтобы ловить ошибки, вызванные проблемами NASM).В данный момент я пытаюсь реализовать вызовы функций и пытался использовать инструкции push и pop, но pop всегда вызывает segfault:

line 10: 41072 Segmentation fault: 11 ./result

Я пытался настроить rsp, rbp и т. Д. Вручную, но, похоже, проблема pop.Любая помощь будет оценена!

section .data

default rel
global start
section .text

start:
    mov r12, 4
    push r12
    call label_0_print_digit
    (some stuff to exit program)

label_0_print_digit:
    pop r12
    (some stuff to print the digit - the issue persists even without this)
    ret 

1 Ответ

4 голосов
/ 29 сентября 2019

Инструкция call помещает адрес возврата в стек.Инструкция pop удаляет адрес возврата из стека (в ваш код он помещает его в r12).Затем инструкция ret пытается вернуться к адресу 4, который не является допустимым адресом кода, вызывая ошибку.

Чтобы получить доступ к параметрам функции, находящейся в стеке, используйте (rsp + 8), (rsp + 16) и т. Д. Вместо pop.

...