Дальний вызов проталкивает неправильный IP в стек - PullRequest
0 голосов
/ 23 ноября 2018

Когда я запускаю следующий код в реальном режиме с использованием VirtualBox, я ожидаю, что инструкция call 0x9000:foo поместит регистры CS и IP в стек.Однако когда я смотрю стек вызовов (в отладчике VirtualBox) сразу после удаленного вызова, адрес возврата устанавливается равным 9000:000006c6 (вместо 9000:0000078c), по-видимому, произвольным адресом.

Если я использую ближний вызов, обратный адрес в стеке вызовов установлен правильно.

Я собираюсь с NASM и запускаю код в реальном режиме x86 на VirtualBox.

Я знаю, что в этом примере мне не нужен дальний вызов, но он мне нужен в другой части моего кода.

9000:00000787    call 0x9000:foo
9000:........    ...
9000:00003bac    push bp  ; foo:
9000:........    ...
9000:00003bf0    retf

Мои вопросы:

Можно лииспользовать дальний вызов для вызова функции в текущем сегменте?

Существует ли известная причина неправильного адреса возврата в стеке вызовов?

1 Ответ

0 голосов
/ 23 ноября 2018

Я рекомендую не использовать kg или k для обхода стека вызовов в отладчике VirtualBox, если вы не достигли точки сразу после пролога функции, который устанавливает фрейм стека функции:

push bp 
mov bp, sp

В некотором коде это выполняется с использованием эквивалентной инструкции ENTER.

Дампер стека вызовов VirtualBox обходит стек, который требует, чтобы BP был установлен в качестве текущего кадра стека.Если вы остановитесь сразу после ввода функции, вам следует рассмотреть такую ​​команду, как dw ss:sp, которая будет извлекать данные дампа из текущего местоположения указателя стека в виде 16-битных слов.Если выполняется ближний вызов, первое напечатанное слово должно быть смещением, к которому следует вернуться, при дальнем вызове смещение будет сначала сопровождаться сегментом, чтобы вернуться к


Примечание. Мой опыт показывает, что вызовстека обходится, если для достижения функции был выполнен FAR CALL, NEAR CALL может не произвести правильную трассировку стека вызовов.

...