Новости           

Программы

Turbo Pascal

Игры

Документация

"Странности"

FAQ

Ссылки

Благодарности

Гостевая книга

От автора

Встроенный код ассемблера 

              В отличие от стандартного Паскаля в Турбо Паскале предусмат-
         ривается возможность непосредственного включения кода на  ассемб-
         лере. Таким образом, нет необходимости составлять отдельную внеш-
         нюю подпрограмму. Такой подход имеет два преимущества: во-первых,
         программист  не должен писать код,  реализующий связь между прог-
         раммами; во-вторых, весь код расположен в одном месте, что делает
         простой сопровождение программы. Единственный недостаток заключа-
         ется в том, что встроенный код ассемблера имеет неудобный формат.
              Оператор "inline" позволяет внутри программы на Турбо Паска-
         ле использовать код на ассемблере.  Общая форма  этого  оператора
         будет следующей:
              inline (значение/.../значение);  где "значение" представляет
         собой  любую  правильную  инструкцию  ассемблера или данные.  Для
         ссылки на счетчик адреса может использоваться звездочка.  (В  ас-
         семблере  процессора  8088  для  этой  цели используется валютный
         знак.  Поскольку в Турбо Паскале валютный знак  используется  для
         шестнадцатиричных  чисел,  то для обозначения счетчика адреса ис-
         пользуется звездочка).
              Для малых значений,  которые могут разместиться в одном бай-
         те,  используется только один байт. В противном случае для хране-
         ния  переменной используются два байта.  Если вы хотите поступить
         иначе, то следует воспользоваться директивами ">" и "<". Если пе-
         ред  значением  стоит  знак  меньше,  то будет использован только
         младший байт.  Если перед значением стоит знак больше,  то  будет
         сформировано  двубайтовое слово с нулевым старшим байтом.  Напри-
         мер, <$1234 приведет к формированию только одного байта со значе-
         нием $34, a >$12 приведет к формированию двух байт со значением $
         0012.
              Следующая короткая  программа  перемножает  два целых числа,
         используя функцию "Mul", которая использует код на ассемблере для
         выполнения  действительного  умножения.  Сравните эту программу с
         внешней подпрограммой "xmul",  которая рассматривалась в предыду-
         щем разделе.

              { пример встроенного кода ассемблера }
              program asm_inline;

              var
                a, b, c: integer;

              function Mul(x, y: integer): integer;
              begin
                inline($80/$46/$04/   {mov ax,[bp]+4}
                       $F6/366/$06/   {mul [bp]+6   }
                       $89/$EC/       {mov sp,bp}
                       $56/           {pop bp}
                       $02/$06/$00/   {ret 6}

                end;

              begin
                a: = 10;
                b: = 20;
                c: = Mul(a,b);
                WriteLn(c);
              end.

              В данном случае компилятор Турбо Паскаля автоматически гене-
         рирует  код  для возврата из функции.  Когда компилятор встречает
         оператор "inline",  в этом месте он генерирует указанные операто-
         ром машинные инструкции.
              Часто встроенный код ассемблера используется для обеспечения
         связи с оборудованием,  которое не поддерживается непосредственно
         в языке Турбо Паскаль. Например, приводимая ниже подпрограмма мо-
         жет  использоваться  для  включения вентилятора,  когда показание
         датчика температуры достигнет  определенной  величины.  В  данном
         случае  предполагается,  что установка в единичное значение порта
         200 приводит к включению вентилятора:

              procedure fan(temp:integer);
             {вентилятор  включается,  когда  температура достигнет 100
                       градусов }
              begin
                if temp>=100 then
                  inline(100/00/01/  {mov AX,1}
                         $E7/$C8);   {out 200,AX}
              end;

              Следует помнить,  что компилятор Турбо Паскаля  обеспечивает
         необходимый код для входа и выхода из функции. Пользователю необ-
         ходимо лишь обеспечить тело функции и придерживаться соглашений о
         связях при доступе к аргументам.
              При использовании указанного метода создается  машинно-зави-
         симый код, что затрудняет перенос программы на новую машину или в
         среду новой операционной системы.  Однако в  тех  случаях,  когда
         нельзя обойтись без кода ассемблера, применение указанного метода
         оправдано.

(с)Все права защищены

По всем интересующим вопросампрошу писать на электронный адрес

    Rambler's Top100 PROext: Top 1000
    Rambler's Top100 Яндекс цитирования
Hosted by uCoz