· Главная · Журнал · Алгоритмы · Естественные Науки · Wiki |
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | DigiMania | RSS |
Здравствуйте, Гость | Вход · Регистрация · Выслать повторно письмо для активации · Что даёт регистрация на форуме? |
1. Все статьи должны быть оформлены согласно Правил оформления
статей. 2. Любые обсуждения должны происходить в специальной теме, обсуждение в любых других темах раздела запрещены. 3. Запрещается писать статьи о создании и распространении вирусов, троянов и других вредоносных программ! 4. За грамотно написанные и правильно оформленные статьи авторы награждаются DigiMoney. Дополнительные ссылки: Желаю творческих успехов! |
7in X |
Сообщ. #1 от
1.04.05, 17:14
|
Moderator Профиль · PM Поощрения: 22 Dgm Рейтинг (т): 88 |
Определение текущего режима работы
процессора Для начала неплохо бы удостовериться, что наш процессор не хуже 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 ___________ Я однажды проснусь, а вокруг
мир другой: светел, чист, бесконечно прекрасен... И не будет в помине озлобленных лиц, а на меньшее я не согласен... © Н.Носков. |
Форум на
Исходниках.RU · Assembler
FAQ |
|||
| |||