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