ЯП. 1. Регистры общего назначения (рон) процессора. Назначение и использование. Специальное назначение регистров
Скачать 0.61 Mb.
|
1. Регистры общего назначения (РОН) процессора. Назначение и использование. Специальное назначение регистров. Регистры общего назначения предназначены для хранения операндов арифметико-логических инструкций, а также адресов и отдельных компонентов адресов ячеек памяти. РОН можно использовать в любых арифметических и логических машинных операциях. EAX (A – Accumulator) – регистр общего назначения. Самый общий из всех регистров процессора. Регистр EAX содержит в себе регистры AX, AH, AL. EAX используется в качестве универсального аккумулятора значений. Т.е. если нужно сохранить 32 бита в регистре процессора, то следует использовать именно EAX. Регистр EAX имеет разрядность 23 бита, можно обратиться к младшим 16-ти битам через регистр AX. Сам же регистр AX делится на две части – младший байт AL и старший байт AH. EBX (B – Base) – регистр общего назначения. Часто используется для хранения адреса в оперативной памяти. Регистр EBX состоит из регистров BX, BH, BL. Регистр EBX применяется для хранения адреса в памяти. Обычно используют этот регистр для хранения базового адреса в сочетании со статическим смещением. EBX также можно использовать для хранения любых промежуточных данных. Регистр EBX имеет разрядность 32 бита. Можно обратиться к младшим 16-ти битам через регистр BX. Сам же регистр BX делится на две части – младший байт BL и старший байт BH. Регистр ECX (C – Count) – регистр общего назначения. В основном используется в командах цикла. Регистр ECX состоит из регистров CX, CH, CL. Регистр ECX применяют для организации циклов. Перед началом цикла в него помещают количество итераций (Итерация в программировании — организация обработки данных, при которой действия повторяются многократно, не приводя при этом к вызовам самих себя). Каждая команда loop уменьшает значение этого регистра. Когда значение регистра ECX становится равным 0, цикл завершается. Регистр ECX также можно использовать для хранения любых промежуточных данных. Регистр ECX имеет разрядность 32 бита. Можно обратиться к младшим 16-ти битам через регистр CX. Сам же регистр СХ делится на две части, младший байт CL и старший байт CH. Регистр EDX (D – Data) – регистр общего назначения. Используется для хранения промежуточных данных арифметических вычислений. Регистр EDX содержит в себе регистры DX, DH, DL. Регистр по своему назначению похож на EAX. EDX используется как и EAX в качестве универсального аккумулятора значений. EDX активно используется для операция умножения и деления (DIV, SUB). Регистр EDX имеет разрядность 32 бита. Можно обратиться к младшим 16-ти битам через регистр DX. Сам же регистр DX делится на две части – младший байт DL и старший байт DH. Регистр ESI – регистр общего назначения, обычно применяемый при обработке строк байтов. Регистр обычно используется для указания адреса источника в командах обработки строк байтов. Может использоваться наравне с другими регистрами общего назначения. Регистр ESI имеет разрядность 32 бита. Для обращений к нижним 16-ти битам используется регистр SI. Регистр EDI – регистр общего назначения, обычно применяемый при обработке строк байтов. Регистр EDI обычно используется для указания адреса назначения в командах обработки строк байтов. Может использоваться наравне с другими регистрами общего назначения. Регистр EDI имеет разрядность 32 бита. Для обращений к нижним 16-ти битам используется регистр DI. Регистр ESP хранит указатель на вершину стека. Регистр используется командами процессора работы со стеком PUSH, POP, PUSHA, POPA и командами передачи управления и вызова прерываний. Регистр ESP имеет разрядность 32 бита. Для обращений к нижним 16-ти битам используется регистр SP. Регистр EBP – регистр общего назначения, обычно применяемый для адресации в сегменте стека. Регистр EBP обычно используется для прямого доступа к стеку без использования команд PUSH и POP. Применяется компиляторами языков программирования высокого уровня для хранения базового адреса локальных переменных функции и процедур. Регистр EBP имеет разрядность 32 бита. Для обращений к нижним 16-ти битам используется регистр BP. 2. Регистр флагов. Основные флаги. Какие группы команд их устанавливают. Использование флагов. Команды ассемблера PUSHF и POPF. Регистр флагов - это регистр процессора, который используется при выполнении большинства команд. Регистр флагов носит название EFLAGS. Это 32-разрядный регистр. Однако старшие 16 разрядов используются при работе в защищенном режиме. К младшим 16 разрядам этого регистра можно обращаться как к отдельному регистру с именем FLAGS. Каждый бит в регистре FLAGS является флагом. Флаг – один или несколько битов памяти, которые могут принимать двоичные значения и характеризуют состояние какого-либо объекта. Обычно флаг может принимать одно из двух логических значений. Поскольку в нашем случае речь идет о бите, то каждый флаг в регистре может принимать либо значение 0, либо значение 1. Флаги устанавливаются в 1 при определенных условиях, или установка флага в 1 изменяет поведение процессора. На рисунке показано, какие флаги находится в разрядах регистра FLAGS Флаг установлен, если значение соответствующего ему бита равно 1. Флаг сброшен, если значение соответствующего ему бита равно 0. CF (carry flag) – флаг переноса. Устанавливается в 1, если результат предыдущей операции не уместился в приемнике и произошел перенос из старшего бита или если требуется заем (при вычитании). Команда CLC сбрасывает флаг CF. Команда STC устанавливает флаг CF в единицу. Команда CMC инвертирует значение флага CF. OF (overflow flag) – флаг переполнения. Устанавливается в 1, если результат предыдущей арифметической операции над числами со знаком выходит за допустимые для них пределы. Например, если при сложении двух положительных чисел получается число со старшим битом, равным единице, то есть отрицательное, и наоборот. AF (auxiliary carry flag) – вспомогательный флаг. Устанавливается в 1, если в результате предыдущей операции произошел перенос из третьего бита в четвертый. Этот флаг используется автоматически командами двоично-десятичной коррекции. SF (sign flag) – флаг знака. Этот флаг всегда равен старшему биту результата. ZF (zero flag) – флаг нуля. Устанавливается 1, если результат предыдущей команды равен 0. IF (interrupt enable flag) – флаг разрешения прерываний. Если сбросить этот флаг в 0, то процессор перестанет обработать прерывания от внешних устройств. Обычно его сбрасывают на короткое время для выполнения критических участков программы. Команда CLI сбрасывает флаг IF (запрещает прерывания). Команда STI устанавливает флаг IF в единицу (разрешает прерывание) DF (direction flag) – флаг направления. Контролирует поведение команд обработки строк. Если установлен в 1, то строки обрабатываются в сторону уменьшения адресов, если сброшен в 0, то наоборот. Команда CLD сбрасывает флаг DF. Команда STD устанавливает флаг DF в единицу. 3. Сегментные регистры. Их назначение. Регистр IP. Его назначение. Сегментные регистры используются при обращении к оперативной памяти. В программной модели микропроцессора имеется шесть сегментных регистров: cs, ss, ds, es, gs, fs. Их существование обусловлено спецификой организации и использования оперативной памяти микропроцессорами Intel. Она заключается в том, что микропроцессор аппаратно поддерживает структурную организацию программы в виде трех частей, называемых сегментами. Соответственно, такая организация памяти называется сегментной. Для того чтобы указать на сегменты, к которым программа имеет доступ в конкретный момент времени, и предназначены сегментные регистры. Фактически, с небольшой поправкой, как мы увидим далее, в этих регистрах содержатся адреса памяти с которых начинаются соответствующие сегменты. Логика обработки машинной команды построена так, что при выборке команды, доступе к данным программы или к стеку неявно используются адреса во вполне определенных сегментных регистрах. Микропроцессор поддерживает следующие типы сегментов: Сегмент кода. Содержит команды программы. Для доступа к этому сегменту служит регистр cs (code segment register) — сегментный регистр кода. Он содержит адрес сегмента с машинными командами, к которому имеет доступ микропроцессор (то есть эти команды загружаются в конвейер микропроцессора). Сегмент данных. Содержит обрабатываемые программой данные. Для доступа к этому сегменту служит регистр ds (data segment register) — сегментный регистр данных, который хранит адрес сегмента данных текущей программы. Сегмент стека. Этот сегмент представляет собой область памяти, называемую стеком. Работу со стеком микропроцессор организует по следующему принципу: последний записанный в эту область элемент выбирается первым. Для доступа к этому сегменту служит регистр ss (stack segment register) — сегментный регистр стека, содержащий адрес сегмента стека. Дополнительный сегмент данных. Неявно алгоритмы выполнения большинства машинных команд предполагают, что обрабатываемые ими данные расположены в сегменте данных, адрес которого находится в сегментном регистре ds. Если программе недостаточно одного сегмента данных, то она имеет возможность использовать еще три дополнительных сегмента данных. Но в отличие от основного сегмента данных, адрес которого содержится в сегментном регистре ds, при использовании дополнительных сегментов данных их адреса требуется указывать явно с помощью специальных префиксов переопределения сегментов в команде. Адреса дополнительных сегментов данных должны содержаться в регистрах es, gs, fs (extension data segment registers). Р егистр командного указателя IP (instruction pointer) содержит смещение следующей подлежащей выполнению команды относительного содержимого регистра кода CS в текущем сегменте команд. 4. Способы задания операндов в командах (виды адресации). Примеры. Микропроцессор предоставляет множество способов доступа к операндам, которые определяются используемым режимом адресации. Операнды могут находиться в регистрах, в командах, в памяти или портах ввода-вывода. Команды могут вовсе не иметь операндов, либо содержать один или два операнда. Большинство команд требуют двух операндов, один из которых является операндом-источником, а второй – операндом приемником. Один операнд может располагаться в регистре или памяти, а второй операнд обязательно должен находиться в регистре или непосредственно в команде. Непосредственный операнд моет быть только операндом-источником. В двухоперандной команде возможны следующие сочетания операндов: - регистр – регистр - регистр – память - память – регистр - непосредственный операнд – регистр - непосредственный операнд – память Способы задания: Операнд задается неявно. Команда явно не содержит операндов, но алгоритм ее выполнения использует некоторые регистры по умолчанию (регистры общего назначения, флаги в регистре флагов). Например, команды CLI и STI работают с флагом прерывания IF, а команда перекодировки символов XLAT используется без операндов, но требует наличия в регистре BX адреса смещения на таблицу перекодировки, а в регистре AL – порядкового номера исходного символа. Операнд задается в команде. Для хранения такого операнда в команде выделяется поле длиной до 32 бит. Непосредственный операнд может быть только источником, но не приемником результата. Операнд получатель может находиться в памяти, либо в регистре. Например, команда MOV AX, 0FFFF пересылает в регистр AX шестнадцатеричную константу FFFF. Операнд находится в одном из регистров. Регистров операнды указываются именами регистров. Сегментные регистры могут использоваться в качестве операндов только в инструкциях MOV, PUSH и POP. Сегментный регистр CS может быть источников в MOV, но не может быть приемников. Он не может также использоваться в команде POP. Регистр флагов и указатель команд IP не могут использоваться в качестве явно задаваемых операндов. Операндом является порт ввода-вывода. Помимо адресного пространства оперативной памяти микропроцессор поддерживает адресное пространство ввода-вывода объемом 64 кб, используемое для доступа к периферийным устройствам. Для любого устройства в пространстве ввода-вывода выделяются адреса. Значение адреса в пределах этого пространства называется портом ввода-вывода. Физически порту ввода-вывода соответствует аппаратный регистр, доступ к которому осуществляется с помощью команд IN и OUT. Например, команда IN AL, 60h читает байт из порта по адресу 60h. Регистры, адресуемые с помощью порта ввода-вывода, могут иметь разрядность 8,16 или 32 бит. В качестве источника или получателя применяются регистры аккумуляторы EAX, AX, AL. Операнд располагается в памяти. Такой способ задания операторов является самым эффективным. Он позволяет реализовать прямую и косвенную адресацию Прямая адресация. Простейший вид адресации операнда в памяти, т.к. исполнительный адрес содержится в самой команде и для его формирования не используется никаких дополнительных регистров. Исполнительный адрес извлекается из поля смещения команды, которое может иметь размер 8,16,32 бит. Это значение однозначно определяется байт, слово или двойное слово, расположенное в сегменте данных. Косвенная адресация. В команде может находиться часть исполнительного адреса, а остальные компоненты располагаются в регистрах, на которые указывают своим содержимым байты ModRegR/M и SIB. Поле Mod определяет наличие и размер отклонения, а поле R/M – используемую комбинацию регистров. Поле Reg в формировании адреса не участвует. Формула вычисления исполнительного адреса 5. Директивы определения данных. Инициализация данных различных типов. Хранение строк и отрицательных чисел. Для описания переменных в языке ассемблера используются директивы определения данных. Директива DB (DefineByte) определяет данные размером в байт [<имя>] DB <операнд> {, <операнд>} Встречая директиву DB, ассемблер вычисляет операнды и записывает их значения в последовательные байты памяти. Первому из байтов дается имя, по которому на него можно потом ссылаться. Существует два способа задания операндов директивы DB неинициализированное начальное значение ? (знак неопределенного значения) константное выражение со значением от -128 до 255. Например: XDB? По этой директиве переменной Х отводится один байт памяти, в который ничего не записывается. Ассемблер запомнит адрес переменной и когда он встретится в тексте, заменит его на данный адрес. Адрес ячейки, выделенной переменной с именем Х, принято называться значением имени Х (в отличие от содержимого) По описанию переменной ассемблер определяет, сколько байт занимает переменная в памяти. Этот размер называется типом переменной. Тип переменной равен 1, занимает 1 байт TYPE X = BYTE = 1 |