【问题标题】:Conditional Execution for "And" in ARM syntaxARM 语法中“And”的条件执行
【发布时间】:2016-10-03 01:37:37
【问题描述】:

我试图掌握 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 是如何知道这是一个“或”(||)。所以它做了两个比较。但是如果两个比较都不正确会发生什么。那是NE做的吗?如果它们不同会发生什么(如下例所示)。

假设代码是这样的:

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

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

谢谢!

【问题讨论】:

  • 你没有。您只需反转两个条件,并在给出两个条件中的任何一个时跳过R4--(就像您对 || 所做的那样)
  • @Tommylee2k 反转是什么意思?你能举个例子吗?
  • ARM 不“知道”那个 asm 应该做什么,它只是运行你给它的指令。重要的是所有可能输入的结果与 C 相同。例如,在 asm 中实现时,如果您知道它们不会出错,则无需避免评估 C 短路的东西。 (例如,如果值已经在寄存器中,您可以先检查 && 的任何一半。但如果后半部分涉及取消引用指针,它可能为 NULL,因此您不应该编写 asm 来取消引用它时 C 不't.)

标签: assembly arm


【解决方案1】:

这是一些简单的逻辑,对于“或”的情况似乎与直觉相反。在我看来,'AND' 更简单。关键是第二个条件只有在第一个条件通过'AND'时才应该评估。对于“或”的情况,情况正好相反。您将逻辑短路,无需费心执行第二个条件。


这里是“AND”案例的步骤,

  1. 测试 cc1
  2. 如果 cc1 测试 cc2
  3. cc2 时执行

如果 'cc1 == cc2' 且第一个为 false,则不会执行第 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

【讨论】:

  • 这有帮助,但我如何在 ARM 指令中执行 #2?同时仍然使用条件指令
  • 我添加了一个编辑来展示你的例子。在某些“与”情况/条件下,您可能需要使用MSR 重置条件代码或使用分支。
  • 如果R2R3 是相等的正数怎么办? CMP 不会被执行,因为Z 标志已由TST 设置。但是N 标志被TST 清除了,所以SUB 将被执行,即使它不应该执行。
  • @Michael Thx,我也想到了这一点,并在您留下评论时进行了编辑(根据我上面的评论)。
【解决方案2】:

所以我想我已经找到了解决问题的方法。对于那些可能也需要帮助的人。幸运的是,我得到了一位教授的帮助。

所以可以说代码是:

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:

在某个地方可以从下一个比较分支出来,因为它是一个“&&”并且它失败了,所以您要确保不要继续执行 if 语句。

BLE代表小于等于分支

【讨论】:

  • 如果您开始引入分支(当不需要它们时),您并没有真正利用条件执行,因为分支会导致管道停顿。有条件执行的主要优点之一是您通常可以实现代码的无分支变体,这些变体通常会在其他 CPU 架构(缺乏条件执行)上需要​​分支。
  • @Michael 哦,有道理!我以前从未使用过 MSR 来检查正在设置的条件标志
猜你喜欢
  • 2021-03-17
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 2017-02-16
  • 2015-09-25
  • 2019-06-18
  • 2022-10-12
  • 1970-01-01
相关资源
最近更新 更多