Понятие указателя.
Понятие указателя (pointer) — одно из самых важных в программировании. Для начинающего программиста просто необходимо его понять и усвоить. Попробуем разобраться, что это такое и зачем он нужен.
Процессор работает с памятью. Минимально возможное значение памяти — 1 бит (bit). Память воспринимается машиной блочно. Один минимальный блок равен одному байту (byte), 1 байт = 8 бит (bit — минимальная адресуемая единица памяти).
Чтобы произвести манипуляции даже с битом, мы должны поместить его значение в байтный блок. Так как всего в байте восемь бит, в байтном блоке может содержаться до 256 (2 в степени 8) разных значений(DEC: от 0 до 255, HEX: от 0 до FFh). Побайтные блоки идут друг за другом. Каждый байт условно пронумерован (от нуля и далее…). Порядковый номер блока называется смещением (offset) или указателем (pointer).
Hiew в помощь.
Запускаем Hiew. Открываем текстовый файл D:\WORK\PTR\ptr-1.txt.
Переходим в 16-тиричный (HEX) режим просмотра (Enter или F4->HEX). Перед нами удобное отображение документа в 16-тиричном виде. Каждая строка содержит по 16 (10h) байт. В левой стороне для удобство ориентации строки пронумерованы (нумерация, естественно также в 16 битном режиме). В средней колонке мы видим код в виде цифр — так, как его видит компьютер (для удобства просмотра через каждые четыре байта проставлен дефис — это только для нас).
В крайней правой колонке отображается те же значения, но в виде ASCII символов. Таблица символов ASCII — это перечень соответствия цифр определённым буквам и символам (смотри таблицу символов ASCII) с помощью которых информация транслируется машиной в более понятный для человека вид. Таблица символов ASCII (American Standard Code for Information Interchange — американский стандартный код для обмена информацией) принята согласно достигнутым на международном уровне соглашениям. Наша любимая среда разработки DOS Tasm Editor (TASMED ) имеет ряд удобных подсказок, облегчающих написание и изучение программ, в частности встроенную таблицу ASCII.
Например, по смещению 0000005Dh располагается число 66h, которому согласно таблице символов ASCII, соответствует латинская буква «f».
При передвижении указателя посредством клавиш влево-вправо, вверх-вниз в верхней части окна мы заметим изменения показателя смещения (offset), на которое указывает курсор. Так вот, значение этого смещения и есть указатель (pointer) на байтные блоки.
Указатель и смещение — pointer, offset, address.
Разница между смещением (offset) и указателем (pointer) практически нет. Подразумевается, что смещение (offset) всегда относительно чего-то. В нашем случае — от начала файла. Слово «указатель» (pointer) не несёт в себе обременения относительности чего-то, но фактически является синонимом понятия offset.
При запуске программа отображается в память. Отображается определённым способом, согласно данным заголовка исполняемого файла или типа файла (*.com). Указатель (pointer) в данном случае будет отсчитываться от начала выделенной для программы памяти. Иногда его называют «эффективный адрес» (Effective Address). Таким образом, указатель на один и тот же блок кода в памяти и на жёстком диске исполняемого файла не будут совпадать.
А теперь внимательно проанализируйте следующие высказывания (все они истинны):
- По адресу 0000005Dh в текстовом файле ptr-1.txt находится число 66h.
- Адрес 0000005Dh в текстовом файле ptr-1.txt указывает на число 102.
- По адресу 0000005Dh в текстовом файле ptr-1.txt мы видим букву «f».
- По смещению 0000005Dh от начала текстового файла ptr-1.txt находится строка «fourth string.»
- Эффективный адрес (смещение) строки «fourth string.» в файле ptr-1.txt — 0000005Dh.
Синонимы слову «указатель», с которыми вы столкнётесь:
- Указатель (Си, С++, Ассемблер).
- Pointer (Си, С++, Ассемблер).
- Ptr (Ассемблер).
- Смещение (Ассемблер).
- Offset Address (Ассемблер).
- Offset (Ассемблер).
- Оффсет (Ассемблер).
- Оффсетный адрес (Ассемблер).
- Адрес (Ассемблер).
- Эффективный адрес (Ассемблер).
- Address (Ассемблер).
- Effective Address (Ассемблер).
Необходимо помнить.
- Указатель всегда относителен. Например, он может отсчитываться от начала файла, а может от начала места загрузки файла в память.
- Указатель указывает на начало блока памяти. Размер блока не определён. Блоком памяти может являться байт, несколько байт.
- Информация, содержащаяся в памяти, на которую указывает указатель может быть как кодом, так и данными.
Необходимо отметить, что в языке программирования Си и С++ понятие указателя несколько конкретизировано и более узко определено, чем в ассемблере: указатель – переменная, значением которой является адрес ячейки памяти. То есть, указатель — это тип переменной, которая хранит значение, а значение — адрес ячейки памяти. В дальнейшем мы будем говорить об указателе в широком смысле — более понятном и типичном для ассемблера, как в данной статье.
Общее понятие указателя вами освоено. В последствии мы разберёмся более детально, но всему своё время…
Необходимые файлы и программы по прежнему найдёте в архиве DOS-1.rar .