mov x0, #-1
собирается следующим образом: (с aarch64-linux-gnu-as minus1.S
&& aarch64-linux-gnu-objdump -d a.out
):
0: 92800000 mov x0, #0xffffffffffffffff // #-1
Это movn x0, #0
Сборщики ARM знают, как кодировать mov
различные способы поддержки различных видов непосредственных битовых комбинаций. AArch64 имеет несколько форм немедленных с различными правилами кодирования. Использование mov
выдаст ошибку, если не удастся собрать одну инструкцию с немедленным , поэтому вам не нужно беспокоиться о том, что она превратится в нагрузку, относящуюся к ПК, как ARM32 ldr r0, =constant
может псевдоинструкция.
В документации ARM перечислены несколько форм mov
, и , одна из которых является псевдонимом для movn
, что отменяет его операнд-источник. Другие формы включают в себя форму, основанную на orr
-mmediate (с архитектурным нулевым регистром), который поддерживает повторяющуюся битовую комбинацию 2,4,8,16,32 или шириной 64 бита. И один из них основан на movz
, 16-битное мгновенное смещение влево в любую позицию.
Кажется, что метод, вызванный bl, вернет число в регистр x21, это правильно?
Нет, синтаксис ARM: op dst, src
.
mov x21, x0
копирует возвращаемое значение из x0
в x21
. Целочисленные возвращаемые значения находятся в x/w0
, так же, как в AArch32, где возвращаемые значения находятся в r0
.