Сборка - Регистры
Операции процессора в основном связаны с обработкой данных. Эти данные могут быть сохранены в памяти и доступны оттуда. Однако чтение данных из памяти и сохранение данных в памяти замедляет работу процессора, поскольку включает в себя сложные процессы отправки запроса данных по шине управления и в блок хранения памяти и получение данных по тому же каналу.
Чтобы ускорить работу процессора, процессор включает в себя несколько мест хранения внутренней памяти, называемых registers.
В регистрах хранятся элементы данных для обработки без обращения к памяти. В микросхему процессора встроено ограниченное количество регистров.
Регистры процессора
В архитектуре IA-32 имеется десять 32-битных и шесть 16-битных регистров процессора. Реестры сгруппированы в три категории -
- Общие регистры,
- Регистры управления и
- Сегментные регистры.
Общие регистры делятся на следующие группы -
- Регистры данных,
- Регистры указателя и
- Индексные регистры.
Регистры данных
Четыре 32-битных регистра данных используются для арифметических, логических и других операций. Эти 32-битные регистры можно использовать тремя способами:
В виде полных 32-битных регистров данных: EAX, EBX, ECX, EDX.
Нижние половины 32-битных регистров могут использоваться как четыре 16-битных регистра данных: AX, BX, CX и DX.
Нижняя и верхняя половины вышеупомянутых четырех 16-битных регистров могут использоваться как восемь 8-битных регистров данных: AH, AL, BH, BL, CH, CL, DH и DL.
Некоторые из этих регистров данных используются в арифметических операциях.
AX is the primary accumulator; он используется во вводе / выводе и большинстве арифметических инструкций. Например, при операции умножения один операнд сохраняется в регистре EAX, AX или AL в соответствии с размером операнда.
BX is known as the base register, поскольку его можно использовать при индексированной адресации.
CX is known as the count register, поскольку регистры ECX, CX хранят счетчик циклов в итеративных операциях.
DX is known as the data register. Он также используется в операциях ввода / вывода. Он также используется с регистром AX вместе с DX для операций умножения и деления с большими значениями.
Регистры указателя
Регистры указателя - это 32-битные регистры EIP, ESP и EBP и соответствующие 16-битные правые части IP, SP и BP. Есть три категории регистров указателя -
Instruction Pointer (IP)- В 16-битном регистре IP хранится адрес смещения следующей инструкции, которая должна быть выполнена. IP в сочетании с регистром CS (как CS: IP) дает полный адрес текущей инструкции в сегменте кода.
Stack Pointer (SP)- 16-битный регистр SP предоставляет значение смещения в программном стеке. SP в ассоциации с регистром SS (SS: SP) относится к текущей позиции данных или адреса в программном стеке.
Base Pointer (BP)- 16-битный регистр BP в основном помогает ссылаться на переменные параметра, передаваемые в подпрограмму. Адрес в регистре SS комбинируется со смещением в BP, чтобы получить местоположение параметра. BP также можно комбинировать с DI и SI в качестве базового регистра для специальной адресации.
Индексные регистры
32-битные индексные регистры, ESI и EDI, и их 16-битные крайние правые части. SI и DI используются для индексированной адресации и иногда используются для сложения и вычитания. Есть два набора указателей индекса -
Source Index (SI) - Используется как исходный индекс для строковых операций.
Destination Index (DI) - Он используется в качестве индекса назначения для строковых операций.
Регистры управления
Комбинированный 32-битный регистр указателя инструкции и 32-битный регистр флагов рассматриваются как управляющие регистры.
Многие инструкции включают в себя сравнения и математические вычисления и изменяют состояние флагов, а некоторые другие условные инструкции проверяют значение этих флагов состояния, чтобы передать поток управления в другое место.
Биты общих флагов:
Overflow Flag (OF) - Указывает на переполнение старшего бита (крайнего левого бита) данных после арифметической операции со знаком.
Direction Flag (DF)- Он определяет направление влево или вправо для перемещения или сравнения строковых данных. Когда значение DF равно 0, строковая операция выполняется слева направо, а когда значение установлено на 1, строковая операция выполняется справа налево.
Interrupt Flag (IF)- Он определяет, следует ли игнорировать или обрабатывать внешние прерывания, такие как ввод с клавиатуры и т. Д. Он отключает внешнее прерывание, если значение равно 0, и разрешает прерывания, если установлено значение 1.
Trap Flag (TF)- Позволяет настроить работу процессора в пошаговом режиме. Программа DEBUG, которую мы использовали, устанавливает флаг прерывания, чтобы мы могли пошагово выполнять выполнение одной инструкции за раз.
Sign Flag (SF)- Показывает знак результата арифметической операции. Этот флаг устанавливается в соответствии со знаком элемента данных после арифметической операции. Знак обозначается старшим левым битом. Положительный результат сбрасывает значение SF до 0, а отрицательный результат устанавливает его на 1.
Zero Flag (ZF)- Указывает результат арифметической операции или операции сравнения. Ненулевой результат сбрасывает нулевой флаг до 0, а нулевой результат устанавливает его в 1.
Auxiliary Carry Flag (AF)- Он содержит перенос из бита 3 в бит 4 после арифметической операции; используется для специализированной арифметики. AF устанавливается, когда 1-байтовая арифметическая операция вызывает перенос из бита 3 в бит 4.
Parity Flag (PF)- Указывает общее количество единиц в результате, полученном в результате арифметической операции. Четное количество 1 бит сбрасывает флаг четности до 0, а нечетное количество 1 бит устанавливает флаг четности на 1.
Carry Flag (CF)- Он содержит перенос 0 или 1 из старшего бита (крайнего левого) после арифметической операции. Он также хранит содержимое последнего бита операции сдвига или поворота .
В следующей таблице указано положение битов флагов в 16-битном регистре флагов:
Флаг: | О | D | я | Т | S | Z | А | п | C | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Бит №: | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Сегментные регистры
Сегменты - это определенные области, определенные в программе для хранения данных, кода и стека. Есть три основных сегмента -
Code Segment- Он содержит все инструкции, которые необходимо выполнить. В 16-битном регистре сегмента кода или регистре CS хранится начальный адрес сегмента кода.
Data Segment- Он содержит данные, константы и рабочие области. В 16-битном регистре сегмента данных или регистре DS хранится начальный адрес сегмента данных.
Stack Segment- Он содержит данные и адреса возврата процедур или подпрограмм. Он реализован в виде «стековой» структуры данных. Регистр сегмента стека или регистр SS хранит начальный адрес стека.
Помимо регистров DS, CS и SS, существуют другие регистры дополнительных сегментов - ES (дополнительный сегмент), FS и GS, которые предоставляют дополнительные сегменты для хранения данных.
При программировании сборки программе требуется доступ к ячейкам памяти. Все ячейки памяти внутри сегмента относятся к начальному адресу сегмента. Сегмент начинается с адреса, который делится на 16 или 10 в шестнадцатеричной системе. Таким образом, крайняя правая шестнадцатеричная цифра во всех таких адресах памяти равна 0, что обычно не сохраняется в регистрах сегмента.
Регистры сегмента хранят начальные адреса сегмента. Чтобы получить точное местоположение данных или инструкции в сегменте, требуется значение смещения (или смещения). Чтобы ссылаться на любую ячейку памяти в сегменте, процессор комбинирует адрес сегмента в сегментном регистре со значением смещения ячейки.
пример
Посмотрите на следующую простую программу, чтобы понять использование регистров в программировании на ассемблере. Эта программа отображает на экране 9 звездочек вместе с простым сообщением -
section .text
global _start ;must be declared for linker (gcc)
_start: ;tell linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov edx,9 ;message length
mov ecx,s2 ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Displaying 9 stars',0xa ;a message
len equ $ - msg ;length of message
s2 times 9 db '*'
Когда приведенный выше код компилируется и выполняется, он дает следующий результат:
Displaying 9 stars
*********