Что мы подразумеваем под размером инструкции?

Я действительно смущен и могу звучать глупым вопросом, но я действительно не уверен, что это значит, когда мы говорим, что размер инструкции 32-битный или инструкция 16-битная.

Если размер операционного элемента равен 32-битному, то мы говорим, что это 32-битная инструкция, а если размер операнда равен 16-битной инструкции.

Или каждая инструкция имеет код операции, и если адрес кода операции 32-битный, то мы говорим, что инструкция 32-битная.

Я также прохожу архитектуру ARM, где я читаю все инструкции большого пальца 16-битные, но инструкция режима ARM 32 битные.

Размер инструкции полностью зависит от используемой архитектуры или зависит от режимов работы процессора?

РЕДАКТИРОВАТЬ:

http://www.xgc-tek.com/manuals/m1750-ada/m1750/x524.html

Данная ссылка предполагает, что 16-битная инструкция состоит из 8-битного кода операции и 4+4-битных двух регистров общего назначения.

Как это верно для набора инструкций ARM большого пальца??

2 ответа

Решение

ARM (исключая недавно выпущенную 64-битную версию) имеет два набора команд, которые состоят из команд фиксированного размера. Классическая называется ARM, а каждая инструкция 32-битная. Позже один называется Thumb (фактически Thumb2), который может иметь 32-битные или 16-битные инструкции. Существуют ядра ARM, которые поддерживают только наборы команд ARM, ARM+Thumb и только Thumb. Если ядро ​​поддерживает оба режима, оно имеет инструкции для изменения выбора активного набора команд, и потоки команд могут перемещаться между различными наборами (взаимодействие).

Инструкции ARM могут содержать фиксированные операнды, однако они никогда не могут быть такими большими, как размер инструкции. Некоторые инструкции также поддерживают операции над операндами, такими как сдвиг, вращение, что создает впечатление, что можно загрузить 32-битные значения одной инструкцией.

Пример № 1

a = 0x1;

Большой палец

2001        movs    r0, #1

РУКА

e3a00001    mov r0, #1

Пример № 2

a = 0xC0000000;

Большой палец

f04f 4040   mov.w   r0, #0xC0000000

РУКА

e3a00103    mov r0, #0xC0000000

Пример № 3

a = 0x12345678

Большой палец

f245 6078   movw    r0, #0x5678
f2c1 2034   movt    r0, #0x1234

РУКА

e3050678    movw    r0, #0x5678
e3410234    movt    r0, #0x1234

Дизайнер набора инструкций (машинный код), будь то группа людей или отдельное лицо, выбирает размер инструкций. Некоторые наборы команд, многие, имеют переменную длину, что буквально означает, что некоторые инструкции занимают больше битов, чем другие. Слово "код операции" хорошо подходит для этих унаследованных наборов инструкций, так как тот первый байт часто определял, какая это была инструкция, и по тому первому байту, который вы добавили в дополнительные байты операндов. Эти коды операций, о которых я думаю, x86, 6502, z80 и т. Д., Не обязательно имеют разные поля. Например, переключитесь на mips, чтобы понять, что я имею в виду под инструкциями фиксированной длины (хотя mips также имеет 16-битный режим, в который вы можете входить и выходить как из руки). Очень легко увидеть, где начальное декодирование некоторых битов определяет, какая из нескольких категорий команд, а затем несколько битов определяют инструкцию, также называемую битами кода операции. Но термин вводит в заблуждение со всеми наборами инструкций, которые мы имеем сегодня. Вы были бы правы и неправы, называя всю инструкцию кодом операции, в зависимости от того, о ком и о каком наборе инструкций вы говорите.

