Не удается получить доступ к элементам стека из другого метода - Assembly [duplicate]

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

0
задан OJFord 24 August 2014 в 14:58
поделиться

2 ответа

Как родительская функция знает, как перестраивать себя? Необходимые шаги, встроенные в вызов и ret?

Перед вызовом функции сохраняется текущее состояние регистров, а также адрес возврата. Команда call переходит к конкретному адресу, где начинается вызываемая функция. Обратный адрес помещается в стек. Когда вызываемая функция возвращается, команда ret появляется ранее, толкает обратный адрес и переходит в это место.

Затем rsp всегда перемещается в rbp

. rbp ранее помещается в стек, чтобы иметь возможность восстановить значение rbp из функции вызывающего. Затем rsp перемещается в rbp для создания нового фрейма стека для функции calllee. Создан новый указатель базы. Таким образом, в настоящее время rbp и rsp указывают на одни и те же адреса. Если есть другие инструкции push, esp автоматически настраивается. Когда функция выполнена, команда pop ebp восстанавливает ранее введенный адрес указателя на базовый указатель стека.

1
ответ дан macfij 19 August 2018 в 10:52
поделиться
  • 1
    Я думаю, у вас есть опечатка. RBP никогда не перемещается в RSP. – Bartlomiej Lewandowski 24 August 2014 в 22:09
  • 2
    Да. Исправлено, спасибо. – macfij 24 August 2014 в 22:31

Push и Pop изменяют указатель стека - SP.

Вызов вызывает FLAGS - регистр состояния, а также адрес возврата RA. Ret выталкивает FLAS pops и перескакивает на обратный адрес.

Как сказал rkhb, необходимо сохранить определенные регистры, поскольку они поступают из вызывающих соглашений.

0
ответ дан Bartlomiej Lewandowski 19 August 2018 в 10:52
поделиться
  • 1
    call / ret не касаются FLAGS. Может быть, вы думаете о int 0x80 / iret? – Peter Cordes 25 May 2018 в 21:01
Другие вопросы по тегам:

Похожие вопросы: