【问题标题】:When will CPSR's N bit and V bit both become 1?CPSR的N位和V位什么时候都为1?
【发布时间】:2019-11-15 08:18:03
【问题描述】:

ARM 文档说条件码 GE 在“N 等于 V”时为真,即符号位与溢出位相同。为什么这不仅仅是 N 和 V 都为零?由于 CMP 指令,N 和 V 都可以设置为 1 吗?即减法是否可以将符号和溢出都设置为1?

这个问题几乎和Assembly comparison flags understanding重复了

但是有人能用 ARM 汇编代码解释一下吗?我可以签到的东西(https://cpulator.01xz.net/?sys=arm)?

【问题讨论】:

标签: assembly arm


【解决方案1】:

你可以在几分钟内写完:

#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 .

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

【讨论】:

  • 用你有趣的模拟器试了一下,它确实按预期生成了 N = V = 1。为读者编写汇编语言的练习,而不是为你做那部分作业。
  • 道歉。我实际上想知道如何使用 CMP 指令将 N 和 V 都设置为 1。我也编辑了这个问题。你能看看吗?
  • 另外,在 ADD 指令的情况下,条件代码 GE(大于或等于)意味着什么?这个ADD后面的后缀GE的指令会被执行吗?
  • " 我实际上想知道如何使用 CMP 指令将 N 和 V 设置为 1。" 请参阅我在对您的问题的评论中链接到的表格。 CMP 基于减法设置标志。
  • 无论您如何获得标志,如果满足条件代码,指令将分支。因此,如果 N == V 是条件并且满足标志,那么它将分支,但是您设置了这些标志。分支或任何 bge、movge、addge 等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多