ARM语法中“和”的条件执行

时间:2016-10-03 01:37:37

标签: assembly arm

我正试图抓住ARM编程中的条件执行。

所以我有点理解这样的情况:

if ( (R0 != 5) || (R2 != R3) ) ; != means not equal,  || mean OR 
{  
R4-- ; // R4 = R4 - 1 
}

ARM的版本是:

CMP   R0, 5
CMPEQ R2, R3
SUBNE R4, R4, 1

我很好奇ARM是如何知道这是一个“OR”(||)。所以它做了两个比较。但如果两者都比较不正确会发生什么。这是NE做的吗?如果它们不同会发生什么(例如下面的例子)。

所以我们可以说代码是这样的:

if ( (R0 > 5) && (R2 != R3) ) ; != means not equal,  && mean AND 
{  
R4-- ; // R4 = R4 - 1 
}

你如何用ARM中的条件指令写这个?

谢谢!

2 个答案:

答案 0 :(得分:3)

这是一些简单的逻辑,对于“OR”而言似乎是反直觉的。案件。 ' AND'在我看来更简单。关键是只有第一个条件通过' AND'才能评估第二个条件。对于' OR'情况恰恰相反。你使逻辑短路,而不必费心去执行第二个条件。

以下是' AND'的步骤。情况下,

  1. 测试cc1
  2. 如果cc1测试cc2
  3. 执行cc2
  4. 如果' cc1 == cc2'并且第一个是假的,然后第2步不执行,因此也不是3。

    举个例子,

    if((R0 > 5) && (R2 != R3)) R4--; 
    

    它会翻译成,

    TST   R2, R3     ; step 1 as (R2 != R3)
    MSREQ CPSR_f,#3<<30 ; set N and Z flags  (also APSR_nz)
    CMPNE R0, #5     ; step 2 as (R0 > 5)
    SUBPL R4, #1     ; step 3
    

    必须注意确保步骤1中的第一次测试不会影响步骤3的执行。可以为“&”和“&”按钮重新进行测试。条件,因为两者都必须进行测试。

    见:
    Dave space on conditional execution
    HeyRick on status register

答案 1 :(得分:1)

所以我认为我找到了解决问题的方法..对于那些可能也需要这个帮助的人。我有一位教授幸运地帮助我。

所以我们可以说代码是:

if ( (R0 > 5) && (R2 != R3) ) ; != means not equal,  && mean AND 
{  
R4-- ; // R4 = R4 - 1 
}

ARM条件解决方案可能是:

CMP   R0, #5
BLE   Somewhere
CMP   R2, R3
SUBNE R4, #1
Somewhere:

某处可以从下一次比较中分离出来,因为它是一个&#34;&amp;&amp;&#34;它失败了,你要确保你不要继续使用if语句。

BLE代表分支,如果小于或等于