如何只设置溢出标志的ARM程序集?

时间:2018-10-02 03:15:47

标签: assembly raspberry-pi arm flags

在我的Raspberry PI上学习ARM组装时,我一直在弄弄Flags。我已经设计出仅设置零标志,仅设置负标志和仅设置进位标志的方法。但是我想不出一种只设置溢出标志的方法。可能吗?任何帮助将不胜感激!

编辑:仅将溢出标志设置为零,所有其他标志清零。仅使用算术或移位。 NZCV = 0001

Edit2:为进一步说明,我认为要实现此目的需要多个指令,并且您不能直接写入cpsr。

2 个答案:

答案 0 :(得分:2)

abc cr
000 00 
001 01  x
010 01 
011 10 
100 01 
101 10 
110 10  x
111 11 

有符号溢出是当执行不等于进位时。如果第一列是操作数ab的msbits并进位到msbit(其他位对于有符号或无符号溢出都无关紧要),则执行正确的列结果。如果结果为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的工作方式,其他处理器/内核将做到这一点。

因此,为了做到这一点,您需要一个处理器,将进位定义为减法的借位(在加法结束时将进位取反)

您在编写本文时编辑了问题,移位操作将如何修改带符号的溢出?需要加或减(需要使用加法器)

答案 1 :(得分: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