Вот накопились некоторые вопросы по режимам работы микропроцессора. При компиляции под Windows исходников они по умолчанию выполняются в режиме "виртуальный i8086", этот режим позволяет выполнять программы "реального" режима или в "режиме реальных адресов" в режиме "защищённом". Вопрос №1: Каким образом формируется физический адрес в "виртуальном i8086"? А именно - используется ли дескрипторная таблица, как в "защищённом" режиме? Этот вопрос я задаю, ибо: во всех учебниках написано, что в "виртуальном i8086" формирование физического адреса происходит по правилам "реального" режима, т.е. без дескрипторов сегментов, но в то же время этот режим может быть 32-разрядным, т.е. сегменты в этом режиме могут быть 32-разрядными, а для этого уже нужен бит d_b в дескрипторе. В общем не понятно. Объясните, пожалуйста. Вопрос №2: Наличие/отсутствие V86 можно определить по флагу VM (17 бит в flags). Какой командой можно этот флаг прочитать? И вообще: знаю как работать только с флагами df,if,cf. Как читаются/модифицируются другие флаги?
Код (Text): pushfd pop eax test eax, 1 ; проверяем флаг CF jz lab1 ; переход, если флаг CF сброшен (аналогично jnc) and eax, 0FFFFFFFEh ; сбрасываем CF push eax popfd lab1:
Понятие виртуальная машина означает что ее физические характеристики эмулируются ( программно и/или аппаратно ). А нам известны хар-ки вышеупомянутого проца ( max объем памяти 1 мег, нет поддержки вирт. памяти и т.д). Флаги состояния проца можно получить при помощи команды pushfd ( ложит в стек 32-битное слово с флагами ).
Это значит что сегменты выстроены с перекрытием, через параграф (16 байт) и перетасовать их произвольным образом, например выстроить друг за другом без перекрытия нельзя, но можно сделаьт так, что размер каждого сегмента не будет ограничен 64 кбайтами, а будет 32 разрядным, правда вроде как дальше 1Мб винда всё равно дос прогам "напрямую" вылазить не разрешает - только путём всяких извратных механизмов типа отображения окна в 1Мб адресное пространство.