
ПТСПЦУВСБ / 8.Связь ASSEMBLER и PASCAL
.docxСуществует соглашения для связи ассемблера с каждым из языков. Здесь есть свои особенности.
-
Способ передачи управления (тип вызова). В Pascal, если ассемблеровская процедура описана в основной программе или в implementation, то она вызывается как NEAR; при описании в interface- вызов FAR.
-
Сегментация и модели памяти. Если выбрана модель .LARGE, то стек надо описывать как .FARSTACK и он уже не будет относиться к группе DGROUP.
-
Особенности описания общих и предопределенных переменных. В Pascal ограничений нет, но рекомендуется начинать переменные с заглавной буквы; в С- переменные необходимо начинать с символа подчеркивания “_”
-
Управление регистрами. DS – нужно следить за ним. РОН нужно сохранять или в головной программе или в процедуре на ассемблере.
-
Способы передачи параметров. Как правило параметры передаются через кадр стек, размещение параметров идет в различном порядке.
-
Способ возвращения результата. Возвращение результатов может быть реализована через стек, AX (BYTE, WORD), DX:AX (DWORD), ST(0)- вершина стека x87 (FLOAT).
-
Способ восстановления стека. Pascal – в вызываемой программе, в С – в вызывающей программе (для возможности оптимизации)
-
Способы задания и вызова ассемблерного модуля.
а) Раздельная компиляция. Модули на различных языках компилируются отдельно и в вызывающем модуле указан специальный оператор описания модуля на другом языке и его загрузки в виде объекта файла.
б) Встроенная компиляция. Фрагмент или команда ассемблера указывается как встроенный оператор и сам компилятор вызывает ассемблерные транслятор автоматически.
Связь ASSEMBLER и PASCAL.
Пример1:
Test(i, j, k)- вычисляет f=i+j-k; i, j, kZ.
i EQU WORD PTR [bp+8]
j EQU WORD PTR [bp+6]
k EQU WORD PTR [bp+4]
.Model Small
.Code
Public Test
Test Proc
Push bp
mov bp, sp
mov ax, i
add ax, j
sub ax, k
pop bp
ret 6
Test EndP
END
Function Test(i,j,k):Word;
External;
{$L Test.obj}
*******************
F:=Test(i,j,k);