В чем разница между MOV, MOVZ, MOVN и MOVK в сборке ARMv8? - PullRequest
0 голосов
/ 12 ноября 2018

Я использовал дизассемблер, когда натолкнулся на MOVZ, и был немного растерян, поскольку раньше я использовал только MOV.

Руководство по ISA ARMv8, конечно, объясняет все детали, и что MOV является псевдонимом для трех других в зависимости от контекста, но, возможно, кто-то может дать здесь некоторое обоснование и привести конкретные примеры для ускорения процесса обучения.

1 Ответ

0 голосов
/ 13 ноября 2018

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
...