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. Например, оператор
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.