Почему машинный код инструкции ARM32 не может быть найден в наборе инструкций ARM64

Поскольку машинные инструкции ARM32 могут выполняться непосредственно на процессорах ARM64, я подумал, что машинный код инструкции ARM32 add r0, r0, r1 должен быть таким же, как у одной из этих двух инструкций ARM64:

add w0, w0, w1
add x0, x0, x1

Однако после objdump некоторого файла .o я обнаружил, что это не так. Машинный код для них такой:

e0800001    add r0, r0, r1
0b010000    add w0, w0, w1
8b010000    add x0, x0, x1

Затем я попытался найти, что означает e0800001 в ARM64, но я не нашел в ARM64 кода операции, начинающегося с 0xe0. Я искал документы об кодах операций ARM64 на https://github.com/CAS-Atlantic/AArch64-Encoding


person xiaokaoy    schedule 17.07.2020    source источник
comment
Поскольку машинные инструкции ARM32 могут выполняться непосредственно на процессорах ARM64, - они не могут, вам нужно переключать наборы инструкций перед тем, как вам нужно переключаться между Thumb (T32) и ARM (A32).   -  person Erlkoenig    schedule 17.07.2020
comment
См. это. Ядро может переключаться между AArch64 и AArch32 при возврате исключения.   -  person Erlkoenig    schedule 17.07.2020
comment
обратитесь к фактической документации руки, если вы хотите узнать об инструкциях руки.   -  person old_timer    schedule 17.07.2020
comment
документация по руке четко документирует aarch32 и aarch64, как переключать режимы и т. д. Какую часть документации по руке вы не поняли?   -  person old_timer    schedule 17.07.2020
comment
Принципиально это ничем не отличается от режима большого пальца и режима руки. Два разных набора инструкций, которые вам нужно использовать для переключения режимов. Биты есть биты, поэтому, естественно, будут битовые шаблоны, которые перекрываются с реальными инструкциями в различных наборах инструкций (несовместимые инструкции). Это не похоже на x86, где набор инструкций был переработан с 16 на 32 и 64 бита. Это совершенно новый набор инструкций с нуля.   -  person old_timer    schedule 17.07.2020
comment
@old_timer: Я бы увидел одно существенное отличие: вы можете компилировать/собирать/связывать код arm32 и thumb в одной и той же программе с одним и тем же набором компилятора.ассемблер/компоновщик. С Aarch64/Aarch32 вам нужно собрать двоичный файл Aarch64 с одним набором компилятора/ассемблера/компоновщика, а двоичный файл Aarch32 с другим.   -  person Frant    schedule 18.07.2020
comment
Разница между ARM (A32) и Thumb (T32) заключается в том, что переключение на/с большого пальца может быть выполнено напрямую с помощью инструкции BX даже в одном и том же приложении. Нет ничего необычного в переключении между A32/T32 в зависимости от потребностей в производительности. Переключение между AArch32/AArch64 должно выполняться на уровне ядра и, например. Linux не поддерживает приложения, использующие оба набора инструкций, поэтому каждое приложение является 32- или 64-разрядным. Поэтому переключение не так просто/прямо.   -  person Erlkoenig    schedule 18.07.2020
comment
@Frant уверен, что из-за характера того, как разыгрывалась история, и этот большой палец изначально был один к одному подмножеством набора инструкций руки высокого уровня, одна цепочка инструментов для этих наборов инструкций - это то, как ее реализовало большинство людей. С новым набором инструкций появился новый бэкэнд, и это тоже имело смысл (для популярных наборов инструментов, таких как gcc). В то же время x86 имеет несколько/много несовместимых языков ассемблера (att vs intel — лишь небольшая часть этого), которые стали несовместимыми по мере изменения набора инструкций. Это был просто высокоуровневый взгляд на попытку продемонстрировать, что битовые шаблоны не перекрываются.   -  person old_timer    schedule 18.07.2020
comment
@Frant, как насчет того, чтобы биты были битами, просто потому, что некоторые битовые шаблоны набора инструкций mips перекрываются с реальными (определенными) инструкциями руки, это не означает, что они должны быть совместимы или использовать одно и то же пространство битовых шаблонов набора инструкций. Точно так же, как наборы инструкций aarch32 и aarch64 полностью независимы (точно так же, как arm и mips полностью независимы) наборы инструкций и не используют одно и то же пространство битовых шаблонов. Вы находитесь в том или ином режиме.   -  person old_timer    schedule 18.07.2020


Ответы (1)


Вы делаете много необоснованных предположений.

Цитирование Справочное руководство по архитектуре ARMv8:

A1.3.2 Наборы инструкций Armv8

In Armv8 the possible instruction sets depend on the Execution state: AArch64 AArch64 state supports only a single instruction set, called A64. This is a fixed-length instruction set that uses 32-bit instruction encodings. For information on the A64 instruction set, see Chapter C3 A64 Instruction Set Overview. AArch32 AArch32 state supports the following instruction sets: A32 This is a fixed-length instruction set that uses 32-bit instruction encodings T32 This is a variable-length instruction set that uses both 16-bit and 32-bit instruction encodings.

Вкратце: у вас есть 3 набора инструкций, которые никак не связаны друг с другом.

Кроме того, ваше утверждение о том, что...

Машинные инструкции ARM32 могут выполняться непосредственно на процессорах ARM64.

...совсем не для всех процессоров ARMv8.
Если мы посмотрим на описание регистра для ID_AA64PFR0_EL1 (страница D13-3255):

EL3, bits [15:12]
          EL3 Exception level handling. Defined values are:

          0b0000      EL3 is not implemented.
          0b0001      EL3 can be executed in AArch64 state only.
          0b0010      EL3 can be executed in either AArch64 or AArch32 state.

          All other values are reserved.

EL2, bits [11:8]
          EL2 Exception level handling. Defined values are:

          0b0000      EL2 is not implemented.
          0b0001      EL2 can be executed in AArch64 state only.
          0b0010      EL2 can be executed in either AArch64 or AArch32 state.

          All other values are reserved.

EL1, bits [7:4]
          EL1 Exception level handling. Defined values are:

          0b0001      EL1 can be executed in AArch64 state only.
          0b0010      EL1 can be executed in either AArch64 or AArch32 state.

          All other values are reserved.

EL0, bits [3:0]
          EL0 Exception level handling. Defined values are:

          0b0001      EL0 can be executed in AArch64 state only.
          0b0010      EL0 can be executed in either AArch64 or AArch32 state.

          All other values are reserved.

Таким образом, ЦП ARMv8 может не поддерживать AArch32 на любом уровне исключений. И примером такого процессора является Apple A11, представленный в iPhone 8 и X.

person Siguza    schedule 17.07.2020