При этом учитывается совместимость по типу данных, на которые они ссылаются аналогично учету совместимости при обычном присваивании
Присваивание ссылок и указателей типа 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 возможно использовать различные переменные, которые будут определять адреса первых байтов соответствующих им блоков.