Сборка - Регистры

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

Чтобы ускорить работу процессора, процессор включает в себя несколько мест хранения внутренней памяти, называемых 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
*********