Когда я запускаю следующий код в реальном режиме с использованием 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
Мои вопросы:
Можно лииспользовать дальний вызов для вызова функции в текущем сегменте?
Существует ли известная причина неправильного адреса возврата в стеке вызовов?