Введение
Эта часть справки включает в себя следующие разделы:
Организация памяти
Вызовы Соглашений
Ограничения
Организация памяти
Компилятор TMT Pascal использует расширители TMTSTUB (основанный на
WDOSX) и PMWSTUB (основанный на PMODE/W) для программирования в
защищенном режиме.
Сегментные регистры не используются в защищенном режиме. Вместо
этого все адресное пространство разделено на страницы по 4кБ.
Вам не нужно добавлять специальную переменную
_zero, чтобы
получить доступ к физическим адресам.
Пример:
procedure clr_video(filler: char);
var
i: Integer;
begin
for i:=0 to 80*25-1 do
mem[$B8000+i*2]:= filler;
end;
Эта процедура заполняет видеопамять VGA адаптера символом,
определенным переменной
filler.
Обратите внимание, что линейный адрес
$B8000 используется как
физический адрес, а не как адрес сегмента
$B800.
Некоторые другие специальные переменные описаны в модуле
SYSTEM.
Переменная
_psp содержит логический 32-битный PSP адрес
программы, а переменная
_environ содержит адрес среды.
Хотя вы можете получить векторы прерываний, используя этот метод, мы
не рекомендуем этого делать.
Также имейте ввиду, что программа обработки прерываний MS-DOS
использует адреса в 1-м МБ физической памяти, в то время как ваша
программа загружается вне этого предела. TMTSTUB правильно
обрабатывает некоторые, но не все, обращения к MS-DOS. Поэтому,
если вы используете вызовы
Intr или
MsDos, или
вызываете MS-DOS из ассемблера, вы должны изменить код.
Абсолютная адресация памяти
Mem, MemW, MemL и
MemD
псевдомассивы могут быть использованы в ВР-совместимом стиле:
var x: type absolute seg:offs
Mem[seg:offs]
Здесь эффективный адрес вычислен как
seg*16+offs. Функция
Ptr(seg, offs) работает подобно. Функция
Seg(v)
всегда возвращает 0.
Эти новые функции должны существенно упростить преобразование
программ, которые используют абсолютную адресацию.
Пример использования функций может быть найден в файле
TMTPL\SAMPLES\MSDOS\FLAME\FLAME.PAS
См. также:
PMODE/W API
Вызовы Соглашений
Соглашения об обращении к процедурам соответствуют вызовам в
Borland Pascal со следующими отличиями:
все параметры используют 4 байта в стеке или умноженные на 4 (BP:2)
все процедуры не должны изменять содержимое регистров ebx, ecx, edx,
ds и es!
бит управления должен быть очищен после выхода из процедуры, если он
был изменен процедурой.
Для вызова внешних процедур, написанных на других языках, TMT Pascal
предоставляет оператор
conv. Этот оператор должен быть
использован в объявлении функции (процедуры) для определения вызова
соглашения, который, в свою очередь, будет использован для обращения
к объявленной функции (процедуре).
Синтаксис:
[function] conv conv_method FunctionName [Arguments] : ReturnType;
Здесь
conv_method - это константа. Она определяет вызов
соглашения, который будет использоваться. Модуль
System
содержит следующие константы для определения согласующего метода:
const
// Основные вызывающие соглашения для создания любых возможных соглашений
arg_reverse = [0];
arg_proc_16 = [2];
arg_noregsave = [3];
arg_no_drop_1 = [4];
arg_no_drop_2 = [5];
arg_no_drop_3 = arg_no_drop_1 + arg_no_drop_2;
arg_no_drop_4 = [6];
arg_no_drop_5 = arg_no_drop_1 + arg_no_drop_4;
arg_no_drop_6 = arg_no_drop_2 + arg_no_drop_4;
arg_no_drop_all= [4..6];
arg_IO_test = [8];
arg_save_edi = [9];
arg_save_esi = [10];
// Комплексные вызовы соглашения
arg_pascal = arg_noregsave;
arg_stdcall = arg_reverse + arg_noregsave + arg_save_edi +
arg_save_esi;
arg_cdecl = arg_reverse + arg_no_drop_all;
arg_os2 = arg_cdecl + arg_noregsave;
arg_os2_16 = arg_proc_16 + arg_no_drop_all + arg_noregsave;
Соглашение
arg_pascal пропускает параметры слева направо.
Параметр, который является крайним левым, анализируется и проходит
первым, а самый правый параметр анализируется и проходит последним.
Соглашения
arg_cdecl, arg_stdcall, arg_os2 и
arg_os2_16
передают параметры справа налево. Для всех соглашений кроме
arg_cdecl, процедура или функция удаляют параметры из стека
после возвращения. С соглашением
arg_cdecl вызывающий должен
удалить параметры из стека, когда вызов возвращается. Соглашение
регистра использует до трех регистров процессора для передачи
параметров, принимая во внимание, что другие соглашения всегда
передают все параметры через стек. Соглашения о вызовах сведены в
следующей таблице.
Directive Order Cleanup Registers
arg_pascal Left-to-right Function No
arg_cdecl Right-to-left Caller No
arg_stdcall Right-to-left Function No
Соглашения
arg_pascal и
arg_cdecl главным образом
полезны для вызова процедур в динамических библиотеках (DLL),
написанных в
C, C ++ или других языках. Cоглашение
arg_stdcall используется для вызова процедур Windows API.
Ограничения
Mark и Release не осуществлены.
Оператор Inline осуществлен частично:
Inline(byte/byte/...);
Ссылки на переменные/константы не позволяются.
Импорт объектных модулей не поддерживает все 32-битные объектные форматы. Мы рекомендуем использовать TASM, который полностью поддерживается, за исключением использования адресов SEG.
Комплексный тип не осуществлен.
Константы расширенного типа не поддерживаются.
Зарезервированное слово Packed не поддерживается (игнорируется) в TMT Pascal. Используйте $OA: Objects and Structures Align Switch для включения или выключения выравнивания объектов и структур.