Директивы ассемблера
Встроенный ассемблер Borland Pascal поддерживает три дирек- тивы ассемблера: DB (определить байт), DW (определить слово) и DD (определить двойное слово). Каждая из них генерирует данные, со- ответствующие разделенным запятым операндам, которые следуют за директивой.
Директива DB генерирует последовательность байт. Каждый опе- ранд может представлять собой выражение-константу со значением от -128 до 255, или строку символов любой длины. Выражение-константа генерирует 1 байт кода, а строки генерируют последовательность байт со значениями, соответствующим коду ASCII каждого символа.
Директива DW генерирует последовательность слов. Каждый опе- ранд может представлять собой выражение-константу со значением от -32768 до 65535, или адресное выражение. Для адресного выражения встроенный ассемблер генерирует указатель ближнего типа, что есть слово, содержащие смещения адреса.
Директива DD генерирует последовательность двойных слов. Каждый операнд может представлять собой выражение-константу со значением от -2147483648 до 4294967295 или адресное выражение. Для адресного выражения встроенный ассемблер генерирует указатель дальнего типа, что есть слово, содержащие смещения адреса, за ко- торым следует слово, содержащее сегментную часть адреса.
Данные, генерируемые по директивам DB, DW и DD, всегда запи- сываются в сегмент кода, аналогично коду, генерируемому другими операторами встроенного ассемблера. Чтобы сгенерировать инициали- зированные или неинициализированные данные в сегменте данных, вам следует использовать обычные описания Паскаля типа var или const.
Приведем некоторые примеры директив DB, DW и DD:
asm DB 00FH { 1 байт } DB 0,99 { 2 байта } DB 'A' { Ord('A) } DB 'Пример',0DH,OAH { строка, за которой следуют возврат каретки и перевод строки } DB 12,"Borland Pascal" { строка Паскаля } DW 0FFFFH { 1 слово } DW 0,9999 { 2 слова } DW 'A' { эквивалентно DB 'A',0 } DW 'BA' { эквивалентно DB 'A','B' } DW MyVar { смещение MyVar } DW MyProc { смещение MyProc } DD 0FFFFFFFH { 1 двойное слово } DD 0,99999999 { 2 двойных слова } DD 'A' { эквивалентно DB 'A',0,0,0 } DD 'DBCA' { эквивалентно DS 'A','B','C','D' } DD MyVar { указатель на MyVar } DD MyProc { указатель на MyProc } end;
В Турбо Ассемблере, когда перед идентификатором указывается DB, DW или DD, это приводит к генерации в том месте, где указана директива, переменной размером в байт, слово или двойное слово. Например, Турбо Ассемблер допускает следующее:
ByteVar DB ? WordVar DW ? . . . mov al,ByteVar mov bx,WordVar
Встроенный ассемблер не поддерживает такие описания перемен- ных. В Borland Pascal единственным видом идентификатора, который можно определить в операторе встроенного ассемблера, является метка. Все переменные должны описываться с помощью синтаксиса Паскаля, и предыдущая конструкция соответствует следующему:
var ByteVar: Byte; WordWat: Word; . . . asm mov al,ByteVar mov bx,WordVar end;