Указатели и операции над ними 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Указатели и операции над ними



Наименьшей адресуемой единицей памяти компьютера, построенного на базе микропроцессоров фирмы Intel и их аналогов, является байт. Таким образом, память представляет собой последовательность нумерованных байтов. Для обращения к конкретному байту необходимо знать его номер, который называется его физическим адресом.

Память принято делить на слова (2 байта), двойные слова (4 байта) и параграфы (16 байт).

При работе с памятью используется адресация по схеме «база + смещение» (рис.21.1). При этом адрес конкретного байта М определяется как адрес некоторого заданного байта Аб (адрес базы) + расстояние до требуемого байта Асм (смещение).

Рис.21.1. Адресация по схеме «база + смещение»

В микропроцессорах фирмы Intel в качестве адреса базы используют адреса, кратные 16. Четыре последних бита такого адреса равны 0, и их не хранят, а аппаратно добавляют при вычислении физического адреса.

Непрерывный участок памяти, имеющий длину не более 64 Кб и начинающийся с адреса, кратного 16, называется сегментом. Адрес начала сегмента принимают за базу для всего сегмента.

Сегментный адрес и смещение имеют размер по 16 бит (слово). Физический адрес, получаемый при их сложении с учетом отброшенных четырех бит, имеет размер 20 бит и может адресовать память объемом 220 байт или 1 Мб (рис. 21.2.).

Рис.21.2. Получение физического адреса

Максимальное смещение равно 216-1, что соответствует 64 Кб памяти. Таким образом, относительно одной базы можно адресовать не более 64 Кб памяти, что ограничивает размер сегмента.

Программа и данные хранятся в памяти фрагментами, каждый из которых расположен в своем сегменте. Различают 3 вида сегментов: кодов (хранится собственно программа), данных (размещаются глобальные переменные и константы), стека (при вызове подпрограмм в стек записывается адрес возврата, в нем размещаются локальные переменные, копии параметров–значений, адреса параметров–переменных и т.п.).

В процессе работы сегментные адреса хранятся в специальных сегментных регистрах:

CS – адрес базы сегментов кодов;

DS – адрес базы сегментов данных;

SS – адрес базы сегмента стека.

Доступ к конкретным участкам сегмента осуществляется через соответствующие смещения.

Для работы с адресами используется специальный тип данных – указатель. Различают указатели двух типов: типизированные и нетипизированные. Типизированные содержат адреса, по которым в памяти размещаются данные определенных типов. Используя эти указатели с данными указанных типов, можно выполнить операции, предусмотренные базовым типом.

Например:

type tpi = ^integer; {объявляем тип «указатель на целое»}

var p: tpi; {объявляем переменную этого типа}

Или

var p: ^integer;

Нетипизированные указатели хранят просто адреса, которые не связаны с данными конкретных типов. Для их объявления используют зарезервированное слово pointer. Например:

var p: pointer; …

Над значениями указателей возможны следующие операции (рис. 21.3):

- присваивание. При выполнении этой операции указателю присваивается значение другого указателя или nil.

Например:

var p 1, p 2: ^integer;

p 3: ^real;

p: pointer;

{допустимые операции}

p 1:= p 2; p:= p 3; p 1:= p; p 1:=nil; p:= nil;

{недопустимые операции}

p 3:= p 2; p 1:= p 3; …

 

- получение адреса. Операция получения адреса – одноместная, ее операнд может иметь любой тип, результатом является типизированный (в соответствии с типом операнда) указатель, содержащий адрес объекта–операнда.

Например:

var i: integer;

p: ^integer;

p:=@ i; {указатель p будет содержать адрес переменной i }

- доступ к данным по указателю (операция разыменования). Чтобы получить доступ к переменной по указателю, необходимо после переменной–типизированного указателя поставить знак «^». Полученное значение имеет тип, совпадающий с базовым типом указателя. Нетипизированные указатели разыменовать нельзя.

Например:

J:= p ^; {переменной j присваивается значение целого, расположенного по адресу p }

- операции отношения. Из всех возможных операций отношения допускаются проверки равенства(=) и неравенства (< >).

Рис.21.3. Операции с указателями.



Поделиться:


Последнее изменение этой страницы: 2016-09-19; просмотров: 423; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.17.154.171 (0.004 с.)