На главную   · Главная · Журнал · Алгоритмы · Естественные Науки · Wiki

! Перед отправкой сообщения внимательно прочтите правила раздела!!!

1. Все статьи должны быть оформлены согласно Правил оформления статей.
2. Любые обсуждения должны происходить в специальной теме, обсуждение в любых других темах раздела запрещены.
3. Запрещается писать статьи о создании и распространении вирусов, троянов и других вредоносных программ!
4. За грамотно написанные и правильно оформленные статьи авторы награждаются DigiMoney.

Дополнительные ссылки:
Желаю творческих успехов! ;)

Модераторы: Jin X


  

> Определение текущего режима процессора, DOS, Общие вопросы
Master 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

___________
Я однажды проснусь, а вокруг мир другой: светел, чист, бесконечно прекрасен...
И не будет в помине озлобленных лиц, а на меньшее я не согласен...
© Н.Носков.
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:

> Форум на Исходниках.RU · Assembler FAQ





[ Script Execution time: 0.1162 ]   [ 16 queries used ]  

Rambler's Top100