Регистры и память
Регистры
Регистры — поля во внутрипроцессорной сверхбыстрой оперативной памяти. Размер регистров очень маленький, их количество сильно ограничено, потому что они безумно дорогие. Но при этом доступ к ним осуществляется гораздо быстрее, примерно за такт, это где-то – нс.
Группы регистров
Регистры общего назначения — регистры, которые можно использовать как угодно. Эти регистры полностью подвластны программисту, и никто извне их внезапно менять не может.
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) — указатель на место назначения при операциях с массивами;
r8 – r15 —
регистры общего назначения, существующие только в -битных процессорах.
Рекомендуемого применения не имеют.
Младшие бита получаются добавлением суффикса d,
например r10d;
младшие бит получаются добавлением суффикса w,
например r10w;
младшие бит получаются добавлением суффикса b,
например r10b.
Регистры состояния и управления — регистры, хранящие состояние процессора и исполняемой программы. Могут меняться после выполнения операций.
rip, eip, ip (instruction pointer) — указатель на следующую инструкцию для выполнения.
Изменяется инструкциями перехода, такими как jmp, call, ret,
а также любыми из производными, в частности, условными переходами.
rflags, eflags, flags — флаги, отражающие текущее состояние процессора.
Флаги
CF (carry flag) — флаг переноса.
Устанавливается в ,
если произошёл перенос из старшего бита при сложении
или заём в старший бит при вычитании.
Например,
в регистре al находится число 0xFF,
и мы прибавляем к нему число 0x03 с помощью инструкции add al, 0x03.
Результат 0xFF + 0x03 = 0x102 не помещается в один байт al,
поэтому он будет усечён до 0x02, и, поскольку при сложении произошёл перенос,
флаг CF, будет установлен в .
PF (parity flag) — флаг чётности.
Устанавливается в , если младший байт результата содержит четное количество установленных битов.
Раньше использовался при проверке целостности данных, сейчас используется очень редко.
AF (auxiliary carry flag) — вспомогательный флаг переноса.
Устанавливается в , если произошел перенос из младшего ниббла в старший ниббл.
Используется для работы с двоично-десятичной арифметикой (BCD), напрямую редко используется.
ZF (zero flag) — флаг нуля.
Устанавливается в , если результат последней операции равен .
SF (sign flag) — флаг знака.
Равен значению старшего бита результата: , если результат отрицательный; и , если результат положительный.
OF (overflow flag) — флаг переполнения.
Устанавливается в , если произошло переполнение со знаком,
а точнее, когда переполняется бит, следующий за старшим (знаковым) битом.