13. Программирование на физическом уровне
В отличие от многих других компиляторов с языка Паскаль Turbo Pascal предоставляет большие возможности работы на физическом уровне. Можно обратиться непосредственно к любой ячейке оперативной памяти или порту ввода-вывода, любому элементу файла, структурированного параметра. Это позволяет писать более эффективные программы, но пользоваться ими может только квалифицированный программист, хорошо знающий архитектуру персональных ЭВМ, распределение памяти, операционную систему MS DOS.
Возможность работы на физическом уровне обеспечивается многими моментами, в том числе:
- наличием стандартного модуля DOS, позволяющего использовать в программе многие возможности операционной системы MS DOS, включая обработку прерываний, работу с каталогами и файлами и т. д. (см. п. 16.1);
- наличием встроенного ассемблера и возможностью подключать подпрограммы, написанные на языке ассемблера (см. п. 12);
- наличием специальных массивов, покрывающих всю оперативную память и все порты ввода-вывода;
- наличием файлов без типа (см. п. 11);
- наличием передаваемых в подпрограмму параметров без типа и т. д.
В Turbo Pascal вводятся специальные массивы, позволяющие обращаться к любой ячейке оперативной памяти и любому порту по их физическому адресу. \ Для обращения к ячейкам оперативной памяти вводятся три стандартных массива: Mem, MemW и Meml. Эти массивы отличаются от обычных массивов языка Паскаль, т. к. каждый из них покрывает всю оперативную память (у обычных массивов размер ограничен величиной 64 Кбайт). Можно считать, что эти массивы как бы наложены друг на друга и представляют одну и ту же область.
Отличие каждого из них заключается в том, что массив Mem является массивом байтов, массив MemW - массивом слов, а массив MemL - массивом двойных' слов. Нет у этих массивов и привычных индексов компонент. Каждая компонента задается своим полным начальным адресом: адресом сегмента и смещением. В качестве адреса сегмента и смещения могут выступать выражения целого типа, Нельзя в тех или иных выражениях использовать указанные выше массивы целиком, а только отдельные их компоненты. Для задания того или иного элемента массива после его имени в квадратных скобках через двоеточие указываются адрес сегмента и смещение. Компоненты этих массивов могут присутствовать как в правой, так и в левой части оператора присваивания:
Len := MemW[$40:$13]; {размер доступной памяти}
MemL[Seg(RandSeed):0fs(RandSeed)] := 5;
{задание начального значения генератору случайных чисел}
Для обращения к портам ввода-вывода используются два других специальных массива - Port и PortW. Компонентами массива Port являются байты, а массива PortW - 16-разрядные слова. Индексы компонент этих массивов задаются выражениями целого типа. Компоненты массива могут использоваться в выражениях, их можно включать и в правую, и в левую части оператора присваивания, однако использовать их как параметры-переменные нельзя. Нельзя использовать эти массивы и целиком, а можно использовать только отдельные компоненты:
PortW[Base] := PortW[Base] and Mask;
{выделение в слове порта по адресу Base информации в соответствии с маской Mask}
|