MOV
Эта инструкция может принимать различные формы, в зависимости от значения, которое необходимо переместить. Изменяется, если значение является регистром или немедленным. Если он находится в регистре, он создает инструкцию ORR (ORR <Xd>, XZR, <Wm>
) *, а если он использует SP (указатель стека), он создает ADD (ADD <Xd|XSP>, <Xn|XSP>, #0
) *. Если вы перемещаетесь немедленно, то используете одну из команд MOVZ, MOVK или MOVN.
* Это 64-битные прототипы.
МОВЗ и МОВК
Эти два иногда используются один за другим. И они используются для перемещения немедленно.
MOVZ перемещает непосредственное значение (16-разрядное значение) в регистр, а все остальные биты за пределами непосредственного значения устанавливаются в ноль. Непосредственный может быть сдвинут влево на 0, 16, 32 или 48. MOVK перемещается и немедленное значение, но оставляет другие биты регистра без изменений. Например, допустим, вам нужно переместить это значение 0x7fb7fb1f88, чтобы зарегистрировать X0. Сначала вы переместите первые 16 битов (биты от 0 до 15) с помощью инструкции MOVZ, поэтому остальная часть регистра будет установлена на ноль. И затем вы переместите вторые 16 бит (биты 16–31) с помощью инструкции MOVK, поэтому значение, перемещенное до (первые 16 бит), останется в регистре, и вы сделаете то же самое с другими битами покоя.
instruction value of x0
mov x0, #0x1f88 | 0x1f88
movk x0, #0xb7fb, lsl #16 | 0xb7fb1f88
movk x0, #0x7f, lsl #32 | 0x7fb7fb1f88
MOVN
MOVN обычно используется для перемещения битовых масок, допустим, вы хотите переместить битовую маску 0xffffffff0000ffff в x0, затем вы переместите сдвиг 0xffff влево на 16, что приведет к значению 0x00000000fffff0000, но если вы отмените это значение, оно станет 0xffffffff0000ffff .
Вот пример:
instruction value of x0
MOVN x0, 0xFFFF, lsl 16 | 0xffffffff0000ffff