7.1. Указатели и операции над ними
Память принято делить на слова, двойные слова и параграфы. Слово имеет длину 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.
Еще по теме 7.1. Указатели и операции над ними:
- Статья 297. Надругательство над могилой, другим местом захоронения или над телом умершего
- УКАЗАТЕЛЬ СОКРАЩЕНИЙ
- Алфавитно-предметный указатель
- Алфавитно-предметный указатель
- Алфавитно-предметный указатель
- АЛФАВИТНО-ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ
- ОПЕРАЦИЯ ФОРМАЛЬНАЯ
- ОПЕРАЦИЯ
- ОПЕРАЦИЯ ИНТЕЛЛЕКТУАЛЬНАЯ
- ОПЕРАЦИЯ КОНКРЕТНАЯ
- ОПЕРАЦИЯ СОЗНАТЕЛЬНАЯ
- Методы и то, что за ними
- ИЗУЧАЙТЕ ЛЮДЕЙ, НАБЛЮДАЙТЕ ЗА НИМИ
- ИЗУЧАЙТЕ ЛЮДЕЙ, НАБЛЮДАЙТЕ ЗА НИМИ
- Действия, операции и психологические приемы.
- Зеркало треснуло (эмоции, как с ними бороться)
- ОПЕРАЦИЯ ПРИСПОСОБИТЕЛЬНАЯ
- § 2. Правовое регулирование валютных операций