Как установить только флаг переполнения ARM сборки?
Я возился с флагами, изучая сборку ARM на моем Raspberry PI. Я изобрел способы только установить нулевой флаг, только отрицательный и только флаг переноса. Однако я не могу придумать способ установить только флаг переполнения. Возможно ли это? Любая помощь будет оценена по достоинству!
Edit: только установка флага переполнения со всеми остальными zero / clear. Используя только арифметику или сдвиг.
NZCV = 0001
Edit2: чтобы уточнить дальше, я бы подумал, что несколько для этого потребуются инструкции, а вы не можете писать непосредственно в КПСС.
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