Таким образом, кто-то выбирает любым методом, опытом, экспериментами и т. Д., Что такое набор инструкций и что они могут втиснуть в эти биты. Для случая с оружием они начали с 32-битной инструкции фиксированной длины. Которые, как и mips, сразу же причиняли боль, но в то же время другие вещи были проще (выборка, расшифровка и т. Д.). Появились первые инструкции для большого пальца о том, что они были преобразованы непосредственно в их коллеги руки (эквивалент руки был задокументирован в ARM ARM) и, вероятно, вводились в трубу как инструкции руки. Это было тогда, это сейчас. Но это не имеет значения, вы определяете набор инструкций и его машинный код, и вы разрабатываете логику, которая анализирует этот набор инструкций и выполняет его так, как вы хотите, и со временем, если вы выживете, вы, скорее всего, сделали большинство компаний, чтобы изменить дизайн процессор использует другую логику. Возьмите 100 программистов и задайте им общую задачу разбора файла ascii, и вы получите от 2 до 100 различных решений, от языков до стилей и алгоритмов, каждый из которых является или может выполнять свою работу. Как и в случае с процессорами, вы можете изобрести столько разных действующих процессоров для набора команд, сколько у вас есть циклов проектирования.

ARM имеет традиционный набор 32-битных команд, который продолжает развиваться. Здесь и там добавлена ​​новая инструкция, но не для крупных изменений, пока не появится 64-битная вещь. Существует оригинальный набор команд большого пальца, который был строго 16-битными инструкциями (да, ветвь - это две отдельные 16-битные инструкции, читайте в документах). Затем они добавили thumb2, который использовал ранее неопределенные инструкции для большого пальца, чтобы расширить набор инструкций для большого пальца, чтобы восстановить некоторые особенности набора инструкций для охраны. эти инструкции должны восприниматься как пары, 32-битные, для правильной интерпретации. И есть Jazelle, который я до сих пор не могу найти доказательства того, что это фактический набор инструкций, из всего, что я могу выяснить, это программный пакет, который вы покупаете, а не фактический набор инструкций. Возможно, есть недокументированные инструкции для рук или большого пальца, чтобы поддержать Джазель, но я не вижу, где находится набор инструкций. А затем в arm было несколько наборов команд с плавающей запятой, но на самом деле это инструкции сопроцессора с переименованными полями и добавленной мнемоникой.

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

Оригинальный набор инструкций для большого пальца на данный момент является единственным распространенным набором инструкций, на котором говорят в семействе рук. По этой причине я бы потратил некоторое время на изучение этого в дополнение к другим. Самая сложная вещь, которая становится трудной после того, как вы выработаете свои привычки, - это заставить вашу инструментальную цепочку создавать вещи так, как вы хотите, чтобы они строились, в режиме "рука", когда большой палец, или большой палец, или все оружие. Thumb plus thumb2 extensions, или просто thumb без расширений. К сожалению, armv6 добавил около 30 инструкций thumb2. Armv7 добавил еще 140 или около того. Сначала был выпущен armv7m, позже был выпущен armv6m, затем был выпущен только один неон, и все такое, что привело к хаосу в цепочках инструментов и пользователям, которые пытались сгенерировать действительный код для рассматриваемого ядра, генерируя только те инструкции, которые он поддерживает, а не инструкции, которых он не делает.,

ARM ARM, ARM Architectural Reference Manuals и ARM TRMs, ARM Technical Reference Manuals описывают наборы инструкций (к сожалению, некоторые основные документы в ARM, другие в TRM), оттуда вы можете очень легко увидеть кодировку и что и где они втиснул вещи в инструкции ARM и в инструкции большого пальца. Я бы начал со старейшего архитектурного справочника, возможно, они называют ARMv5 ARM? Я не помню, но это оригинальная ARM ARM и содержит ARMv4T, включая как набор инструкций arm, так и оригинальный набор команд thumb. Тогда вам нужно больше руководств, чтобы увидеть, как они развивались.

РЕДАКТИРОВАТЬ, ваша ссылка (ссылки плохие при переполнении стека, они не выдерживают испытание временем)

MIL-STD-1750A - это еще одно семейство процессоров / набор инструкций, и машинный код разбивается по этой схеме и декодируется по этой схеме. thumb с расширениями thumb2 - это в основном набор команд переменной длины, так как вам нужно изучить первые 16 битов, чтобы определить, нужны ли вам дополнительные 16 битов, чтобы полностью понять инструкцию, это часто встречается в наборах команд переменной длины, таких как семейство x86.

Что касается arm и mips, то это режим, в котором вы находитесь в одном или другом режиме. Что касается других наборов команд, которые предназначены для переменной длины, то это не обязательно режим, а только то, как декодер работает все время. x86 действительно должен был играть в игры при переходе с 16-битной на 32-битную на 64-битную. Я еще не изучил новую архитектуру arm, вполне возможно, что она может поддерживать 64-битные регистры без набора 64-битных команд (x86 остается 8-битным набором инструкций, который поддерживает до 64-битных регистров, например), но я не знаю, так ли это что они сделали.

РЕДАКТИРОВАТЬ 2

Спасибо @dwelch за подробный ответ, и вы всегда готовы помочь людям. Мои сомнения очень просты. Допустим, у нас есть 16-битная инструкция сложения r1,r2, а размер кода операции здесь 8 бит, так что это значит, что r 1 и r2 могут не имеет значения больше 15 в нем (r1 и r2 имеют только 8 бит, чтобы делиться между ними). ​​Это правда?? -

Я думаю, что auselen пытался ответить на это таким образом.

Машинный код для сложения r1,r2 просто сообщает процессору несколько вещей: это операция сложения, операнды - это содержимое регистров r 1 и r2, и результат переходит в r1. Независимо от того, что r1,r2 и другие регистры всегда 32-битные. размер инструкции не имеет к этому никакого отношения. все 32 бита r 1 добавляются ко всем 32 битам r2, и весь 32-битный результат помещается в r1.

Где это становится трудным, с непосредственными ценностями. если вы хотите добавить непосредственное значение 1 к r1, то для этого есть место. но если вы хотите добавить значение 0x100000 к r1, то вы не можете сделать это с помощью режима большого пальца в одной инструкции, вы можете сделать это с помощью инструкций охраны и, я думаю, с помощью расширений thumb2, но не с помощью большого пальца, потому что дизайн набора инструкций не учитывал этого независимо от того, насколько большой набор инструкций вы не можете сделать все, что вы когда-либо хотели бы сделать в одной инструкции. Для большого пальца, чтобы добавить эту константу в регистр, вам нужно будет использовать другой регистр, а затем либо загрузить эту константу из памяти (попросив ассемблер поместить это значение в память при построении двоичного файла), либо вы можете, например, переместить 1 в зарегистрируйтесь, затем сдвиньте его влево на 20 бит. а затем выполните добавление этого регистра, который теперь содержит 0x100000 с r1, используя add r1,r2, предполагая, что r2 - это место, где вы поместили эту константу.

Mips и arm используют различные способы, чтобы заставить их работать в рамках инструкций фиксированной длины, mips в основном дает вам высокие 16 битов или младшие 16 битов и имеет набор инструкций, где половина инструкции является немедленной. В общем, Arm разбивает его на 8 бит и операнд сдвига, так что вы можете создавать любые немедленные, пока уникальные биты находятся в 8-битном кластере (плюс некоторые другие правила). Чтобы использовать чистые инструкции, mips принимает две инструкции для загрузки любого возможного 32-битного значения в регистр, для режима охраны требуется до 4 в режиме постановки на охрану. Режим большого пальца занимает больше, чем это.

Возвращаясь к теме, посмотрите на набор команд x86, один 8-битный код операции может сказать процессору выполнить некоторую операцию с двумя 64-битными регистрами. Это не просто 8-битный код операции, а вся инструкция всего 8 бит. Иногда 16, иногда больше. но дело в том, что инструкция указывает, какой регистр занимает всего несколько битов. размер регистра является частью дизайна набора команд, но не обязательно и часто не привязан к размеру команд. Значения r 1 и r2 могут быть в диапазоне от 0x00000000 до 0xFFFFFFFF включительно для любой операции.

Другие вопросы по тегам