<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=89436&amp;view=findpost&amp;p=667094</guid>
        <pubDate>Fri, 01 Apr 2005 14:14:18 +0000</pubDate>
        <title>Определение текущего режима процессора</title>
        <link>https://forum.sources.ru/index.php?showtopic=89436&amp;view=findpost&amp;p=667094</link>
        <description><![CDATA[Jin X:  <br>
<div class='tag-align-center'><span class='tag-size' data-value='13' style='font-size:13pt;'><span class="tag-color tag-color-named" data-value="blue" style="color: blue"><strong class='tag-b'>Определение текущего режима работы процессора</strong></span></span></div><br>
Для начала неплохо бы удостовериться, что наш процессор не хуже 80286, т.к. иначе компьютер повиснет (хотя, для такого старого процессора проверку можно и не делать), а затем уже проверить <strong class='tag-b'>PE</strong>-флаг (Protection Enable) регистра <strong class='tag-b'>MSW</strong>. Да, да, именно <strong class='tag-b'>MSW</strong>, а не <strong class='tag-b'>CR0</strong>, т.к. во-первых, регистра <strong class='tag-b'>CR0</strong> в процессоре 80286 нет, а во-вторых, вам никто не позволит прочесть содержимое <strong class='tag-b'>CR0</strong> из виртуального режима. Т.о, если <strong class='tag-b'>PE</strong>-флаг сброшен, значит процессор находится в режиме реальных адресов (RMode), а если установлен, то, соответственно, в режиме виртуального процессора 8086 (VMode).<br>
<br>
<strong class='tag-b'>P.S.</strong> Для тех, кто не в курсе сообщаю, что DOS-программа выполняться в защищённом режиме не может (если только она сама не установит его), а при запуске из-под Windows процессор переключается в виртуальный режим.<br>
<br>
А вот и исходник (в формате DOS COM):<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">; tasm /m cpumode.asm</div><div class="code_line">; tlink /t /x cpumode.obj</div><div class="code_line">&nbsp;</div><div class="code_line">.MODEL Tiny</div><div class="code_line">.286P</div><div class="code_line">.CODE</div><div class="code_line">ORG 100h</div><div class="code_line">&nbsp;</div><div class="code_line">Start:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov ah,9</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;lea dx,Header</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int 21h &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; Выводим первую половину фразы :)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;lea dx,RMode &nbsp; &nbsp; &nbsp; ; Готовим сообщение для RMode</div><div class="code_line">&nbsp;</div><div class="code_line">; Проверяем процессор 80286 (эту часть можно опустить)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov ah,2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; Нас волнуют только биты 12-15 и 9 (IF) AX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;push &nbsp; &nbsp;ax</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;popf &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; Сбрасываем биты 12-15 флагов</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pushf</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;pop ax &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; И читаем их</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;or &nbsp;ah,ah &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; Если бит 15 установлен, значит это 80(1)86</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;js &nbsp;RModeIsSet &nbsp; &nbsp; ; ...и в VMode процессор находиться не может</div><div class="code_line">&nbsp;</div><div class="code_line">; Проверяем PE-флаг</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;smsw &nbsp; &nbsp;ax &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; Записываем MSW в AX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;test &nbsp; &nbsp;al,1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; Проверяем PE-флаг (бит 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;jz &nbsp;RModeIsSet &nbsp; &nbsp; ; Прыгаем, если он сброшен</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;lea dx,VMode &nbsp; &nbsp; &nbsp; ; Иначе готовим сообщение для VMode</div><div class="code_line">RModeIsSet:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;mov ah,9</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int 21h &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; Выводим вторую половину фразы</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int 20h &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; Выходим из программы</div><div class="code_line">&nbsp;</div><div class="code_line">Header &nbsp; &nbsp; &nbsp;db &nbsp;&#39;Процессор находится в режиме $&#39;</div><div class="code_line">RMode &nbsp; &nbsp; &nbsp; db &nbsp;&#39;реальных адресов!&#39;,13,10,&#39;$&#39;</div><div class="code_line">VMode &nbsp; &nbsp; &nbsp; db &nbsp;&#39;виртуального процессора 8086!&#39;,13,10,&#39;$&#39;</div><div class="code_line">&nbsp;</div><div class="code_line">END &nbsp; &nbsp; Start</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Jin X</author>
        <category>Assembler FAQ</category>
      </item>
	
      </channel>
      </rss>
	