我正试图抓住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中的条件指令写这个?
谢谢!
答案 0 :(得分:3)
这是一些简单的逻辑,对于“OR”而言似乎是反直觉的。案件。 ' AND'在我看来更简单。关键是只有第一个条件通过' AND'才能评估第二个条件。对于' OR'情况恰恰相反。你使逻辑短路,而不必费心去执行第二个条件。
以下是' AND'的步骤。情况下,
如果' 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代表分支,如果小于或等于