Как установить только флаг переполнения ARM сборки?



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



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



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

493   2  

2 ответов:

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

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
abc cr
000 00 
001 01  x
010 01 
011 10 
100 01 
101 10 
110 10  x
111 11 

Подписал переполнения при выполнении не равно нести в. если первые столбцы являются msbits операнда A b и переносятся в msbit (другие биты не имеют значения для переполнения signed или unsigned), то правые столбцы являются carry out и result. Если результат равен 1, то вы получаете n бит. так должно быть с msbits операндов, равными 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 работает, другие процессоры / ядра будут делать это.

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

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

Comments

    Ничего не найдено.