Присваивание разыменование ссылок

При этом учитывается совместимость по типу данных, на которые они ссылаются аналогично учету совместимости при обычном присваивании

Присваивание ссылок и указателей типа pointer

Операции прямого присваивания является допустимой, так как ссылочная переменные и указатели совместны по адресу:

Var

P1:^integer;

P2:pointer;

P1:=p2;

Однако они не является совместимыми по данным (у указателя pointer не определен объем памяти, с которым он будет работать при разыменование в отличие от ссылки). Поэтому операции p1^:=p2; не выполняется. Для выполнения ее необходимо привести раз именованный указатель к базовому типу ссылки, то есть p1^:=integer(p2^);

Операция сравнивания

Под операцией сравнения понимают сегментов и смещений, находящихся в ссылках или указателях. При этом допустимы операции сравнивания на равенство или не равенство адресов. При выполнении операции сравнения в операции участвуют 32 бита как единое целое, поэтому если две ссылки указывают на один физический адрес, но он записан по-разному, то ссылки – различные.

Дополнительные операции работы с адресами

1. Определения адреса переменной

Add(«переменные») = @ - взятие адреса

P:=@i; = p:= add(i);

2. Определения адреса сегмента, в котором находятся значения переменной seg(‘переменая’):word; Данная функция возвращает адрес сегмента в десятичной формой.

Var

S:word;

I:byte;

S;=seg(i);

3. OFS(‘ переменная ’): word; возвращение адреса смещения в десятичной форме

4. Операция создания адреса

Ptr(‘адрес сегмента’,’ адрес смещения’);

Параметры задаются в 16ричной форме. Данная функция организует ссылку на место в памяти, определяемое заданными в качестве параметра адресами сегмента и смещения. Эта операция связывает ссылку с некоторой областью памяти. Данная операция = операция присваивания адреса.

P:=Ptr ($A1,$A2);

Var

P1,p2:^integer;

……….

P1:=Ptr ($0100,$0000);

P1^:=2;

P2:=Ptr ($0100,$0000);

Write(p2^);

Возможно осуществить ссылку на область памяти через функцию Ptr не используют переменную. Необходимо воспользоваться операцией приведения типов, так как операция раз адресация не содержат информации.

Var

B:byte;

……

B:=byte(Ptr ($0100,$0000));

Аналогичное использование функции и в случае, когда необходимо поместить значения в некоторой области памяти:

Byte (Ptr ($0100,$0000)^):=b;

Обычно функцию ptr используют для наложения некоторый структуры данных на какую-либо область памяти. Рассмотрим пример:

Необходимо наложить массив на видеобуфер, содержать образ текстового экрана и находящийся по адресу $B800:$0. С этого адреса поочередно располагаются пары байт - информации, информации байт и байт – атрибут, который показывают какой символ и с каким атрибутом (цвет символа, фона) отображается в том или ином месте экрана.

В текстовом режиме 10*25 знакомест строка экрана занимает 160 байт памяти. Весь экран – 400 байт = 4кб

Пример заполнения точки экрана символами ‘0’ синего цвета.

Type

Vid=record

Inf:char;

Attr:byte;

End;

Vid_arr=array [1..2000] of vid;

Var

I:word;

Ptr_v^:vid_arr;

Begin

Ptr_v:=ptr ($b800,$0);

For i:=1 to 2000 do

Begin

Ptr_v ^[i].inf:=’0’;

Ptr_v^[i].attr:=1;

End;

5. Определение размера переменной или типа

Size of («переменная» или «тип»):word;

Var

S:word;

I:string[10];

……

S:=size of (i);

6. Прямой доступ через предопределенный массив.

Используется 3 предопределения массива Mem (byte), Mem w (word), Mem L (Longint), которые работают с элементами различных типов. Синтаксис записи обращения к элементам массива:

Mem [‘сегмент ’:’ смещение ’].

Пример заполнения текстового экрана ‘0’ синего цвета, использование предопределенный массив:

Var

I:word;

Begin

I:=0;

While I <> 400 do

Begin

Mem[$B800:$0 + i]:= ord(‘0’);

Mem[$B800:$1 + i]:= 1;

I:=i+2;

End;

7. Копирование блока памяти из одной области в другую

Move («параметр 1», «параметр 2», «параметр 3»);

Параметр 1 определяет адрес начала копируемого блока, адреса блока, в который копируем – 2 параметра, параметр 3 – размер копируемого блока. В качестве Параметров 1 и 2 возможно использовать различные переменные, которые будут определять адреса первых байтов соответствующих им блоков.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: