Кодировка инструкции
Современная инструкция X86 построена из следующих элементов:
- Префиксы (0, 1, 2, 3, 4)
- VEX (0, 2, 3)
- OPCODE (1)
- ModR / M (1)
- SIB (0,1)
- DISP (0,1, 2, 4)
- IMM (0, 1, 2, 4)
Префикс от 0 до 4 байтов:
Группа 1: LOCK илиREP
Группа 2: Сегменты (CS, SS, DS, ES, FS, GS - не все доступны в 64 битах) и подсказки ветвления (т. Е. Ветвление с большей вероятностью будет принято или нет?)
Группа 3: Размер операнда (66H, обязателен для некоторых инструкций!)
Группа 4: Размер адреса
VEX
VEX для расширения AVX (в основном)
OPCODE
OPCODE - фактическая инструкция, только 8 бит , если вы не учитываете VEX и некоторые другие префиксы / специальные байты , такие какзнаменитый 0F
.(В старые времена это был способ доступа к сопроцессорам x86.)
ModR / M определяет режим
Он сообщает нам, какой режим регистра и / или памяти используется в соответствии с этими инструкциями,Некоторые инструкции не поддерживают все доступные режимы.
Масштаб, Индекс, База
SIB является расширением ModR / M.
Смещение
DISP - это смещение, незамедлительно добавляемое в регистр адресов (как в [ESP + 13]). Это также может быть прямой адрес в ячейке памяти.
Немедленно
IMM немедленное значение(в MOV EBX, $8
- 8 - это значение, загруженное в EBX
, непосредственное значение.)
Обратите внимание, что IMM обычно ограничен 32 битами.REX
может использоваться для получения 64 битов, но он доступен не со всеми инструкциями (поскольку общее количество байтов для любой одной инструкции составляет 15 байтов).Чтобы загрузить 64 бита в регистр, вы всегда загружаете его из памяти.Один из способов сделать это - использовать IP-адрес.(Примерно так: MOV R8, [RIP, -42]
) Также я заметил, что в прошлом компиляторы, такие как gcc, не использовали эту инструкцию.Однако для 64-битных процессоров доступно 32-битное смещение, поэтому значение может быть практически любым (± 2 ГБ).
Загрузка инструкций
64-битные процессоры загружают инструкции в инструкциикэш.Он загружает 16 байтов за раз (это может варьироваться в зависимости от процессора).Затем процессор интерпретирует эти байты.В зависимости от процессора он может преобразовать эти байты в набор инструкций RISC или просто выполнить инструкции напрямую .
Например, инструкции LOOP label
на самом деле почти эквивалентныкак минимум две инструкции:
SUB ECX, 1
JNZ label
Некоторым процессорам в прошлом было трудно с такими, поэтому LOOP был очень медленным.Одна из причин заключается в том, что SUB
меняет многие из EFLAGS
, когда LOOP
не меняет ничего.
Интерпретатор не загружает инструкции в регистр.Он загружает его в CPU и обрабатывает его в соответствующем модуле (ALU, ACU, FPU и т. Д.). Однако есть регистр RIP, который указывает на текущую инструкцию.Насколько вам известно, RIP всегда указывает либо на начало текущей инструкции, либо на начало следующей инструкции.
Как это на самом деле реализовано, я не знаю.Они, вероятно, очень быстро (мгновенно) определяют, к какой единице это относится, и помещают туда инструкцию.Размер не так уж сложно определить, поэтому они могут быстро получить все байты и поместить их в соответствующий блок FIFO, вероятно, в виде значения 15 или 16 байтов (т.е. один элемент в FIFO, скорее всего, всегда 16 байтов, один байт можетигнорировать, что означает, что аппаратное обеспечение даже не имеет строк для его чтения!) Эти байты будут каждый раз размещаться в одном и том же месте.Поэтому, если у входа нет LOCK
или REP
, в этот байт FIFO будет добавлено, скажем, 00h
.
Обратите внимание, что перемещение 16 байтов в FIFO между единицами - ничто.Графические процессоры годами перемещают гораздо большие объемы данных в своих FIFO.
Можно сказать, что эти FIFO являются дополнительными регистрами.Файл реестра - это то же самое, что FIFO, только он имеет произвольный доступ вместо механизма типа «PUSH / POP».Оба используют одинаковые технологии, то есть память, для хранения данных в FIFO и в реестре.
Документация
Я бы предложил первый документ, который в настоящее время называется:
Руководства разработчика программного обеспечения для архитектуры Intel® 64 и IA-32 объединены тома: 1, 2A, 2B, 2C, 2D, 3A, 3B, 3C, 3D и 4
От Intel, как хорошо читать о доступных инструкциях (не совсем все, но более чем достаточно, чтобы начать!)