CPSR的N位和V位何时会变为1?

时间:2019-11-15 08:18:03

标签: assembly arm

ARM文档说,当“ N等于V”时,条件代码GE为true,即Sign位与oVerflow位相同。为什么不仅N和V都为零? CMP指令可以将N和V都设置为1吗?也就是说,减法会导致符号和溢出都设置为1吗?

这个问题几乎与Assembly comparison flags understanding

相同

但是有人可以用ARM汇编代码对此进行解释吗?我可以检入(https://cpulator.01xz.net/?sys=arm)吗?

1 个答案:

答案 0 :(得分:0)

您可能会在几分钟内完成以下内容:

#include <stdio.h>
int main ( void )
{
    unsigned int a,b,c,d;

    for(a=0;a<=7;a++)
    {
        for(b=0;b<=7;b++)
        {
            c = a+b;
            d = (a&3)+(b&3);
            d = (d&4)|(c&8);
            if(c&4)
            {
                if(d==0x4)
                {
                    printf("%u %u\n",a,b);
                }
            }
        }
    }
    return(0);
}


/*

1 3
2 2
2 3
3 1
3 2
3 3


   001
+  011
=======   

  0110
   001
+  011
=======   
   100

*/

因此,例如,如果您添加0x20000000和0x60000000,您应该会看到N = V = 1

编辑

基于以上

1 + 3

  001
+ 011
=======

1-(-3)将lsbit移至进位,以进行相同的数学运算,但要减去。

     1
   001
+  010
========

001-101 = 1-(-3)= 1 + 3

  0111
   001
+  010
========
   100

0x20000000-0xA0000000

编辑2

mov r0,#0x20000000
mov r1,#0xA0000000
cmp r0,r1
b .

在设置了N和V的比较之后,模拟器中的cpsr更改为0x900001d3。