Что касается ответа на второй вопрос, то мы рассмотрим его на конкретном примере листингов 6 и 7. Помните, что мы рассматриваем вызов из программы на Pascal внешней процедуры на ассемблере. Понятно, что вызов ради вызова вряд ли нужен - вызываемая процедура должна иметь возможность вернуть данные в вызывающую программу. Поэтому такую вызываемую процедуру правильнее рассматривать как функцию. В связке Pascal - ассемблер для того, чтобы возвратить результат, процедура на ассемблере должна поместить его значение в строго определенное место.
Возврат результата из процедуры на ассемблере в программу на Pascal:
Тип возвращаемого значения
Куда записать результат?
Байт
AL
Слово
AX
Двойное слово
DX:AX (старшее слово: младшее слово)
Указатель
DX:AX (сегмент: смещение)
В листинге 6 приведен текст вызывающего модуля на Pascal, а в листинге 7 - код вызываемого модуля на ассемблере. Программа на Pascal инициализирует две переменные valuel и va1ue2, после чего вызывает функцию на ассемблере AddAsm для их сложения. Результат возвращается в программу на Pascal и присваивается переменной rez.
Вызывающая программа на Pascal (листинг 6).
{prg6.pas}
program prg6;
{внешние объявления}
function AddAsm:word; external;
{$L prg7.obj}
var
valuel: word; {здесь как внешние}
va1ue2: word;
rez: word;
begin
va1uel:=2;
va1ue2:=3;
{вызов функции}
rez:=AddAsm;
write1n( "Результат:",rez);
end.
Вызываемая процедура на ассемблере (листинг 7);
;prg7.asm
MASM
MODEL small
data segment word public ;сегмент данных
;объявление внешних переменных
extrn va1uel:WORD
extrn va1ue2:WORD
data ends ;конец сегмента данных
.code
assume ds:data ;привязка ds к сегменту
;данных программы на Pascal
main:
AddAsm proc near
PUBLIC AddAsm ;внешняя
mov cx,ds:va1uel ;va1uel в cx
mov dx,ds:va1ue2 ;va1ue2 в dx
add cx,dx ;сложение
mov ax,cx ;результат в ax, так как - слово
ret ;возврат из функции
AddAsm endp ;конец функции
end main ;конец программы
Как вы, наверное, обратили внимание, здесь была использована еще одна возможность доступа к разделяемым данным — использование сегментов типа public. Совместное использование сегментов данных стало возможным благодаря тому, что компилятор Pascal создает внутреннее представление программы в виде сегментов, как и положено для программ, выполняющихся на микропроцессоре Intel. Сегмент данных в этом представлении тоже имеет название data, и директива segment для него выглядит так: data segment word public и т. д.