Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
TURBO_PASCAL.doc
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
8.23 Mб
Скачать

10.3. Анализ расположения кода и областей данных программы

При программировании на низком уровне или использовании вставок машинных кодов в программу необходимо иметь средства анализа положения программы и ее данных в оперативной памяти. Системная библиотека Турбо Паскаля содержит набор средств для этого. Перечень специальных функций анализа памяти приведен в табл. 10.1.

Таблица 10.1

Функция : Тип

Возвращаемое значение

CSeg : Word

Содержимое регистра CS процессора

DSeg : Word

Содержимое регистра DS процессора

SSeg : Word

Содержимое регистра SS процессора

SPtr : Word

Содержимое регистра SP процессора

Функции CSeg, DSeg, SSeg и SPtr выдают содержимое регистров CS, DS, SS и SP соответственно. При работе программы ее текущий исполнимый код находится в кодовом сегменте, что фиксируется в регистре CS, а статические переменные основного блока и типизированные константы располагаются в сегменте данных, который запоминается регистром DS. Локальные переменные и параметры процедур и функций при вычислениях располагаются в стеке, и сегмент стека содержится в регистре SS. Последний регистр — SP — содержит смещение указателя стека в сегменте SSeg.

10.4. Тип Pointer

В Турбо Паскале предопределен специальный адресный тип Pointer — указатель: можно объявлять переменные, значением которых будет адрес ячейки памяти:

VAR

Р : Pointer; { переменная-указатель }

Значения этого типа занимают 4 байта памяти и содержат адрес какой-либо ячейки памяти. Адрес хранится как два слова: одно из них определяет сегмент, а другое — смещение. Значение указателя не может быть в явном виде выведено на экран или печать. Его надо предварительно расшифровывать. Для работы с указателями {189} вводится специальный набор функций. Кроме того, указатели полностью совместимы со ссылочным типом и могут использоваться (с оговорками) как ссылки. Указатели могут обмениваться значениями через оператор присваивания (:=), и сравниваться операторами = и <>. Но сравнение их — весьма ненадежная операция. Так, когда два указателя содержат один и тот же адрес в памяти, но записанный в них разными способами, они считаются различными. Таким образом, два указателя считаются одинаковыми, если в них записаны одинаковые значения сегмента и смещения. Во всех остальных случаях они считаются неравными. Понятия «больше» и «меньше» к значениям типа Pointer неприменимы.

Если мы хотим указать в программе на значение по указанному в переменной типа Pointer адресу, то мы должны использовать символ «^» после имени указателя, например: Р^. Это есть операция разыменования. Подробно этот вопрос рассмотрен при описании работы со ссылками, а особенности разыменования указателей обсуждаются вместе с работой функции Ptr.

10.5. Средства для работы с адресами

В разд. 10.3 были рассмотрены средства анализа расположения частей работающей программы. Обсудим инструментарий, применимый к данным, используемых программой. Это операции достаточно низкого уровня, но некоторые из рассматриваемых здесь функций можно с успехом применять и на более высоком уровне, в частности при работе с ссылками и динамическими данными. Список таких функций приведен в табл. 10.2.

Таблица 10.2

Функция : Тип

Возвращаемое значение

Addr(X) : Pointer

Ссылка на начало объекта X в памяти

Seg(X) : Word

Сегмент, в котором хранится объект X

Ofs(X) : Word

Смещение в сегменте для объекта X

Ptr(S, 0 : Word) : Pointer

Ссылка на место в памяти, заданное значениями смещения 0 и сегмента S

SizeOf(X) : Word

Размер объекта X в байтах

Операция @X : Pointer

Возвращает ссылку на начало объекта X в памяти (аналог функции Addr)

{190}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]