14.2. Доступ к памяти ПЭВМ. Массивы Mem, MemW, MemL

We use cookies. Read the Privacy and Cookie Policy

Для простого доступа к любой физической ячейке памяти Турбо Паскаль вводит три предопределенных массива: Mem, MemW, MemL. Они как бы наложены на всю память ПЭВМ. Можно условно считать, что эти массивы известны по системному определению:

VAR

Mem : Array of Byte absolute 0:0;

MemW : Array of Word absolute 0:0;

MemL : Array of Longlnt absolute 0:0;

- 298 -

Но отличие их от обычных массивов — в задании индексов. Они должны задаваться не номером, а адресом интересующей нас ячейки памяти в формате СЕГМЕНТ:СМЕЩЕНИЕ. Так,

Mem [$B000:$0000] — значение байта (Byte) по данному адресу;

MemW[$B000:$0000] — значение слова (Word) по данному адресу;

MemL[$B000:$0000] — значение двойного слова (LongInt).

Во всем остальном массивы Mem очень похожи на обычные массивы. Если Mem [] стоит справа в операторе присваивания, то это — значение байта (слова, двойного слова), начинающегося с данного индекса-адреса. Но Mem[] может стоять и слева. Это будет означать модификацию байта (слова или двойного слова) по данному адресу, например:

Mem[ $50 : 0 ] := Mem [ $50: 0 ] xor 1;

{ вкл/выкл реакции на Shift+PrtScr }

Элементы массивов Mem могут подставляться как фактические параметры при вызовах процедур и функций. Наиболее часто массивы Mem, MemW и MemL используются для доступа к системным областям памяти, как в примере на рис. 14.3.

| PROGRAM Devices; { Анализ байта конфигурации }

| VAR

| CFG : Word; { сюда запишется значение ячейки памяти }

| BEGIN

| CFG := MemW[ $0000:$0410 ];

| WriteLn( #10, 'Текущая конфигурация:', #10 );

| WriteLn('Макс. число принтеров -->', CFG shr 14 );

| WriteLn('Число серийных портов -->', (CFG shr 9) and 7);

| WriteLn('Число НГМД --> ',

| ( CFG and 1 )*( 1 + ( CFG shr 6 ) and 3 ) );

| WriteLn('Наличие игрового порта-—>',(CFG and 4096)=1);

| WriteLn;

| ReadLn

| END.

Рис. 14.3