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

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

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

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

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

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

ла сегмента принимают за базу для всего сегмента. Адрес базы сегмента без последних четырех бит называют сегментным.

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

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

Примечание. Современные модели микропроцессоров используют адреса большей длины с отличающейся схемой получения физического адреса, что учитывается версиями Разса1, предназначенным для работы «под \Ут). Эти операции проверяют соответственно равенство и неравенство адресов. Например:

sign:=pl=p2; {переменная sign логического типа получает значение true или false в зависимости от значений указателей}

или

if plnil then ... {проверка адреса}

Поскольку в качестве базового типа типизированного указателя может быть использован любой тип, допустимо определять «указатель на указатель». Например, если переменную ppi описать и инициализировать следующим образом:

ppi


Рис.
7.5. Указатель на указатель

integer и равно 1.

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

1. Функция ADDR(x): pointer - возвращает адрес объекта х, в качестве которого может быть указано имя переменной, функции, процедуры. Выполняет те же действия, что и операция «@».

2. Функция SEG(x): word - возвращает сегментный адрес указанного объекта.

3. Функция OFS(x): word - возвращает смещение указанного объекта.

4. Функция CSEG: word- возвращает текущее значение сегментного регистра CS - сегментный адрес сегмента кодов.

5. Функция DSEG: word- возвращает текущее значение сегментного регистра DS - сегментный адрес сегмента данных.

6. Функция PTR(seg,ofs:word).'pointer - возвращает значение указателя по заданным сегментному адресу seg и смещению ofs.

Преобразование типов данных с использованием типизированных указателей. Как отмечалось ранее, типизированный указатель связывается с некоторым типом данных и адресует вполне определенную область памяти, соответствующую длине внутреннего представления своего типа. Если указателям разного типа присвоить один и тот же адрес, то каждый из них будет рассматривать содержимое области в соответствии с внутренним представлением своего типа. Эта особенность указателей позволяет использовать их для неявного преобразования типа.

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

Например:

Var Ldongint; {длинное целое число}

Pl:Aarray[1..4] of byte; {указатель на область длиной 4 байта} k: byte;

Begin

L:=123456789;

P1:=@L; {операция @ возвращает нетипизированный указатель} к:=Р1Л[1]; {младший байт внутреннего представления числа L, младший потому, что числа в памяти для данного типа компьютеров хранятся с младшего байта}

Контроль корректности значений, полученных в результате выполненных действий, системой не осуществляется, а ложится целиком на программиста.

7.2.

<< | >>
Источник: Иванова Г.С. Основы программирования. 2002

Еще по теме 7.1. Указатели и операции над ними:

  1. Статья 297. Надругательство над могилой, другим местом захоронения или над телом умершего
  2. УКАЗАТЕЛЬ СОКРАЩЕНИЙ
  3. Алфавитно-предметный указатель
  4. Алфавитно-предметный указатель
  5. Алфавитно-предметный указатель
  6. АЛФАВИТНО-ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ
  7. ОПЕРАЦИЯ ФОРМАЛЬНАЯ
  8. ОПЕРАЦИЯ
  9. ОПЕРАЦИЯ ИНТЕЛЛЕКТУАЛЬНАЯ
  10. ОПЕРАЦИЯ КОНКРЕТНАЯ
  11. ОПЕРАЦИЯ СОЗНАТЕЛЬНАЯ
  12. Методы и то, что за ними
  13. ИЗУЧАЙТЕ ЛЮДЕЙ, НАБЛЮДАЙТЕ ЗА НИМИ
  14. ИЗУЧАЙТЕ ЛЮДЕЙ, НАБЛЮДАЙТЕ ЗА НИМИ
  15. Действия, операции и психологические приемы.
  16. Зеркало треснуло (эмоции, как с ними бороться)
  17. ОПЕРАЦИЯ ПРИСПОСОБИТЕЛЬНАЯ
  18. § 2. Правовое регулирование валютных операций