12. UniPascal в деталях
77
Целые типы
Если минимальное и максимальное значение находятся одновременно в
границах:
*
0..255, представление занимает один байт (число без знака). Тип
упаковаемый;
*
-128..127, представление занимает один байт (число со знаком) в
дополнительном коде. Тип упаковаемый;
*
во всех остальных случаях тип неупаковаемый.
Типы CHAR и BYTE
Эти типы - упаковаемые и представление занимает один байт.
Вещественный тип
Вещественный тип неупаковаемый.
Стандартный тип STRING
Этот тип всегда упакованный, но неупаковаемый. Представление занимает N + 1
байта, где N - константа, указанная в декларации. Так как тип неупаковаемый, всегда
занимаемое место начинается с границы слова и, следовательно, переменные типа
string[7] и string[6] будут занимать одинаковый объем памяти.
Первый байт (соответствующий нулевому элементу) содержит длину текущей
строки. Если длина K строки меньше максимальной длины, будут использованы только
K+1 байта. Например, 'Test' имеет представление: $04, $54, $65, $73, $74.
12.3. Связь с ассемблерскими подпрограммами
Связь между программой на UniPascal-е и ассемблерской подпрограммой
(машинный код) реализуется параметрами, передаваемыми через стек. В стеке они
находятся в обратном порядке. Последний параметр вталкивается последним в стек и
поэтому должен быть вытолкнутым первым. В момент активизации ассемблерской
подпрограммы на самой вершине стека (над последним параметром) находится адрес
возврата с подпрограммы (return address).
Чтобы интерпретотор мог различать ассемблерские подпрограммы от
подпрограмм на Y коде, ассемблерские подпрограммы должны начинаться двумя
байтами, заполненными нулями.
Подпрограмма должна вытолкнуть из стека все параметры, которые ей подала
вызвавшая ее программа. Возвращение к интерпретатору можно осуществить двумя
способами:
*
использованием адреса возврата, находящегося в стеке;
*
переходом по абсолютному адресу $BEFE;
В обоих случаях ассемблерская подпрограмма должна вытолкнуть все
переданные ей данные.
Если подпрограммой реализуется функция, она должна расположить результат
на вершину стека. Представление результата должно подчиняться принятым в UniPascal-
е правилам, т.е. порядок байтов идет с младшего к старшему (на вершине стека должен
быть младший, а под ним - старший байт) за исключением случая, когда результатом
<<  <  GO  >  >>

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