Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[54.225.35.224] |
|
Сообщ.
#1
,
|
|
|
Определение текущего режима работы процессора Для начала неплохо бы удостовериться, что наш процессор не хуже 80286, т.к. иначе компьютер повиснет (хотя, для такого старого процессора проверку можно и не делать), а затем уже проверить PE-флаг (Protection Enable) регистра MSW. Да, да, именно MSW, а не CR0, т.к. во-первых, регистра CR0 в процессоре 80286 нет, а во-вторых, вам никто не позволит прочесть содержимое CR0 из виртуального режима. Т.о, если PE-флаг сброшен, значит процессор находится в режиме реальных адресов (RMode), а если установлен, то, соответственно, в режиме виртуального процессора 8086 (VMode). P.S. Для тех, кто не в курсе сообщаю, что DOS-программа выполняться в защищённом режиме не может (если только она сама не установит его), а при запуске из-под Windows процессор переключается в виртуальный режим. А вот и исходник (в формате DOS COM): ; tasm /m cpumode.asm ; tlink /t /x cpumode.obj .MODEL Tiny .286P .CODE ORG 100h Start: mov ah,9 lea dx,Header int 21h ; Выводим первую половину фразы :) lea dx,RMode ; Готовим сообщение для RMode ; Проверяем процессор 80286 (эту часть можно опустить) mov ah,2 ; Нас волнуют только биты 12-15 и 9 (IF) AX push ax popf ; Сбрасываем биты 12-15 флагов pushf pop ax ; И читаем их or ah,ah ; Если бит 15 установлен, значит это 80(1)86 js RModeIsSet ; ...и в VMode процессор находиться не может ; Проверяем PE-флаг smsw ax ; Записываем MSW в AX test al,1 ; Проверяем PE-флаг (бит 0) jz RModeIsSet ; Прыгаем, если он сброшен lea dx,VMode ; Иначе готовим сообщение для VMode RModeIsSet: mov ah,9 int 21h ; Выводим вторую половину фразы int 20h ; Выходим из программы Header db 'Процессор находится в режиме $' RMode db 'реальных адресов!',13,10,'$' VMode db 'виртуального процессора 8086!',13,10,'$' END Start |