Как установить только флаг переполнения ARM сборки? - PullRequest
0 голосов
/ 02 октября 2018

Я возился с флагами, изучая сборку ARM на моем Raspberry PI.Я разработал способы только установить нулевой флаг, только отрицательный и только флаг переноса.Однако я не могу придумать способ установить только флаг переполнения.Является ли это возможным?Буду признателен за любую помощь!

Редактировать: только установка флага переполнения со всеми остальными ноль / сброс.Используя только арифметику или сдвиг.NZCV = 0001

Edit2: Чтобы уточнить, я думаю, что для этого потребуется несколько инструкций, и вы не можете писать напрямую в cpsr.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Я не вижу очевидного пути только с одной инструкцией, но вы могли бы сделать с комбинацией.Например:

mov  r0, #0x80000000
mov  r1, #0x00000001
subs r2, r0, r1  ; C and V set
mov  r3, #0x10
asrs r3, #1      ; C cleared, V not changed
0 голосов
/ 02 октября 2018
abc cr
000 00 
001 01  x
010 01 
011 10 
100 01 
101 10 
110 10  x
111 11 

переполнение со знаком - это когда выполнение не равно переносу. Если первые столбцы являются мсбитами операнда ab и переносят в мсбит (другие биты не имеют значения для переполнения со знаком или без знака), правые столбцывыполнить и привести.Если результат равен 1, то вы получите N бит.таким образом, это должно быть с мсбитами операндов, равными 1, и переносом, являющимся 0

0xxx (carrys)
1xxx (operand a)
1xxx (operand b)

0x80 + 0x80 = 0x00 (zero flag)
0x81 + 0x81 = 0x02 (need some other ones)

  100000010
   10000001
+  10000001
============
   00000010

-127 + -127 = -254, самый большой отрицательный результат, который вы можете получить, равен -128, 0x80, поэтомуэто переполнение со знаком.

, но выполнения не существует.

Так что, может быть, сработает вычитание -127 - 127

  100000011
   10000001
+  10000000
============
   00000010

, но, будучи вычитанием, оно инвертирует перенос в заем, оставляя 0 в бите переноса?Это не то, как работает ARM, другие процессоры / ядра будут делать это.

Поэтому для того, чтобы сделать это, вам нужен процессор, который определяет выполнение как заем для вычитания (инвертирует выполнениев конце добавления)

Вы редактировали свой вопрос, когда писали это, как операция сдвига изменила бы переполнение со знаком?Необходимо сложить или вычесть (необходимо использовать сумматор)

...