Форматы и кодирование инструкций
Форматы инструкций определяют, как каждая машинная инструкция представлена в двоичном виде — код операции, поля регистров и непосредственные значения — что влияет на компактность хранения программ и простоту их декодирования аппаратным обеспечением.
Definition
Формат инструкции — это определенное расположение битовых полей внутри машинной инструкции, которое кодирует ее операцию и операнды, а кодирование инструкции — это схема сопоставления инструкций с этими двоичными шаблонами.
Scope
Эта тема охватывает двоичное представление инструкций: кодировки фиксированной и переменной длины, поля, определяющие операцию, регистры-источники и регистры-приемники, а также непосредственные значения, а также компромисс между плотностью кода и простотой декодирования. Она включает репрезентативные семейства форматов, такие как типы R/I/S/B/U/J в RISC-V. Исключаются выбор режимов адресации операндов (режимы адресации) и более широкая философия RISC/CISC (RISC и CISC).
Core questions
- Какие поля должна содержать кодировка инструкции для определения операции и ее операндов?
- Как кодировки фиксированной и переменной длины соотносят простоту декодирования с плотностью кода?
- Как кодируются непосредственные значения и большие константы в рамках ограниченного числа битов инструкции?
- Как регулярное кодирование упрощает конвейерное декодирование инструкций?
Key concepts
- поле кода операции
- поля спецификаторов регистров
- непосредственные поля
- кодирование фиксированной длины против кодирования переменной длины
- плотность кода
- регулярность декодирования
- семейства форматов инструкций (R/I/S/B/U/J)
Mechanisms
Каждая инструкция делится на битовые поля: код операции выбирает операцию, поля регистров именуют операнды, а непосредственные поля содержат константы или смещения адресов. Форматы фиксированной длины (как в RISC-V) имеют одинаковую ширину всех инструкций и последовательно располагают поля, что делает декодирование простым и быстрым; форматы переменной длины (как в x86) плотно упаковывают инструкции для достижения высокой плотности за счет более сложного декодирования.
Clinical relevance
Выбор кодирования влияет на весь процессор: регулярные форматы фиксированной длины позволяют использовать простые, быстрые декодеры, что делает глубокий конвейер практичным, в то время как плотные форматы переменной длины уменьшают трафик инструкций в памяти. Компиляторы и ассемблеры должны точно ориентироваться на эти форматы, а расширения набора инструкций должны вписываться в существующее пространство кодирования.
History
Ранние наборы инструкций использовали нерегулярные, вручную настроенные кодировки для экономии дефицитной памяти. Движение RISC 1980-х годов отдавало предпочтение унифицированным форматам фиксированной длины для оптимизации декодирования и конвейеризации, в то время как наборы CISC, такие как x86, сохраняли плотные кодировки переменной длины. Современные открытые архитектуры наборов инструкций (ISA), такие как RISC-V, кодифицируют чистые, расширяемые семейства форматов.
Key figures
- David A. Patterson
- John L. Hennessy
Related topics
Seminal works
- patterson2020
- hennessy2019
Frequently asked questions
- Почему наборы инструкций RISC используют кодировки фиксированной длины?
- Инструкции фиксированной длины позволяют процессору определять следующую инструкцию и извлекать ее поля без предварительного декодирования длины, что упрощает и ускоряет этапы выборки и декодирования и значительно облегчает глубокий конвейер по сравнению с кодировками переменной длины.
- Как обрабатываются большие константы, если инструкции имеют только фиксированное число битов?
- Непосредственные поля ограничены, поэтому большие константы формируются по частям — например, инструкция загрузки старшего непосредственного значения устанавливает старшие биты, а последующая инструкция добавляет младшие биты — или константа помещается в память и загружается оттуда.