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

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

Ассемблеру генерировать безусловный ближний или дальний  переход на метку, используя   конструкцию  NEAR  PTR  или  FAR  PTR.  Например операторы

jmp NEAR PTR Stop

jmp FAR PTR Stop

всегда генерируют  ближний  и  дальний переходы соответственно, даже если Stop внутри диапазона короткого перехода.

Директивы Ассемблера.

Встроенный Ассемблер  Turbo  Pascal  поддерживает  3 директивы

Ассемблера:

DB, DW, DD (определить байт, слово и двойное слово)

Они генерируют данные,  соответствующие операндам, разделенным запятыми, в этой директиве.

Директива DB   генерирует   последовательность   байт.  Каждый операнд может быть константным выражением со значением от  -128  до

255 или   строкой   символов  любой  длины.  Константное  выражение генерирует 1 байт кода, а строка генерирует последовательность байт со значениями, соответствующими ASCII кода каждого символа.

Директива DW   генерирует   последовательность   слов.  Каждый операнд может быть константным выражением со значением от -32768 до

65535 или  адресным выражением.  Для адресного выражения встроенный

Ассемблер генерирует ближний указатель,  который содержит  смещение этого адреса.

Директива DD   генерирует   последовательность  двойных  слов.

Каждый операнд может быть константным выражением  со  значением  от

-2,147,483,648 до   4,294,967,295   или  адресным  выражением.  Для адресного  выражения  встроенный   Ассемблер   генерирует   дальний указатель, который содержит и смещение и сегментную часть адреса.

Данные, генерируемые директивами DB,  DW, DD всегда хранятся в кодовом сегменте так же,  как код, генерируемый другими операторами встроенного Ассемблера. Чтобы генерировать неинициализированные или инициализированные данные, в сегменте данных Вы должны использовать обычные объявления Var или Const Паскаля.

Примеры директив DB, DW, DD:

asm

DB   0FFH

DB   0,99

DB   'A'

DB   'Hello world...',0DH,0AH

DB   12,"Turbo Pascal"

DW   0FFFFH

DW   0,9999

DW   'A'

DW   'BA'

DW   MyVar

DW   MyProc

DD   0FFFFFFFFH

DD   0,999999999

DD   'A'

DD   'DCBA'

DD   MyVar

DD   MyProc

end;

Примечание: В Turbo Assembler, когда идентификатор стоит перед директивой DB,  DW и  DD,  это  приводит  к  объявлению  переменной размером в байт,  слово или двойное слово по адресу этой директивы.

Например, Turbo Assembler разрешает:

ByteVar   DB    ?

WordVar   DW    ?

...

mov   al,ByteVar

mov   bx,WordVar

Встроенный Ассемблер   не   поддерживает   такое    объявление переменных. В Turbo Pascal единственный символ,  который может быть определен в операторе  встроенного  Ассемблера  -  это  метка.  Все переменные должны   быть   объявлены  с  использованием  синтаксиса

Паскаля и предыдущий пример соответствует:

var

ByteVar: Byte;

WordVar: Word;

...

asm

mov   al,ByteVar

mov   bx,WordVar

end;

Операнды.

Операнды встроенного   Ассемблера  -  это  выражения,  которые состоят из комбинации констант,  регистров,  символов и операторов.

Хотя выражения встроенного Ассемблера строятся с использованием тех же основных принципов,  что и  выражения  Паскаля,  существует  ряд важных отличий, которые объясняются ниже.

Внутри операндов  следующие  зарезервированные  слова имеют во встроенном Ассемблере предопределенный смысл:

AH           CL           FAR           SEG

AL           CS           HIGH          SHL

AND          CX           LOW           SHR

AX           DH           MOD           SI

BH           DI           NEAR          SP

BL           DL           NOT           SS

BP           DS           OFFSET        ST

BX           DWORD        OR            TBYTE

BYTE         DX           PTR           TYPE

CH           ES           QWORD         WORD