Статус:
Offline
Реєстрація: 02.07.2009
Повідом.: 201
Реєстрація: 02.07.2009
Повідом.: 201
Помогите, плз, совладать с Turbo C++ (получить адрес метки)
Пишу на C++ программу, которая переводит микропроцессор (МП) из реального режима (real mode, R-mode) в защищённый (protected mode, P-mode).
Необходимо сформировать адрес возврата - адрес команды, которая получит управление после сброса МП.
имеется код вроде такого:
Короче говоря, после сброса МП, начинает выполняться та команда, адрес которой записан в памяти по адресу 40:67h. Мне нужно, чтобы по этому адресу находился адрес первой команды, расположенной после метки prot_exit, но я никак не могу получить её адрес.
В Turbo Pascal проблема решалась следующим образом:
Не знаю даже, что и делать, откуда узнать адрес точки возврата.
В GCC неофициально есть оператор - &&ИДЕНТИФИКАТОР_МЕТКИ, который позволяет получить адрес, но Turbo C++, увы, такого не умеет.
Можно, конечно, написать новую функцию, перенести в неё весь код по восстановлению регистров и т.д., а затем указать её адрес в качестве адреса возврата... Но куда вернётся управление после завершения этой функции? Ведь всё равно понадобится получить адрес возврата .
Думал, что можно при помощи ассемблерной вставки получить содержимое регистра IP и занести его значение в переменную ret_offset, но компилятор ругается - "неизвестный идентификатор - IP" (видимо, таким образом Turbo C++ запрещает программисту привязывать свой код к значению IP).
Подскажите, пожалуйста, как можно узнать адрес какой-либо команды, расположенной в определённой части функции Main.
Буду признателен за любую помощь по данному вопросу.
Пишу на C++ программу, которая переводит микропроцессор (МП) из реального режима (real mode, R-mode) в защищённый (protected mode, P-mode).
Необходимо сформировать адрес возврата - адрес команды, которая получит управление после сброса МП.
имеется код вроде такого:
Код:
unsigned int ret_offset = 0; // Смещение точки возврата в реальный режим
int main() {
// нужно получить адрес возврата:
ret_offset = FP_OFF( &prot_exit ); // не работает. компилятор ругается, что получить адрес метки prot_exit невозможно
// вторая попытка получить адрес возврата
asm {
mov ret_offset, offset prot_exit // компилятор ругается: неизвестный идентификатор prot_exit
lea ret_offset, prot_exit // то же самое: неизвестный идентификатор prot_exit
}
< переход в защищённый режим >
prot_exit: // метка - наша точка возврата
< Действия, которые выполняются после перехода из защищённого
режима обратно в реальный - восстановление сегментных
регистров и т.д. >
return 0;
}
Короче говоря, после сброса МП, начинает выполняться та команда, адрес которой записан в памяти по адресу 40:67h. Мне нужно, чтобы по этому адресу находился адрес первой команды, расположенной после метки prot_exit, но я никак не могу получить её адрес.
В Turbo Pascal проблема решалась следующим образом:
Код:
label
prot_exit; // объявление метки
var
ret_offset: Word; // Смещение точки возврата
begin
{ получение адреса первой команды, которая идёт за меткой prot_exit }
{ компилятор прекрасно понимает идентификатор prot_exit внутри ассемблерной вставки }
asm
mov ret_offset, offset prot_exit
end;
< переход в защищённый режим >
prot_exit: // метка - наша точка возврата
< Действия, которые выполняются после перехода
из защищённого режима обратно в реальный - восстановление
сегментных регистров и т.д. >
end.
Не знаю даже, что и делать, откуда узнать адрес точки возврата.
В GCC неофициально есть оператор - &&ИДЕНТИФИКАТОР_МЕТКИ, который позволяет получить адрес, но Turbo C++, увы, такого не умеет.
Можно, конечно, написать новую функцию, перенести в неё весь код по восстановлению регистров и т.д., а затем указать её адрес в качестве адреса возврата... Но куда вернётся управление после завершения этой функции? Ведь всё равно понадобится получить адрес возврата .
Думал, что можно при помощи ассемблерной вставки получить содержимое регистра IP и занести его значение в переменную ret_offset, но компилятор ругается - "неизвестный идентификатор - IP" (видимо, таким образом Turbo C++ запрещает программисту привязывать свой код к значению IP).
Подскажите, пожалуйста, как можно узнать адрес какой-либо команды, расположенной в определённой части функции Main.
Буду признателен за любую помощь по данному вопросу.
Останнє редагування: