78
12.4. Использование метки EXIT
является указатель. Кроме того представление результата должно занимать четное
число байтов (т.е. если реультат занимает только один байт, его нужно расширить
добавлением старшего байта, содержащего 0 при положительном числе и $FF при
отрицательном.
Каждый параметр передается согласно принятым правилам представления
данных в UniPascal-е, т.е. в стеке младший байт находится над старшим. Независимо от
типа передаваемого параметра, его длина кратна слову, т.е. параметр занимает четное
число байтов. Это значит, что при ожидаемых однобайтовых параметрах
ассемблерская подпрограмма должна использовать только верхний байт, игнорируя
находящийся под ним старший.
Передача параметров подчиняется еще следующим правилам:
При параметрах, передаваемых по значению, и при параметрах-константах:
*
значение параметров, представление которых занимает одно или две слова
(до 4 байтов), передаются через стек;
*
адрес области памяти, занятой неудовлетворяющими верхнему условию
параметрами, передается через стек. Модификация значения
нежелательно.
При параметрах, передаваемых по адресу (var параметры), на вершине стека
находится адрес области, в которой записан параметр.
Параметры типа STRING передаются специальным способом:
*
VAR параметры типа STRING без описателя длины передаются так: в стек
вталкивается адрес переменной и после него (т.е на вершину стека) -
описатель длины фактического параметра. Пример: procedure MyASM(var
s: string); активизируется оператором MyASM(sss); где var sss: string[77];
тогда в стек над адресом переменной находится слово, содержащее 77;
*
VAR параметры типа STRING с описателем длины передаются обычным
способом;
*
CONST параметры типа STRING (с описателем длины или без описателя).
Для таких параметров передается адрес параметра. Если фактический
параметр - типа CHAR, компилятор сгенерировал код для совершения
присваивания внутренней переменной типа STRING[1] для того, чтобы был
передан адрес переменной типа STRING, а не типа CHAR;
*
Параметры-значения STRING (с описателем длины или без описателя)
передаются как CONST параметры, т.е передается их адрес. Если
фактический параметр - типа CHAR, однако, передается его содержимое
как адрес (сперва старший, потом младший байт), младший байт которого
содержит ASCII код параметра, а старший - 0. Адреса, чей старший байт
содержит 0, являются адресами байтов нулевой страницы, а она не
используется для записи переменных. Этим способом ассемблерская
процедура сможет различить что ей подали: адрес или параметр типа CHAR.
Если Вам кажется неудобно обрабатывать такие параметры, опишите их как
CONST. Тогда ассемблерская подпрограмма станет проще, но за счет этого,
увеличится код (Y код) программы на UniPascal-е (каждому фактическому
параметру типа CHAR соответствует код тремя байтами длиннее обычного).
12.4. Использование метки EXIT
Специфическая в UniPascal-е метка EXIT появляется в синтаксическом описании
блока, как следует:
<<  <  GO  >  >>

Вернуться к началу сайта