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

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

Паскаля и к ним можно обратиться через сегментный регистр DS.

Ко всем  процедурам,  функциям  и  переменным,  объявленным  в программе или  модуле  на  Паскале и объявленным в секции interface

используемых модулей,  можно обратиться из программы на  Ассемблере через директиву EXTRN.  Конечно,  Вы должны использовать корректный тип в описании EXTRN.

Когда в  директиве $L появляется объектный файл,  Turbo Pascal

преобразует этот файл из перемещаемого  формата  объектного  модуля

Intel   (.OBJ)   в   свой   внутренний   перемещаемый  формат.  Это преобразование возможно только при соблюдении правил:

- Все процедуры должны быть размещены в сегменте с именем CODE

или CSEG,  или  в  сегменте,  чье  имя  оканчивается на _TEXT.  Все инициализированные локальные  переменные   должны   размещаться   в сегменте с  именем  CONST или сегменте с именем,  оканчивающимся на

_DATA. Все неинициализированные локальные  переменные  должны  быть размещены в  сегменте  с  именем  DATA  или DSEG,  или в сегменте с именем, оканчивающимся на _BSS.  Все другие сегменты  игнорируются, также, как  и  директива GROUP.  Описания сегментов могут указывать выравнивание BYTE или WORD;  при  редактировании  кодовые  сегменты всегда выравнены  на  байт,  а  сегменты данных всегда выравнены на слово. Описание сегментов могут указывать PUBLIC и имя  класса,  но они игнорируются.

- Turbo  Pascal игнорирует все данные для сегментов,  отличных от сегментов  кода  (CODE,   CSEG   или   xxxх_TEXT)   и   сегменты инициализированных данных (CONST или xxxx_DATA).  Когда объявляется переменные в сегменте неинициализированных данных (DATA,  DSEG  или

xxxx_BSS), всегда  используйте  знак  (?)  для  указания  значений, например:

Count   DW ?

Buffer  DB 128 DUP(?)

- Однобайтовые   ссылки  к  EXTRN  символам  недопустимы.  Это означает,  что операторы HIGH и LOW не могут  быть  использованы  с

EXTRN символами.

Turbo Assembler и Turbo Pascal.

Turbo Assembler (TASM) позволяет просто  писать  программы  на ассемблере  и  связывать  их  с Вашими программами на Turbo Pascal.

Turbo Assembler обеспечивает простую сегментацию,  модели памяти  и языковую поддержку для программистов на Turbo Pascal.

Использование TPASCAL  с   директивой   .MODEL   устанавливает соглашения  о вызовах Паскаля,  определяет имена сегментов,  делает

PUSH BP и MOV BP,SP и также устанавливает возврат через  POP  BP  и

RET N (где N число байтов параметров).

Директива PROC позволяет Вам определять ваши параметры  в  том же порядке,  как они определены в Вашей программе на Паскале.  Если

Вы определяете функцию,  которая возвращает  строку,  помните,  что директива PROC   имеет   опцию   RETURNS,   которая  позволяет  Вам обращаться к указателю на временную строку в стеке без  учета числа байт параметров, добавленных к оператору RET.

Пример кода с использованием директив .MODEL и PROC:

.MODEL TPASCAL

.CODE

MyProc  PROC FAR I: Byte, J: Byte RETURNS Result: DWORD

PUBLIC MyProc

les  DI,Result   ; получить адрес временной строки

mov  AL,I        ; получить первый параметр I

mov  BL,J        ; получить второй параметр J

...

ret

Описание функции на Паскале:

function MyProc(I, J: Char): string; external;

Примеры программ на Ассемблере.

Здесь представлен   пример   модуля,   который  реализует  две программы  обработки  строк  на   Ассемблере.   Функция   UpperCase

преобразует  все  символы  в  строке в заглавные.  Функция StringOf

возвращает строку символов заданной длины.

unit Strings;

interfase

function UpperCase(S: String): String;

function StringOf(Ch: Char; Count: Byte): String;

implementation

{$L STRS}

function UpperCase; external;