Что такое регистр указателя
Регистры ассемблера: виды, назначение и особенности команд
Ячейки процессора, которые также называются регистры ассемблера, из-за управляющего ими низкоуровневого языка программирования представляют собой некий блок свободных элементов в памяти. Их характерной особенностью является сверхбыстрый доступ к памяти. Чаще всего применяются регистры во время выполнения команд процессора и для программиста недоступны. Например, во время выборки из имеющейся сверхбыстрой памяти следующей по номеру команды ее код в двоичной системе помещается в регистр.
Напрямую обратиться к регистру невозможно. Кроме того, имеется ряд доступных блоков памяти, однако обратиться к ним возможно только из оболочки операционной системы. К таковым относят управляющие сегментные регистры, а также теневые системы дескрипторов. Применяют в своей работе данные регистры исключительно девелоперы ОС.
Вам будет интересно: Как записать гитару в FL Studio: простейшие методы
Виды регистров
Для различных нужд во время программирования применяются разные регистры Assembler. Используют их в зависимости от целей. К примеру, регистр счетчика применяется для организации как простых, так и вложенных циклов. Ниже перечислены основные типы регистров ассемблера:
Вам будет интересно: Как сделать визитку в иллюстраторе своими силами
Фактически все регистры занимают в памяти 32 бита. То есть могут содержать числа от нуля до 4294967295. Некоторые из регистров разделены на несколько частей по 16 и 8 бит. Это позволяет управлять либо частью блока памяти, либо ячейкой целиком, записывая в нее только часть данных.
Регистры ассемблера получили название согласно выполняемым функциям:
Особенности использования регистров
Регистры общего назначения
Регистры указатели
Для работы со стеком в assembler разработчиками предусмотрено два вида регистра. Для доступа к ним осуществляется операция прибавления к указателю вершины абстрактного типа значений битности определенного типа данных, который был помещен в стек. Все расчеты проводятся вручную. Таким образом сохраняется большое количество данных и передается в подпрограммы – процедуры и массивы. Среди регистров указателей в ассемблере выделяют:
Регистры-индексы
Индексные блоки памяти требуются для расширенной индексации. Кроме того, они участвуют в работе некоторых арифметических операций и обработки байтовых строк – последовательности байт, содержащих произвольное значение. В assembler включено два регистра, которые отвечают за индексирование ESI и EDI. Опишем их:
Сегментные регистры
Являются первыми блоками в памяти. Называются текущими сегментами. Программному обеспечению разрешается распределять более четырех блоков памяти. Однако при этом обязательно занести адреса блоков в ячейки памяти между сегментными регистрами. Данный вид блоков памяти является строго специфичным, благодаря чему невозможно заполнять их отдельным видом данных. Порядок блоков регистров в памяти может меняться. Хранение сегментных регистров производится в произвольном порядке в случайных местах памяти.
Регистр указателя команд
Данный вид относится к командным. С помощью данного указателя осуществляется вывод регистра ассемблера в листинг. Включает данные по поводу смещения на следующую команду относительно предыдущей. При разработке программного обеспечения практически не используется, однако требуется для просмотра листинга выполнения кода. Таким образом отслеживают ошибки.
Регистр флагов ассемблера
Отвечает за текущее состояние центрального процессора. Состоит из 16 бит, из которых могут быть заняты только 9. Заполнение данного блока памяти осуществляется после выполнения, пропуска или кода ошибки в результате предыдущей команды. Кроме того, часть битов используется процессором и может инициализироваться и удаляться посредством определенной системы команд. Таким образом осуществляется управление системой команд.
Регистры указатели и индексные регистры
Основное назначение этого вида регистров хранить указатели на другие регистры или ячейки памяти. Эту группу составляют следующие регистры:
· SI – индекс источника. Этот регистр применятся для некоторых операций над строками (строка – это совокупность слов). Регистр SI содержит указатель того места, где начинают производиться какие-либо действия.
· DI – регистр приёмника. Он также используется в операции над строками, но содержит указатель того места, куда пересылаются данные.
· SP – это регистр указатель стека. Стек – это специальная область памяти, организованная таким образом, что в нём для чтения и записи всегда доступна только одна ячейка из всех. Стек обеспечивает максимальную защиту данных, однако принципы работы со стеком от принципа работы с другими ячейками памяти.
Этот регистр указывает на ячейку памяти, которая является вершиной стека.
· BP – регистр базы, используемый в операции доступа к ячейкам памяти, а также в стековых операциях. Например, в стековых операция он указывает на стек в целом.
· IP – регистр указатель команд. Он определяет какую команду выполнять следующей, то есть указывает смещение на следующую команду.
Все эти регистры являются шестнадцатиразрядными, но они не делятся на однобайтные регистры.
Сегментные регистры.
Все программы и команды, выполняемые процессором, состоят из частей – сегментов, поэтому в состав процессора должны входить регистры, в которых хранятся начальные адреса сегментов, а также данные необходимые для работы с ними. Сегментные регистры бывают:
· CS – регистр сегмента кода команды. Он содержит начальный адрес команд и совместно с регистром IP используется для вычисления адреса следующей команды. Этот адрес вычисляется так: значение регистра CS + смещение на значение регистра IP.
· SS – регистр сегмента стека. Хранит начальные адреса сегмента стека и совместно с SP используется для определения области памяти, организованной как стек.
· DS – регистр сегмента данных. Он содержит начальный адрес сегмента данных. Этот регистр определят конкретный адрес ячейки памяти, с которой блок сегмента данных.
· ES – это дополнительный сегментный регистр, использующийся для дополнительного управления адресации памяти.
Регистры флага.
Для выполнения команд часто требуется знать не только результат выполнения предыдущей команды, но и определённые его характеристики. Для хранения характеристик результата выполнения предыдущей команды, используются регистры флага.
· CF – флаг переноса. Используется при сдвигах, равен 1, если сдвиг произошёл и равен 0, если сдвиг не произошёл.
· PF – флаг паритета. Используется для контроля чётности результата. То есть для контроля чётности количества единиц. Равен 1, если результат чётный и 0, если не чётный.
· AF – флаг дополнения переноса, используется в специальных арифметических операциях.
· ZF – флаг нулевого результата. Равен 1, если результат нулевой и равен 0, если результат не нулевой.
· SF – флаг знака. Равен 1, если результат отрицательный и равен 0, если результат положительный.
· TF – флаг трассировки или пошагового выполнения. Этот регистр переводит процессор в режим выполнения команд по шагам, то есть после каждого шага, происходит фиксация промежуточных результатов, то есть проверяется значение всех регистров и ячеек данных. В этот режим процессор переходит, если TF=1.
· IF – флаг прерывания. Прерывание — это приостановка работы процессора над данной задачей и переключение его на другую задачу. IF = 1, если прерывание произошло.
· DF – флаг сдвига, при управлении направлении стековых операций. DF = 1, если сдвиг вправо и 0, если влево.
· OF – флаг переполнения. Равен 1, если результат не помещается в ax и старший разряд необходимо перенести в dx.
Принципы работы с памятью. Логические виды памяти.
1. Физическая организация памяти.
В компьютере память физически организована следующим образом:
1. Оперативная память. Физически микросхема RAM представляет собой отдельную плату, которая подключается в специальный разъём на материнской плате. Эту плату можно легко заменить, необходимо лишь помнить о том, что она должна подходить к конкретному слоту материнской платы (DDR3) и совпадать с диапазоном частот шины данных процессора.
2. Кэш-память процессора. В современных компьютерах представляет собой небольшую микросхему, встроенную в корпус процессора. Она представляет собой единое целое с процессором, её невозможно заменить отдельно от него.
3. ROM. BIOS представляет собой небольшую микросхему, которая может быть либо встроена в материнскую плату, либо подключаться в специальный разъём. Непосредственная замена микросхемы ROM не нужна, но в случае крайней необходимости её заменить можно, если микросхема извлекаемая.
4. CMOS. Физически CMOS это небольшая микросхема, которая встроена в материнскую плату. Её замена невозможна.
2. Логическая организация памяти.
Логически для процессора весь объём памяти представляет собой единый блок, который процессор должен адресовать, то есть иметь возможность обратиться к любой единице этого блока памяти. Будь то ячейка оперативной памяти или кластер[1] жёсткого диска.
Важнейшей характеристикой процессора с точки зрения обращения к памяти является обслуживаемая им адресное пространство.
Адресное пространство – это совокупность всей памяти, которую в состоянии адресовать процессор. Для любого компьютера адресное пространство делится на три области:
Это область стандартной памяти. Занимает диапазон адресов от 0 до 640 kb. Эта область памяти в компьютере есть всегда. Её ровный объём 640kb.
Область верхней памяти. Занимает диапазон адресов от 640kb до 1Mb. Её размер 384kb, в ней хранятся BIOS и CMOS, а также другие дополнительные модули.
Область расширенной памяти. Расположена в диапазоне адресов от 1Mb до верхнего байта[2].
MS-DOS и TASM 2.0. Часть 8. Регистры.
Регистры процессора.
Процессор работает с данными. Обрабатываемые данные содержаться в оперативной памяти, куда считываются с жёсткого диска. Для того, чтобы ими манипулировать, а также верно организовывать свою работу по их обработке — выполнению программного кода, у процессора имеется система, построенная на небольших, но очень быстрых блоках памяти — регистров. Регистры процессора — это входящие непосредственно в процессор блоки памяти.
Изучать регистры процессора мы будем с использованием отладчика TD (Turbo Debugger) и нашей первой программы «Hello, world!» (prg.com). Так что запускаем предустановленный DOSBox и поехали (всё необходимое имеется в архиве DOS-1.rar, который можно скачать с нашего сайта).
Изучаем регистры процессора с помощью TD и нашей первой программы.
Для удобства работы с Turbo Debugger целесообразно увеличить рабочую площадь программы на всё окно.
Используем F5 для увеличения рабочей площади TD.
Регистры процессора Intel и их аналоги.
Количество регистров и их размер зависит от разрядности и сложности процессора.
Практически при написании кода регистры нужно понимать как постоянно имеющиеся под рукой программиста переменные.
Начиная с 80386, процессоры Intel и их аналоги имеют 16 основных регистров и 11 регистров для работы с числами с плавающей запятой (FPU/NPX) и мультимедийными приложениями (MMX). Для машины всегда быстрее и удобнее обращаться к регистру процессора, чем к памяти.
Помимо основных регистров существуют регистры управления памятью (GDTR, IDTR, TR, LDTR), регистры управления (CR0, CR1 – CR4), отладочные регистры (DR0 – DR7) и машинно-зависимые регистры, которые практически не используются в прикладном программировании.
Регистры процессора 8086.
Так как мы имеем дело с 16 битной операционной системой MS-DOS, то вернёмся во времена процессоров 8086 и 80286. В процессорах следующих поколений указанные регистры являются частями соответствующих 32 и 64 битных регистров с сохранением названия и функционала.
Например, регистр ax (16 бит) является составляющей частью регистра eax (32 бита). Благодаря указанному подходу достигается совместимость работы старых программ на новых компьютерах. Также сохраняются команды и директивы, переходя с 16 битного в 32 битный код.
Итак, процессор (8086 и 80286) содержит 12 16-ти разрядных программно-адресуемых регистров. Регистры процессора принято объединять в три группы:
Кроме этого, в состав процессора входят:
16-ти разрядность обозначает, что в каждом регистре может содержаться 0FFFFh бит информации, то есть два байта: 0FFh-0FFh информации.
Регистры данных (регистры общего назначения).
Регистры данных допускают независимое обращение к старшим (High — обозначается литерой H) и младшим (Lough — обозначается литерой L) половинам.
Лекция 2: Регистровая структура универсального микропроцессора
Регистровая структура универсального микропроцессора
В универсальном 32-разрядном микропроцессоре выделяют следующие группы регистров:
Рассмотрим каждую из этих групп подробнее.
Основные функциональные регистры
В состав регистров этой группы входят:
Состав и структура регистров общего назначения представлены на рис. 2.1.
Блок состоит из восьми 32-разрядных регистров. К каждому из них можно обращаться как к одному двойному слову (32 разряда).
Все эти регистры используются для хранения промежуточных результатов вычислений и составных частей адреса при различных режимах адресации операндов, расположенных в памяти.
Кроме того, ряд регистров этого блока имеют свое, присущее только им назначение:
Регистр указателя команд и регистр флагов имеют длину 32 разряда.
Младшее слово каждого из этих регистров (разряды 0-15) функционально соответствует аналогичным разрядам в 16-разрядном микропроцессоре (рис. 2.2).
Регистр указателя команд EIP хранит смещение адреса команд относительно начала сегмента кода (сегмента команд).
Регистр флагов EFLAGS содержит признаки результата выполненной команды, а также разряды, управляющие работой микропроцессора: обработкой маскированных прерываний, последовательностью вызываемых задач, вводом-выводом и рядом других действий. Из этих флагов рассмотрим только наиболее значимые и интересные с точки зрения дальнейшего изучения работы микропроцессора.
К битам состояния регистра флагов относятся:
В состав флагов управления входят:
При работе микропроцессора в реальном режиме в сегментном регистре содержатся старшие 16 разрядов 20-разрядного базового адреса сегмента. Физический адрес начала сегмента получается умножением этой величины на 16:
Регистры процессора с плавающей точкой
К этой группе регистров относятся (рис. 2.3):
Пользовательские регистры
§ Сегментные регистры
§ Регистр флагов
§ Регистр управления
Программная модель микропроцессора содержит 32 регистра, которые можно разделить на две группы:
— 16 пользовательских регистров;
— 16 системных регистров.
Заметим, что в данном курсе мы изучаем и применяем только пользовательские регистры.
Системные регистры будут использоваться при изучении дисциплин «Системное программное обеспечение» и «Методы защиты компьютерной информации».
Пользовательские регистры
Пользовательскими регистры называются потому, что программист может их использовать при разработке программ.
К пользовательским регистрам относятся:
1) восемь 32-битных регистров, которые могут использоваться программистами для хранения данных и адресов (регистры общего назначения)
2) шесть регистров сегментов: cs, ds, ss, es, fs, gs
3) регистр состояния (регистр флагов) eflags/flags ;
Обратим внимание, наклонной разделительной чертой обозначены части одного большого 32-разрядного регистра. Они могут использоваться в программе как отдельные объекты.
Благодаря этому поддерживается работоспособность программ, написанных для младших 16-разрядных моделей микропроцессоров фирмы Intel, начиная с i8086. Регистры микропроцессоров i486 и Pentium в основном 32-разрядные. Размерность у них больше, что и отражено в их обозначениях — они имеют приставку e (Extended).
Регистры общего назначения
Регистры общего назначения физически находятся в микропроцессоре внутри арифметико-логического устройства (АЛУ), поэтому их еще называют регистрами АЛУ.
Применяется для хранения промежуточных данных.
Применяется для хранения базового адреса некоторого объекта в памяти.
Применяется в командах, производящих некоторые повторяющиеся действия.
Его использование часто неявно и скрыто в алгоритме работы соответствующей команды. Например, команда организации цикла loop кроме передачи управления команде, находящейся по некоторому адресу, анализирует и уменьшает на единицу значение регистра ecx/cx.
Применяется для хранения промежуточных данных.
. Старшие 16 бит этих регистров как самостоятельные объекты недоступны.
Регистры esi / si и edi / di используются для поддержки так называемых цепочечных операций, то есть операций, производящих последовательную обработку цепочек элементов (можно сравнить со строками в языке Pascal ).
Этот регистр в цепочечных операциях содержит текущий адрес элемента в цепочке-источнике (первоначальная строка).
edi/di (Destination Index register) — индекс приемника ( получателя ).
Этот регистр в цепочечных операциях содержит текущий адрес в цепочке-приемнике (результирующая строка).
Регистры ebp / bp и esp / sp предназначены для работы со стеком.
Содержит указатель вершины стека в текущем сегменте стека.
ebp/bp (Base Pointer register) — регистр указателя базы кадра стека.
Регистр предназначен для организации произвольного доступа к данным внутри стека.
Сегментные регистры
В программной модели микропроцессора имеется шесть сегментных регистров:
Все сегментные регистры ¾ 16-разрядные.
Их существование обусловлено спецификой организации и использования оперативной памяти: микропроцессоры Intel в любом режиме работы (реальный режим, защищенный режим) поддерживают сегментную модель организации оперативной памяти.
Она заключается в том, что микропроцессор аппаратно поддерживает структурную организацию программы в виде частей (фрагментов), которые называются сегментами. Соответственно, такая организация памяти называется сегментной.
Сегментные регистры предназначены для того, чтобы указать на сегменты, к которым программа имеет доступ в конкретный момент времени.
Фактически в этих регистрах содержатся адреса ячеек памяти, с которых начинаются соответствующие сегменты.
Микропроцессор поддерживает следующие типы сегментов.
1. Сегмент кода (содержит команды программы).
Для доступа к этому сегменту служит регистр
Он содержит адрес сегмента кода, к которому в данный момент имеет доступ микропроцессор.
2. Сегмент данных (содержит обрабатываемые программой данные).
Для доступа к этому сегменту служит регистр
ds (data segment register) — сегментный регистр данных.
Он содержит адрес сегмента данных текущей программы.
3. Сегмент стека (область памяти, называемая стеком).
Работу со стеком микропроцессор организует по следующему принципу: последний записанный в эту область элемент выбирается первым ( LIFO ).
Для доступа к этому сегменту служит регистр
Он содержит адрес сегмента стека.
4. Дополнительные сегменты данных.
Если программе недостаточно одного сегмента данных, то она имеет возможность использовать еще три дополнительных сегмента данных.
Адреса дополнительных сегментов данных должны содержаться в регистрах
es, gs, fs (extension data segment registers).
es ¾ дополнительный сегментный регистр данных или экстракодов ( Extra Segment ).
При использовании дополнительных сегментов данных их адреса требуется указывать с помощью специальных префиксов переопределения сегментов в команде (например, fs : ).
Регистр состояния
Регистр состояния eflags/flags содержит информацию о состоянии микропроцессора.
Отдельные биты данного регистра имеют определенное функциональное назначение и называются флагами.
Младшая часть этого регистра полностью аналогична регистру flags для i8086.
Флаги регистра eflags/flags подразделяются на три группы.
Эти флаги отражают особенности результата исполнения арифметических или логических операций и могут изменяться после выполнения машинных команд.
Это позволяет анализировать состояние вычислительного процесса и реагировать на него (например, с помощью команд условных переходов и вызовов подпрограмм).
Используется для фиксирования факта потери значащего бита при арифметических операциях.
Используется в защищенном режиме работы микропроцессора для контроля доступа к командам ввода-вывода в зависимости от привилегированности задачи.
Используется в защищенном режиме работы микропроцессора для фиксации того факта, что одна задача вложена в другую
2) Флаг направления df (Directory Flag).
Он находится в 10-м бите регистра eflags и используется цепочечными командами. Значение флага df определяет направление обработки в цепочечных операциях: от начала строки к концу (df = 0) или от конца строки к ее началу (df = 1).
Управляют вводом/выводом, маскируемыми прерываниями, отладкой, переключением между задачами и виртуальным режимом 8086.
Предназначен для организации пошаговой работы микропроцессора.
Предназначен для разрешения или запрещения (маскирования) аппаратных прерываний.
(1 — аппаратные прерывания разрешены; 0 — аппаратные прерывания запрещены)
Используется при обработке прерываний от регистров отладки.
Признак работы микропроцессора в режиме виртуального 8086.
Предназначен для разрешения контроля выравнивания при обращениях к памяти.
Регистр управления
Регистр управления eip / ip содержит информацию о состоянии программы, команды которой в данный момент загружены на конвейер.
Содержит смещение следующей подлежащей выполнению команды (относительно текущего сегмента кода).
Регистр eip/ip имеет разрядность 32/16 бит.
. Этот регистр непосредственно недоступен программисту.
Загрузка и изменение его значения производятся различными командами условных и безусловных переходов, вызова процедур и возврата из процедур. Возникновение прерываний также приводит к модификации регистра eip/ip.