Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Как родительская функция знает, как перестраивать себя? Необходимые шаги, встроенные в вызов и ret?
blockquote>Перед вызовом функции сохраняется текущее состояние регистров, а также адрес возврата. Команда
call
переходит к конкретному адресу, где начинается вызываемая функция. Обратный адрес помещается в стек. Когда вызываемая функция возвращается, командаret
появляется ранее, толкает обратный адрес и переходит в это место.Затем rsp всегда перемещается в rbp
blockquote>. rbp ранее помещается в стек, чтобы иметь возможность восстановить значение rbp из функции вызывающего. Затем rsp перемещается в rbp для создания нового фрейма стека для функции calllee. Создан новый указатель базы. Таким образом, в настоящее время rbp и rsp указывают на одни и те же адреса. Если есть другие инструкции
push
, esp автоматически настраивается. Когда функция выполнена, командаpop ebp
восстанавливает ранее введенный адрес указателя на базовый указатель стека.
Push и Pop изменяют указатель стека - SP
.
Вызов вызывает FLAGS - регистр состояния, а также адрес возврата RA. Ret выталкивает FLAS pops и перескакивает на обратный адрес.
Как сказал rkhb, необходимо сохранить определенные регистры, поскольку они поступают из вызывающих соглашений.
int 0x80
/ iret
?
– Peter Cordes
25 May 2018 в 21:01
RBP
никогда не перемещается вRSP
. – Bartlomiej Lewandowski 24 August 2014 в 22:09