Поиск…


замечания

Что такое регистры?

Процессор может работать с числовыми значениями (числами), но сначала они должны быть сохранены. Данные хранятся в основном в памяти или внутри кода операции инструкции (который обычно сохраняется в памяти) или в специальной встроенной памяти, размещенной непосредственно в процессоре, которая называется регистром .

Чтобы работать со значением в регистре, вам не нужно адресовать его по адресу, но используются специальные мнемонические «имена», например, ax на x86 или A на Z80, или r0 на ARM.

Некоторые процессоры сконструированы таким образом, что почти все регистры равны и могут использоваться для всех целей (часто группа RISC-процессоров), другие имеют четкую специализацию, когда для арифметики могут использоваться только некоторые регистры ( «аккумулятор» на ранних процессорах ) и другие регистры только для адресации памяти и т. д.

Эта конструкция, использующая память непосредственно на процессорном чипе, имеет огромную производительность, добавление двух чисел из регистров, сохраняющих ее обратно в регистр, обычно выполняется в кратчайшие сроки с помощью этого процессора (пример для процессора ARM: ADD r2,r0,r1 устанавливает r2 в (r0 + r1) в однопроцессорном цикле).

Напротив, когда один из операндов ссылается на место памяти, процессор может остановиться некоторое время, ожидая, что значение поступит из микросхемы памяти (на x86 это может варьироваться от нуля, ожидая значений в кеш-памяти L0 до сотен CPU циклы, когда значение не находится в каком-либо кеше и должно быть прочитано непосредственно из чипа DRAM памяти).

Поэтому, когда программист создает некоторый код обработки данных, она обычно хочет, чтобы все данные во время обработки в регистрах получали лучшую производительность. Если это невозможно, и требуется чтение / запись в память, то их следует свести к минимуму и сформировать шаблон, который будет взаимодействовать с архитектурой кэшей / памяти конкретной платформы.

Собственный размер регистра в битах часто используется для группировки процессоров, таких как Z80 , «8-битный процессор» , а 80386 - «32-разрядный процессор», хотя эта группировка редко является четким. Например, Z80 работает также с парами регистров, формируя собственное 16-битное значение, а 32-разрядный процессор 80686 имеет инструкции MMX для работы с 64-разрядными регистрами изначально.

Регистры Zilog Z80

Регистры: 8 бит: A , B , C , D , E , H , L , F , I , R , 16 бит: SP , PC , IX , IY и тени некоторых 8b регистров: A' , B' , C' , D' , E' , H' , L' и F' .

Большинство 8-битных регистров могут использоваться также в парах как 16-разрядные регистры: AF , BC , DE и HL .

SP - указатель стека , обозначающий нижнюю часть памяти стека (используется инструкциями PUSH / POP / CALL / RET ).
PC - это программный счетчик , указывающий на выполненную в данный момент команду.
I - регистр прерываний , обеспечивающий высокий байт адреса таблицы векторов для режима прерывания IM 2 .
R - регистр обновления , он увеличивается каждый раз, когда CPU извлекает код операции (или префикс кода операции).
На некоторых процессорах Z80 существуют некоторые неофициальные инструкции для управления 8- IXH:IXL частями IX как IXH:IXL и IY как IYH:IYL .

Теневые варианты не могут быть напрямую доступны какой-либо инструкцией, команда EX AF,AF' будет меняться между AF и AF' , а инструкция EXX поменяет BC,DE,HL на BC',DE',HL' .


Загрузка значения в регистр:

    ; from other register
    LD   I,A        ; copies value in A into I (8 bit)
    LD   BC,HL      ; copies value in HL into BC (16 bit)
    ; directly with value encoded in instruction machine code
    LD   B,d8       ; 8b value d8 into B
    LD   DE,d16     ; 16b value d16 into DE
    ; from a memory (ROM/RAM)
    LD   A,(HL)     ; value from memory addressed by HL into A
    LD   A,(a16)    ; value from memory with address a16 into A
    LD   HL,(a16)   ; 16b value from memory with address a16 into HL
    POP  IX         ; 16b value popped from stack into IX
    LD   A,(IY+a8)  ; IX and IY allows addressing with 8b offset
    ; from I/O port (for writing value at I/O port use "OUT")
    IN   A,(C)      ; reads I/O port C, value goes to A

Правильные комбинации возможных операндов источника и адресата ограничены (например, LD H,(a16) не существует).


Сохранение значения в памяти:

    LD   (HL),D     ; value D stored into memory addressed by HL
    LD   (a16),A    ; value A into memory with address a16
    LD   (a16),HL   ; value HL into 16b of memory with address a16
    LD   (IX+a8),d8 ; value d8 into memory at address IX+a8
    LD   (IY+a8),B  ; value B into memory at address IY+a8
    ; specials ;)
    PUSH DE         ; 16b value DE pushed to stack
    CALL a16        ; while primarily used for execution branching
      ; it also stores next instruction address into stack

Регистры x86

В 32-битном мире регистры общего назначения делятся на три общих класса: 16-разрядные регистры общего назначения, 32-разрядные расширенные регистры общего назначения и 8-разрядные регистры. Эти три класса не представляют собой три совершенно разных набора регистров. 16-разрядные и 8-битные регистры фактически являются именами областей внутри 32-разрядных регистров. Рост регистра в семействе процессоров x86 вызван расширением регистров, существующих в старых процессорах

Существует восемь 16-разрядных регистров общего назначения: AX, BX, CX, DX, BP, SI, DI и SP; и вы можете поместить в них любое значение, которое может быть выражено в 16 бит или меньше.

Когда Intel расширила архитектуру x86 до 32 бит в 1986 году, она удвоила размер всех восьми регистров и дала им новые имена, префикс E перед каждым именем регистра, в результате чего появились EAX, EBX, ECX, EDX, EBP, ESI, EDI и ESP.

С x86_64 произошло еще одно удвоение размера регистра, а также добавление некоторых новых регистров. Эти регистры имеют ширину 64 бита и называются (слэш, используемый для отображения альтернативного имени регистра): RAX / r0, RBX / r3, RCX / r1, RDX / r2, RBP / r5, RSI / r6, RDI / r7, RSP / r4 , R8, R9, R10, R11, R12, R13, R14, R15.

Хотя регистры общего назначения могут быть технически использованы для чего угодно, каждый регистр также имеет альтернативную / главную цель:

  • AX (аккумулятор) используется в арифметических операциях.
  • CX (счетчик) используется в инструкциях сдвига и поворота и используется для циклов.
  • DX (данные) используется в арифметических и операций ввода-вывода.
  • BX (базовый), используемый в качестве указателя на данные (в частности, как смещение в регистре сегментов DS в сегментированном режиме).
  • SP (стек) указывает на вершину стека.
  • BP (основание стека) указывает на основание стека.
  • SI (источник) указывает на источник в памяти для операций потока (например, lodsb ).
  • DI (пункт назначения) указывает на назначение в памяти для операций потока (например, stosb ).

Сегментные регистры, используемые в сегментированном режиме, указывают на разные сегменты в памяти. Каждый 16-разрядный сегментный регистр дает представление 64k (16 бит) данных. После того, как сегментный регистр был настроен на то, чтобы указывать на блок памяти, регистры (такие как BX , SI и DI ) могут использоваться как смещения в регистре сегментов, так что можно получить доступ к определенным местам в пространстве 64k.

Шестисегментные регистры и их использование:

регистр ФИО Описание
SS Сегмент стека Указывает на стек
CS Сегмент кода Используется CPU для извлечения кода
DS Сегмент данных Регистр по умолчанию для операций MOV
ES Дополнительный сегмент Дополнительный сегмент данных
FS Дополнительный сегмент Дополнительный сегмент данных
GS Дополнительный сегмент Дополнительный сегмент данных

Регистры x64

Архитектура x64 - это эволюция старой архитектуры x86, она совместима со своим предшественником (регистры x86 все еще доступны), но она также ввела новые функции:

  • Регистры теперь имеют емкость 64 бит;
  • Существует еще 8 регистров общего назначения;
  • Регистры сегментов вынуждены 0 в режиме 64 бит;
  • Ниже доступны 32, 16 и 8 бит каждого регистра.

Общее назначение

регистр название Подрегистрах (биты)
RAX аккумуляторный EAX (32), AX (16), AH (8), AL (8)
RBX База EBX (32), BX (16), BH (8), BL (8)
RCX счетчик ECX (32), CX (16), CH (8), CL (8)
RDX Данные EDX (32), DX (16), DH (8), DL (8)
RSI Источник ESI (32), SI (16), SL (8)
RDI Место назначения EDI (32), DI (16), DL (8)
КПБ Базовый указатель EBP (32), BP (16), BPL (8)
RSP Указатель стека ESP (32), SP (16), SPL (8)
R8-R15 Новые регистры R8D-R15D (32), R8W-R15W (16), R8B-R15B (8)

Заметка

Суффиксы, используемые для обращения к младшим битам новых регистров, означают:

  • B байт, 8 бит;
  • W-слово, 16 бит;
  • D двойное слово, 32 бит.


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow