Листинг 15.15. Использование директивы MODEL
на Pascal, вызывающая процедуру на
полностью
совпадает с листингом 15.12}
MODEL
12
256
354 Глава 15. Модульное программирование
(продолжение)
STACK
PUBLIC
mov
mov
int
mov
mov
mov
xor
mov
int
ret
asmproc
end
256
proc near chr
asmproc
ptr у
ptr x
10h
bl,07h
endp
; у в dh
; x в dl
службы BIOS
прерывания BIOS
службы BIOS
;символ - в al
вывода символа
;kol в сх
прерывания BIOS
процедуры
программы
Листинг 15.16. Результат трансляции листинга 15.15
Turbo
4.117/04/98 22:30:57Page 1
256
0000
0000
0000
0000
0000
STACK
asmproc procnear
PUBLIC asmproc
1
1
1
1
1
9
10
11
12
13
14
15
16
17
18
19
20
21
22
24
0000
0001
0003
0006
0009
000B
000D
000F
0012
0014
0016
0019
001B
001C
001F
end
55
8A
8A
B4
CD
B4
8A
B3
32
8B
CD
5D
C2
EC
76
56
02
10
09
46
07
FF
4E
10
PUSH
MOV
06
08
0A
04
0008RET
BP,
mov
mov
mov
int
mov
mov
mov
xor
mov
int
POP
BP
SP
dh,
ah,
bh,
BP
byte
byte
09h
chr
bh
kol
ptr у
ptr x
asmproc endp
у в dh
x в dl
номер службы BIOS
вызов прерывания BIOS
номер службы BIOS
символ - в al
маска
символа
kol в сх
вызов прерывания BIOS
конец процедуры
конец программы
Таковы стандартные способы вызова ассемблерных процедур из программ на
Pascal и
им аргументов. Эти способы будут работать всегда, но, совер-
шенствуясь, компилятор может предоставлять и более удобные средства. Их мы
рассматривать не будем, так как, в конечном счете, они сводятся к рассмотренной
нами процедуре. Остались открытыми два вопроса.
и Как
с передачей данных остальных типов Pascal, ведь мы рассмотрели толь-
ко данные размером в байт и слово?
Как возвратить значение в программу на Pascal?
Что касается ответа на первый вопрос, то необходимо вспомнить, что в языке
Pascal существуют два способа передачи аргументов в процедуру: по ссылке и по
значению.
Связь ассемблера с языками высокого уровня 355
Тип аргументов, передаваемых по ссылке, совпадает с типом ассемблера
и с типом pointer в Pascal. По сути, это указатель из четырех байтов на некоторый
объект. Структура указателя обычная: два младших байта — смещение, два стар-
ших байта — значение сегментной составляющей адреса. С помощью такого указа-
теля в программу на ассемблере передаются адреса следующих объектов:
всех аргументов, объявленных при описании в программе на Pascal как var, не-
зависимо от их типа;
аргументов pointer и
' строк
множеств;
массивов и записей, имеющих размер более четырех байтов.
Аргументы по значению передаются следующим образом:
для типов char и byte как байт;
для типа
— как байт со значением 0 или 1;
для перечисляемых типов со значением 0...255 — как байт; более 255 — как два
байта;
для типов integer и word — как два байта (слово);
для типа
— как шесть байтов (три слова);
массивы и записи, длина которых не превышает четырех байтов, передаются
«как есть».
Заметим, что аргументы таких типов, как single, double, extended и
переда-
ются через стек сопроцессора.
Что касается ответа на второй вопрос, то мы выясним его на конкретном при-
мере. Напомню, что мы рассматриваем вызов из программы на Pascal внешней
процедуры на ассемблере. Понятно, что вызов ради вызова вряд ли нужен — вызы-
ваемая процедура должна иметь возможность вернуть данные в вызывающую про-
грамму. Поэтому такую вызываемую процедуру правильнее рассматривать как
функцию. В связке
для того, чтобы возвратить результат, про-
цедура на ассемблере должна поместить его значение в строго определенное место
(табл. 15.2).
Таблица
Возврат результата из процедуры на ассемблере в программу на Pascal
Тип возвращаемого значения
Байт
Слово
Двойное слово
Указатель
Место записи результата
AL
АХ
DX:AX (старшее
слово)
DX:AX
В листинге 15.17 приведен текст вызывающего модуля на Pascal, а в листин-
ге 15.18 — код вызываемого модуля на ассемблере. Программа на Pascal инициа-
лизирует две переменные, valuel и
после чего вызывает функцию на ассем-
блере AddAsm для их сложения. Результат возвращается в программу на Pascal
и присваивается переменной rez.
Do'stlaringiz bilan baham: |