2016-10-10 1 views
1

Чтобы привести пример: процессор x86_64, считывающий 128-разрядную инструкцию.Как работают операнды прямого числа в процессоре?

Из чего я понимаю, это столетие, что происходит в процессорах x86. В противном случае было бы невозможно добавить 64-битное число в 64-разрядный регистр (код операции займет несколько бит + 64 бит для числа> 64).

Что я хотел бы знать, так это то, что предел бит в инструкции есть и как читать инструкцию, если она больше, чем битбот (шина данных). Кроме того, я также знаю, что большинство процессоров RISC используют инструкцию с фиксированным размером, поэтому, если вы передаете числовой операнд напрямую, эта инструкция просто удваивается?

+1

На RISCs с размером инструкции фиксированного слова нет, как правило, нет инструкции, чтобы загрузить «любую» немедленную, только часть его, и полная немедленный затем построен несколько инструкций (если это не представляется возможным использовать такие немедленно, что это возможно кодировать его при одной нагрузке). На x86 размер инструкции не фиксирован, а команда такая же длинная, как требуется: 'movabs rax, 0x123456789abcdef0 = 48 B8 F0 DE BC 9A 78 56 34 12' = 10 байт (каждый' movabs rax, nn' имеет 10B, даже при загрузке с 0 немедленным, поэтому для опкода/операнда размер инструкции фиксируется даже на x86) – Ped7g

+0

Кодировки для каждой инструкции находятся прямо в руководстве. Этот HTML-выпуск официального PDF-файла Intel удобен: http://www.felixcloutier.com/x86/. См. Также http://stackoverflow.com/tags/x86/info для других ссылок на материал о x86. –

+0

Это полезно знать Ped7g. Я знаком с руководством, я просто не мог найти прямого собеседника. – RabbitBones22

ответ

6

x86_64 CPU чтения 128 разрядное инструкцию на

Это не произойдет, максимальный размер инструкции определяется как 15 байт. Вы можете построить более длинные инструкции, но они будут недействительными.

Вам не нужно 16 байтов, чтобы иметь инструкцию, которая принимает 64-битный непосредственный операнд. Есть только пара инструкций x64, которые даже делают это в первую очередь, например mov r64, imm64, который закодирован как REX.W B8+r io и, таким образом, составляет 10 байтов. Почти все 64-разрядные x64-инструкции, которые принимают немедленное принятие расширенного знака более коротких, 8 или 32 бит.

В RISC ISAs, как правило, невозможно иметь как можно больше размера слова, вам нужно будет построить большие значения в регистре в два этапа или загрузить их из памяти. Но x64, как и его корни x86, определенно не RISC.

Я подозреваю, что этот вопрос (частично) мотивирован мысленным изображением инструкций, поступающих по шине данных один за другим, что хорошо для MIPS или такого, но с инструкциями переменной длины без каких-либо требований к выравниванию, как у вас есть x86, вы просто не можете этого сделать - независимо от того, какой блок вы выбираете, это может быть (и, вероятно,), разрезание через какую-либо инструкцию. Таким образом, декодирование в простейшем виде - это машина состояний с буфером, декодирование первой инструкции и удаление ее из буфера, заполнение большего количества байтов, когда есть место (конечно, теперь это сложнее).

+0

Это действительно мой вопрос, спасибо. – RabbitBones22

4

BTW, данные операнда, встроенные в инструкцию, называются «немедленными» данными.


Это не так, как современные процессоры работают, но с шиной данных уже, чем самая длинная инструкция на самом деле не является проблемой.

8086, например, пришлось иметь дело с кодировками инструкций, которые шире, чем его 16-разрядная шина данных, без какого-либо кеша L1, чтобы скрыть этот эффект.

Как я понимаю, 8086 просто продолжает считывать слова (16 бит) в буфер декодирования, пока декодер не увидит целую команду одновременно. Если есть оставшийся байт, он перемещается в фронт буфера декодирования. Выбор команды для следующего insn фактически происходит параллельно с выполнением только что декодированной команды, но код-выборка по-прежнему является основным узким местом в 8086 году.

Таким образом, процессору нужен только буфер с наибольшей разрешенной инструкцией (исключая префиксы). Это 6 bytes for 8086, и это точно размер 8086's prefetch buffer.

«Пока декодер видит целую инструкцию» является упрощением: 8086 декодирует префиксы отдельно и «запоминает» их как модификаторы. 8086 не хватает 15-байтного максимального ограничения длины insn для более поздних процессоров, поэтому вы можете fill a 64k CS segment with repeated prefixes on one instruction).


Современные процессоры (например, Intel P6 и SnB семьи) выборки кода из L1-кэша, по крайней мере 16В куски, а на самом деле декодировать несколько команд параллельно. @ Гарольд красиво освещает остальную часть вашего вопроса.

См. Также Agner Fog's microarch guide, а также другие ссылки из тега wiki, чтобы узнать больше о том, как современные процессоры x86 работают, подробно.

Кроме того, в записи SandyBridge от David Kanter есть детали интерфейса для этой микроархитектурной семьи.
article

+0

Если я правильно понимаю ваше сообщение, процессор x86 имеет отдельный «блок», который извлекает инструкции и декодирует инструкцию, переводит ее в микрокод и передает его на обработку ядра (я)? Я уже понял, что многоядерный процессор нуждается в чем-то подобном, чтобы разделить рабочую нагрузку, но это делается и для одного ядра? – RabbitBones22

+0

@ RabbitBones22: Эта диаграмма является интерфейсом для одного ядра. Каждое ядро ​​имеет свое собственное оборудование для извлечения/декодирования, и это собственный личный I-кех L1. Ничто здесь не имеет ничего общего с многоядерным процессором, и вы не измените этот дизайн, если бы масштабировали Sandybridge до одноядерного дизайна. В любом случае да, каждое ядро ​​имеет свой собственный конвейер fetch/decode/execute, где этап декодирования декодирует каждую инструкцию x86 обычно, но иногда много внутренних микроопераций. –

Смежные вопросы