Поскольку машинные инструкции 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
BX
даже в одном и том же приложении. Нет ничего необычного в переключении между A32/T32 в зависимости от потребностей в производительности. Переключение между AArch32/AArch64 должно выполняться на уровне ядра и, например. Linux не поддерживает приложения, использующие оба набора инструкций, поэтому каждое приложение является 32- или 64-разрядным. Поэтому переключение не так просто/прямо. - person Erlkoenig   schedule 18.07.2020