Использование turbo pascal с языком ассемблера. Встроенный ассемблер, страница 13

jl    SD2             ;да, перейти

cmp   Buffer[BX],DX   ;слишком велик?

jle   SD3             ;нет, перейти

SD2: push  ax              ;сохранить регистр

push  bx

push  cx

push  dx

push  Buffer[BX]      ;передать значение в Паскаль

CALL  RangeError      ;вызвать процедуру Паскаля

pop   dx              ;восстановить регистры

pop   cx

pop   bx

pop   ax

SD3: inc   BX              ;перейти к следующему элементу

inc   BX

loop  SD1             ;цикл для каждого элемента

SD4: ret                   ;возврат

CheckRange ENDP

CODE       ENDS

END

Пример на Turbo Assembler.

Здесь представлена версия предыдущей программы  на Ассемблере, которая показывает  преимущества  применения  Turbo  Assembler  при стыковке с Паскалем:

.MODEL  TPASCAL         ;модель кода Турбо-Паскаля

LOCALS  @@              ;определить префикс локальных меток

.DATA                   ;сегмент данных

EXTRN   Buffer: WORD, Count: WORD;      ;Переменные Паскаля

.CODE                          ;сегмент кода

EXTRN  RangeError: NEAR        ;реализован в Паскале

PUBLIC CheckRange              ;реализован здесь

ChechRange   Proc NEAR Min : WORD, Max : WORD

mov   ax,Min        ;загрузить Min в ax

mov   dx,Max        ;загрузить Max в dx

xor   bx,bx         ;очистить индекс данных

mov   cx,Count      ;загрузить Count

jcxz  @@4           ;пропустить если 0

@@1: cmp   ax,Buffer[BX] ;слишком мал?

jg    @@2           ;да, перейти на @@2

cmp   dx,Buffer[BX] ;слишком велик?

jge   @@3           ;нет, перейти на @@3

@@2: push  ax            ;сохранить регистр

push  bx

push  cx

push  dx

push  Buffer[BX]    ;передать значение в Паскаль

call  RangeError    ;вызвать процедуру Паскаля

pop   dx            ;восстановить регистры

pop   cx

pop   bx

pop   ax

@@3: inc   BX            ;перейти к следующему элементу

inc   BX

loop  @@1           ;цикл для каждого элемента

@@4: ret                 ;возврат

CheckRange ENDP

END

Заметим, что  .MODEL  TPASCAL  Turbo  Assembler  автоматически генерирует код входа до первой инструкции и код выхода для RET.

Встроенный машинный код.

Для очень  коротких  программ  на  Ассемблере удобно применять оператор  или  директиву  Inline.  Они   позволяют   Вам   вставить инструкции машинного кода прямо в текст программы или модуля вместо использования объектного файла.

Оператор Inline.

Оператор Inline  состоит  из зарезервированного слова Inline и следующих за ним одного или более  элементов,  разделенных  слэшами

(/) и заключенных в скобки:

inline(10/$2345/Count+1/Data-OffSet);

Синтаксис оператора Inline:

Каждый элемент   оператора   Inline   состоит   из  возможного указателя  размера,  <  или  >  и  константы   или   идентификатора переменной  идущими  за  0  или  более  указателями  смещения  (см.

синтаксис  ниже).  Указатель  смещения  состоит  из  +  или   -   с константой.

элемент inline

Каждый элемент оператора Inline генерирует 1 байт или  1 слово кода.   Значения  вычисляются  из  значения  первой  константы  или смещения идентификатора  переменной,  к  которому добавлено/вычтено значение каждой из констант, которые следуют за ним.

Элемент Inline генерирует 1 байт кода,  если он состоит только из  констант  и  если  их  значения  внутри  8-и битового диапазона

(0..255).  Если значение выходит за 8-и битовый диапазон,  или если элемент  Inline  ссылается к переменной - генерируется код длиной в одно слово (меньший значащий байт стоит первым).

Операторы <  и  >  могут  быть  использованы  для того,  чтобы перекрыть  автоматический  выбор  размера,  описанный  ранее.  Если элемент  Inline  начинается  с  оператора  <,  только  меньший байт значения будет кодироваться,  даже если это 16-и битовое  значение.

Если элемент Inline начинается с оператора >, то будет кодироваться слово, даже если наибольший байт равен 0. Например, оператор