Передача параметров из Pascal-программы в программу на ассемблере

End.

Begin

Требования к программе на языке Pascal

Требования к программе на языке Assembler

Mov ah,0

Asm

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

End.

Begin

Const

Операторы типа inline

Внешние процедуры

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

Операторы типа inline

Связь Assembler с языками высокого уровня

End begin

Cseg ends

Begin endp

Ret

Begin proc far

Data ends

Stack ends

Endm

Mov ah, 09h

Lea dx, mes

Promt macro mes

Пример программы, использующей макрокоманды

Особенности трансляции при получении объектного модуля

Если в тексте программы указать имя (макрокоманду), то будет выполнен код макроопределения с учетом фактических параметров.

ENDM

 

1. Происходит вставка макрорасширений в то место программы, где находятся макрокоманды.

2. Формируется модуль с расширением .obj.

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

Где можно разместить макроопределение?

1. В тексте модуля, но до объявления сегментов.

2. В отдельном файле, который создает программист. Этот файл должен быть вставлен транслятором с помощью директивы INCLUDE <имя>.

3. Использование макробиблиотек.

 

int 21h

stack segment para stack 'stack'

dw 32 dup(?)

data segment para 'data'

mes1 db 'test of macro', '$'

mes2 db 'assembler', '$'

cseg segment para 'code'

promt mes1 ; вывод первого сообщения

promt mes2 ; вывод второго сообщения

Для взаимодействия программы на языке Assembler с программой на Паскале можно использовать:

 

Пример:

n=7;

massiv: array[1..n] of integer = (1,2,3,2,17,7,2);

function max(var mas, n:integer):integer;

inline ($59/ $5E/ … $8B/$C3); набор машинных команд

writeln('Максимум', max(massiv,N) );

readln;

 

Пример:

int 16h

end;

 

Встроенный Assembler обладает ограниченными возможностями.

· Написать процедуру ближнего или дальнего типа.

· Объявить эту процедуру с помощью директивы public.

· Произвести компиляцию для получения объектного файла:

TASM/zi имя

1. Нужно объявить вызываемую процедуру как внешнюю

Procedure <имя> [пар]; external;

2.Необходимо указать путь к файлу, в котором содержится модуль программы на ассемблере: {$L <путь>}.

3.Чтобы программа могла работать под отладчиком, ввести в программу директиву {$D+}

 

Пример:

Program mxpas;

{$D+}

uses crt;

procedure asmproc (ch:char; x, y, kol:integer); external;

{$L <файл на ассемблере>}

clrscr;

asmproc ('a',1,2,3);

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

· Сохранить содержимое регистра BP в стеке.

· Записать в регистр BP адрес вершины стека

· Все обращения к стеку следует выполнять, используя базовый регистр BP

· При возврате управления в программу на Pascal программа на Assembler должна выполнить очищение стека, а именно: восстановить содержимое регистра BP, удалить из стека переданные процедуре аргументы.

 
BP
CS
IP
PAR4
PAR3
PAR2
PAR1

[BP+12] – чтение PAR1

Использование директивы model для организации взаимодействия программ

При использовании директивы программа на Assembler может использовать имена переменных, объявленных в Pascal-программе.

 

Пример программы на Assembler с директивой model: