Регистры и память

Регистры

Регистры — поля во внутрипроцессорной сверхбыстрой оперативной памяти. Размер регистров очень маленький, их количество сильно ограничено, потому что они безумно дорогие. Но при этом доступ к ним осуществляется гораздо быстрее, примерно за 11 такт, это где-то 0.20.20.30.3 нс.

Группы регистров

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

rax, eax, ax, al, ah (accumulator) — результат арифметических операций,
rcx, ecx, cx, cl, ch (counter) — счётчик цикла,
rdx, edx, dx, dl, dh (data) — общие данные, результаты операций, вывода,
rbx, ebx, bx, bl, bh (base) — указатель на данные и элементы структур данных,
rsp, esp, sp, spl (stack pointer) — указатель на вершину стека,
rbp, ebp, bp, bpl (base pointer) — указатель на базу стека внутри функции,
rsi, esi, si, sil (source index) — указатель на источник при операциях с массивами,
rdi, edi, di, dil (destination index) — указатель на место назначения при операциях с массивами;
r8r15 — регистры общего назначения, существующие только в 6464-битных процессорах. Рекомендуемого применения не имеют. Младшие 3232 бита получаются добавлением суффикса d, например r10d; младшие 1616 бит получаются добавлением суффикса w, например r10w; младшие 88 бит получаются добавлением суффикса b, например r10b.

Регистры состояния и управления — регистры, хранящие состояние процессора и исполняемой программы. Могут меняться после выполнения операций.

rip, eip, ip (instruction pointer) — указатель на следующую инструкцию для выполнения. Изменяется инструкциями перехода, такими как jmp, call, ret, а также любыми из производными, в частности, условными переходами.

rflags, eflags, flags — флаги, отражающие текущее состояние процессора.

Флаги

CF (carry flag) — флаг переноса. Устанавливается в 11, если произошёл перенос из старшего бита при сложении или заём в старший бит при вычитании.

Например, в регистре al находится число 0xFF, и мы прибавляем к нему число 0x03 с помощью инструкции add al, 0x03. Результат 0xFF + 0x03 = 0x102 не помещается в один байт al, поэтому он будет усечён до 0x02, и, поскольку при сложении произошёл перенос, флаг CF, будет установлен в 11.

PF (parity flag) — флаг чётности. Устанавливается в 11, если младший байт результата содержит четное количество установленных битов. Раньше использовался при проверке целостности данных, сейчас используется очень редко.

AF (auxiliary carry flag) — вспомогательный флаг переноса. Устанавливается в 11, если произошел перенос из младшего ниббла в старший ниббл. Используется для работы с двоично-десятичной арифметикой (BCD), напрямую редко используется.

ZF (zero flag) — флаг нуля. Устанавливается в 11, если результат последней операции равен 00.

SF (sign flag) — флаг знака. Равен значению старшего бита результата: 11, если результат отрицательный; и 00, если результат положительный.

OF (overflow flag) — флаг переполнения. Устанавливается в 11, если произошло переполнение со знаком, а точнее, когда переполняется бит, следующий за старшим (знаковым) битом.