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)吗?
答案 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。