Код: Выделить всё
section .rodata
a dq 10
section .data
section .bss
section .text
global _start
_start:
main:
push rbp
mov rbp,rsp
sub rsp, 32
mov rax, [a]
mov [rbp - 8], rax
add rsp, 32
leave
ret
_exit:
mov rax, 60
mov rdi, 0
syscall
но наверняка что-то не так, иначе не было бы ошибки сегментирования, поэтому я попробовал отладку с помощью следующих средств: -
1. Сначала я попробовал использовать GDB для соответствующего кода и обнаружил следующее после "0x0000000000401019 : ret", когда я написал ni (nexti), адрес был примерно таким "0x0000000000000001 in ?? ()" вместо _exit, он имел ?? в качестве адреса, что означает, что ассемблер не сохраняет информацию об указателе стека, который должен был быть сохранен при выполнении mov rbp, rsp, что это такое, я проверил это с помощью gdb (информационный фрейм и информационный стек) все происходит нормально.
2. поэтому я проверил Интернет - ну, я почти ничего не нашел (ну, это был быстрый поиск, примерно за 5 минут, прежде чем я сдался)
3. затем, после длительной отладки, я посмотрел на свой код и понял, что возвращаюсь к _start, так и не дойдя до _exit label, но почему такое глубокое предупреждение через уведомление системы, как будто я думаю, что делал это раньше, даже когда был задействован кадр стека, но я никогда не получал такого глубокого предупреждения
основной вопрос - поэтому мой главный вопрос на самом деле заключается в том, почему такое предупреждение только в этот раз, а не в другие разы, когда я сделал такие бесконечные скачки
важное примечание - просто чтобы внести ясность, этот вопрос строго касается не ошибки сегментации, а контекста уведомления
моя система - на момент компиляции и выполнения дефектного исполняемого файла мой дистрибутив для gnu/linux был open suse tumbelweed с xfce в качестве среды рабочего стола, а также bash в качестве оболочки, без любая дополнительная специальная конфигурация
Подробнее здесь: https://stackoverflow.com/questions/798 ... -on-my-x86
Мобильная версия