<?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=75923&amp;view=findpost&amp;p=541958</guid>
        <pubDate>Mon, 13 Dec 2004 13:21:18 +0000</pubDate>
        <title>Встроенный ассемблер</title>
        <link>https://forum.sources.ru/index.php?showtopic=75923&amp;view=findpost&amp;p=541958</link>
        <description><![CDATA[Азат: <strong class='tag-b'>Ассемблерные процедуры.</strong><br>
<br>
Синтаксис.<br>
<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">procedure названиепроцедуры(параметры); assembler;</div><div class="code_line">&nbsp;&nbsp;asm</div><div class="code_line">&nbsp;&nbsp; &nbsp;...</div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
например:<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">procedure ShowMouse; assembler;</div><div class="code_line">&nbsp;&nbsp;asm</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov ax,01h</div><div class="code_line">&nbsp;&nbsp; &nbsp;int 33h </div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'>Ассемблерные функции.</strong><br>
<br>
Синтаксис: <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">function названиефункции(параметры):значение; assembler; </div><div class="code_line">&nbsp;&nbsp;asm</div><div class="code_line">&nbsp;&nbsp; &nbsp;...</div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div><br>
<br>
Результат функции записывается в регистры. А именно:<ul class="tag-list"><li>длиной 1 байт (Byte, Char и т.п.) - в регистре AL; </li><li>длиной 2 байта (Integer, Word) - в регистре АХ; </li><li>длиной 4 байта (Pointer, LongInt) - в регистрах DX (старшее слово) и АХ (младшее слово);</li><li>типа Real - в регистрах DX, BX, АХ (старшее слово - в DX, младшее в АХ); </li><li>вещественных типов Single, Double, Extended, Comp - в регистре ST (0) сопроцессора; </li><li>строкового типа - во временной области памяти, на которую ссылается @Result.</li></ul><br>
Пример:<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">function Shogen(a,b:integer):integer; assembler;</div><div class="code_line">&nbsp;&nbsp;asm</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov ax,a</div><div class="code_line">&nbsp;&nbsp; &nbsp;adс ax,b</div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div><br>
<br>
Литература<br>
  Фаронов В. В. Турбо паскаль: начальный курс<br>
  Форум на исходниках]]></description>
        <author>Азат</author>
        <category>Pascal: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=75923&amp;view=findpost&amp;p=541929</guid>
        <pubDate>Mon, 13 Dec 2004 13:03:32 +0000</pubDate>
        <title>Встроенный ассемблер</title>
        <link>https://forum.sources.ru/index.php?showtopic=75923&amp;view=findpost&amp;p=541929</link>
        <description><![CDATA[KiRiK: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=75923&view=findpost&p=541905'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Азат &#064; 13.12.04, 15:35</span><div class='quote '>Здесь уж совсем все просто. Ниже приводится пример выводящий курсор мыши на экран. <br>
asm<br>
  mov ax,01h {ax := 1}<br>
  int 33h    {33h - прерывание мышки}<br>
end;</div></div><br>
Я бы сделал вот так:<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">BEGIN</div><div class="code_line">&nbsp;&nbsp;Asm</div><div class="code_line">&nbsp;&nbsp; &nbsp;MOV &nbsp; AX,11h {ставим графику}</div><div class="code_line">&nbsp;&nbsp; &nbsp;INT &nbsp; 10h</div><div class="code_line">&nbsp;&nbsp; &nbsp;MOV &nbsp; AX,00h {инициализируем мышку}</div><div class="code_line">&nbsp;&nbsp; &nbsp;INT &nbsp; 33h</div><div class="code_line">&nbsp;&nbsp; &nbsp;MOV &nbsp; AX,01h {показываем мышку}</div><div class="code_line">&nbsp;&nbsp; &nbsp;INT &nbsp; 33h</div><div class="code_line">&nbsp;&nbsp; @LOOP: &nbsp; &nbsp; &nbsp; &nbsp;{балуемся - бесконечный цикл}</div><div class="code_line">&nbsp;&nbsp; &nbsp;JMP &nbsp;@LOOP</div><div class="code_line">&nbsp;&nbsp;End</div><div class="code_line">END.</div></ol></div></div></div></div>]]></description>
        <author>KiRiK</author>
        <category>Pascal: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=75923&amp;view=findpost&amp;p=541905</guid>
        <pubDate>Mon, 13 Dec 2004 12:35:14 +0000</pubDate>
        <title>Встроенный ассемблер</title>
        <link>https://forum.sources.ru/index.php?showtopic=75923&amp;view=findpost&amp;p=541905</link>
        <description><![CDATA[Азат: <div class='tag-align-center'><span class="tag-color tag-color-named" data-value="red" style="color: red"><span class='tag-size' data-value='14' style='font-size:14pt;'><strong class='tag-b'>Встроенный ассемблер</strong></span></span></div><br>
<br>
Я думаю, что все, кто хоть немного знаком с Турбо Паскалем, знают, что в нем есть такая хитрая штука, которая называется встроенным ассемблером, но далеко не все новички умеют им работать. Встроенный ассемблер (далее - просто ассемблер) дает возможность программировать на уровне отдельных машинных инструкций. Это - главное отличие ассемблера от Паскаля и в этом отличии сосредоточены все его достоинства и недостатки. Достоинство заключается в том, что, программируя на ассемблере, программист обычно выбирает последовательность машинных инструкций так, чтобы реализовать нужные вычисления с максимальной скоростью при минимальных затратах памяти, в то время как даже такой весьма совершенный компилятор, как Турбо Паскаль, неизбежно вносит в машинный код некоторую избыточность, уменьшающую скорость счета и увеличивающую затраты памяти. С другой стороны, программирование на уровне машинных инструкций - чрезвычайно хлопотное занятие и не может сравниться по скорости разработки программ с программированием на Паскале - в этом заключается главный недостаток ассемблера. <br>
<br>
Ассемблерные инструкции пишутся примерно так:<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">program program_name;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;...</div><div class="code_line">&nbsp;&nbsp;asm</div><div class="code_line">&nbsp;&nbsp; &nbsp;... &nbsp;{Здесь располагаются ассемблерные инструкции}</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;...</div><div class="code_line">end.</div></ol></div></div></div></div><br>
<br>
Операторы asm...end работают, как операндные скобки begin...end. т.е. можно делать так:<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">for i := 1 to 100 do </div><div class="code_line">&nbsp;&nbsp;asm</div><div class="code_line">&nbsp;&nbsp; &nbsp;...</div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div><br>
и так:<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">if ((i=0) and (k&#60;&#62;6)) or (t div 5 - 7 = 99)) xor (r=0) then</div><div class="code_line">&nbsp;&nbsp;asm</div><div class="code_line">&nbsp;&nbsp; &nbsp;...</div><div class="code_line">&nbsp;&nbsp;end;</div></ol></div></div></div></div><br>
<br>
<br>
<span class='tag-u'>Регистры</span><br>
<br>
В Турбо Паскале (вернее в МП 8086/8088) имеется 14 регистров. Их можно поделить на 5 групп:<br>
<ul class="tag-list"><li>регистры общего назначения (АХ, ВХ, СХ, DX); предназначены для хранения операндов и выполнения основных команд; любой из них может использоваться как совокупность двух независящих друг от друга 8-разрядных регистров: старшего байта регистра (АН, ВН, СН, DH) и младшего байта (AL, BL, CL, DL); например, АХ состоит из АН и AL; </li><li>сегментные регистры (CS, DS, SS, ES); используются для указания сегмента при адресации памяти; </li><li>регистры-указатели (SP, BP, IP); используются для указания смещения при адресации памяти;</li><li>индексные регистры (SI, DI); применяются для индексной адресации; </li><li>регистр флагов. используется для хранения признаков состояния процессора.</li></ul><br>
Теперь подробнее: <br>
<br>
<strong class='tag-b'>AX,BX,CX,DX</strong> можно использовать как переменные.<br>
<strong class='tag-b'>CS, DS, SS, ES</strong> используются для указания сегмента. В частности <br>
<strong class='tag-b'>CS</strong> - Содержит номер сегмента памяти (сегмента кода), в котором располагается текущая машинная инструкция<br>
<strong class='tag-b'>DS</strong> - Содержит номер сегмента памяти (сегмента данных), в котором располагаются данные (константы и переменные)<br>
<strong class='tag-b'>SS</strong> - Это сегмент Стека, а <strong class='tag-b'>ES</strong> это... это дополнительный сегментный регистр, который используется для межсегментного обмена данными и в некоторых строковых операциях<br>
<strong class='tag-b'>SP</strong> - Указывает на вершину стека. Совместно с регистром <strong class='tag-b'>SS</strong> он адресует ячейку, куда будет помещаться/извлекаться операнд. <strong class='tag-b'>BP</strong> - т.н. указатель базы. Облегчает создание и использование локального стека. <strong class='tag-b'>IP</strong> - Определяет смещение относительно начала сегмента кода <strong class='tag-b'>CS</strong> очередной исполняемой машинной инструкции. Содержимое <strong class='tag-b'>IP</strong> автоматически изменяется в ходе исполнения инструкции, обеспечивая правильный порядок выборки команд из памяти. <br>
<strong class='tag-b'>SI</strong> - Определяет адрес источника информации при индексной адресации данных. По умолчанию используется в паре с <strong class='tag-b'>DS</strong>. <strong class='tag-b'>DI</strong> - определяет приемник информации при межсегментном обмене данными. По умолчанию - в паре с <strong class='tag-b'>ES</strong>.<br>
<br>
<br>
<strong class='tag-b'>Команды.</strong><br>
<br>
Ниже приведены команды, которые используются при использовании встроенного Ассемблера.<br>
<br>
<span class='tag-u'>Команды пересылки данных</span><br>
<br>
<strong class='tag-b'>MOV</strong>  - Переслать значение.<br>
<strong class='tag-b'>push </strong>- &quot;Загнать&quot; в стек<br>
<strong class='tag-b'>pop  </strong>- Извлечь из стека<br>
<strong class='tag-b'>xchg </strong>- Обменять значения<br>
<br>
<strong class='tag-b'>mov</strong>, <strong class='tag-b'>xchg</strong> нельзя использовать для пересылки из памяти в память:<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">var</div><div class="code_line">&nbsp;&nbsp;a,b:integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;...</div><div class="code_line">&nbsp;&nbsp;asm</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov a,b {Ошибка!!!}</div><div class="code_line">&nbsp;&nbsp; { Надо так:}</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov ax,b</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov a,ax</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;...</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
Вот пример. (В комментариях - код на Паскале, чтобы было легче разобраться)<br>
<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">asm</div><div class="code_line">&nbsp;&nbsp;mov ax,60 {ax := 60}</div><div class="code_line">&nbsp;&nbsp;push ax</div><div class="code_line">&nbsp;&nbsp;mov bx,88 {bx := 88}</div><div class="code_line">&nbsp;&nbsp;mov ax,bx {ax := bx}</div><div class="code_line">&nbsp;&nbsp;pop ax &nbsp; &nbsp;{!!!ax := 60!!!}</div><div class="code_line">&nbsp;&nbsp;xchg ax,bx {ax = 60, bx = 88 -&#62; ax = 88, bx = 60}</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
<span class='tag-u'>Арифметические команды.</span><br>
<br>
<strong class='tag-b'>ADD</strong> Сложить<br>
<strong class='tag-b'>ADC</strong> Сложить, добавить перенос<br>
<strong class='tag-b'>INC</strong> Увеличить на единицу<br>
 <br>
<strong class='tag-b'>SUB</strong> Вычесть<br>
<strong class='tag-b'>SBB</strong> Вычесть с заёмом<br>
<strong class='tag-b'>DEC</strong> Уменьшить на единицу<br>
<br>
<strong class='tag-b'>MUL</strong> Умножить<br>
<strong class='tag-b'>iMUL</strong> Умножить со знаком<br>
<br>
<strong class='tag-b'>DIV</strong>  Поделить<br>
<strong class='tag-b'>iDIV</strong> Поделить со знаком<br>
<br>
Вот пример - программа выполняющая над двумя числами 4 арифметические операции<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">program asm_test_arifnetika;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;a,b,c:integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;ReadLn(a,b);</div><div class="code_line">&nbsp;&nbsp;asm</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov ax,a {ax := a}</div><div class="code_line">&nbsp;&nbsp; &nbsp;adc ax,b {ax := ax+b}</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov c,ax {c := ax}</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;WriteLn(&#39;Сумма a и b = &#39;,c);</div><div class="code_line">&nbsp;&nbsp;asm</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov ax,a {ax := a}</div><div class="code_line">&nbsp;&nbsp; &nbsp;sbb ax,b {ax := ax - b}</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov c,ax {c := ax}</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;WriteLn(&#39;Разность a и b = &#39;,c);</div><div class="code_line">&nbsp;&nbsp;asm</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov ax,a {ax := a}</div><div class="code_line">&nbsp;&nbsp; imul ax,b {ax := ax*b}</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov c,ax {c := ax}</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;WriteLn(&#39;Произведение a и b = &#39;,c);</div><div class="code_line">&nbsp;&nbsp;asm</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov ax,a {ax := a}</div><div class="code_line">&nbsp;&nbsp; idiv ax,b {ax := ax div b}</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov c,ax {c := ax}</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;WriteLn(&#39;Частное a и b = &#39;,c)</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
Вот. Теперь...<br>
<span class='tag-u'>Битовые команды:</span><br>
<strong class='tag-b'>and<br>
or<br>
xor<br>
not<br>
shl<br>
shr<br>
</strong><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">{and, и все остальные бинарные команды в ассемблере работают не совсем так, как в Паскале, а именно:}</div><div class="code_line">asm</div><div class="code_line">&nbsp;&nbsp;and ax,bx {будет означать ax := ax and bx}</div><div class="code_line">end;</div></ol></div></div></div></div> <br>
<br>
<br>
<strong class='tag-b'>Условия.</strong><br>
<br>
Синтаксис написания условий в ассемблере значительно отличается от Паскаля. Попробую объяснить что и как. Думаю, что легче всего на примере. Программа (вернее её фрагмент) гениален. Она выполняет <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">&nbsp;&nbsp;if a=0 then b := 7;</div></ol></div></div></div></div><br>
Примерно так это бужет выглядеть на асме<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">asm</div><div class="code_line">&nbsp;&nbsp;cmp a,0 &nbsp;{?a=0?}</div><div class="code_line">&nbsp;&nbsp;jne @ &nbsp; &nbsp;{нет - перейти к концу}</div><div class="code_line">&nbsp;&nbsp;mov b,7 &nbsp;{b := 7}</div><div class="code_line">@:</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
Вот. Сначала идет оператор cmp и два сравниваемых параметра через запятую. На следующей строчке идет параметр сравнения. В данном случае он расшифровывается как перейти, если не равны.<br>
Вот все параметры условий:<br>
<br>
Операция больше:<br>
 <strong class='tag-b'>JA </strong>- для беззнаковых чисел<br>
 <strong class='tag-b'>JG </strong>- для чисел со знаком<br>
<br>
Числа равны - <strong class='tag-b'>JE</strong><br>
 <br>
Операция меньше:<br>
 <strong class='tag-b'>JB </strong>- для беззнаковых чисел<br>
 <strong class='tag-b'>JL</strong> - для чисел со знаком<br>
 <br>
Операция больше или равно:<br>
 <strong class='tag-b'>JAE </strong>- для беззнаковых чисел<br>
 <strong class='tag-b'>JGE </strong>- для чисел со знаком<br>
 <br>
Операция меньше или равно:<br>
 <strong class='tag-b'>JBE </strong>- для беззнаковых чисел<br>
 <strong class='tag-b'>JLE </strong>- для чисел со знаком<br>
 <br>
Не равно - <strong class='tag-b'>JNE</strong><br>
<br>
Новички часто путаются с написанием условий на ассемблере т.к. логика при их написании должна быть совсем другая.<br>
<br>
<strong class='tag-b'>Прерывания.</strong><br>
 <br>
Здесь уж совсем все просто. Ниже приводится пример выводящий курсор мыши на экран. <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">asm</div><div class="code_line">&nbsp;&nbsp;mov ax,01h {ax := 1}</div><div class="code_line">&nbsp;&nbsp;int 33h &nbsp; &nbsp;{33h - прерывание мышки}</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>Азат</author>
        <category>Pascal: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	