На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Все статьи должны быть оформлены согласно Правил оформления статей.
2. Любые обсуждения должны происходить в специальной теме, обсуждение в любых других темах раздела запрещены.
3. Запрещается писать статьи о создании и распространении вирусов, троянов и других вредоносных программ!
4. За грамотно написанные и правильно оформленные статьи авторы награждаются DigiMoney.

Дополнительные ссылки:
Желаю творческих успехов! ;)
Модераторы: Jin X
  
    > Определение текущего режима процессора , DOS, Общие вопросы
       
      Определение текущего режима работы процессора

      Для начала неплохо бы удостовериться, что наш процессор не хуже 80286, т.к. иначе компьютер повиснет (хотя, для такого старого процессора проверку можно и не делать), а затем уже проверить PE-флаг (Protection Enable) регистра MSW. Да, да, именно MSW, а не CR0, т.к. во-первых, регистра CR0 в процессоре 80286 нет, а во-вторых, вам никто не позволит прочесть содержимое CR0 из виртуального режима. Т.о, если PE-флаг сброшен, значит процессор находится в режиме реальных адресов (RMode), а если установлен, то, соответственно, в режиме виртуального процессора 8086 (VMode).

      P.S. Для тех, кто не в курсе сообщаю, что DOS-программа выполняться в защищённом режиме не может (если только она сама не установит его), а при запуске из-под Windows процессор переключается в виртуальный режим.

      А вот и исходник (в формате DOS COM):
      ExpandedWrap disabled
        ; 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
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0166 ]   [ 15 queries used ]   [ Generated: 28.03.24, 22:52 GMT ]