【问题标题】:How does it branch if not equal if there is no compare instruction?如果没有比较指令,如果不相等,它如何分支?
【发布时间】:2016-03-29 23:09:57
【问题描述】:
.text:91C034B4                 li        r11, 0x1E     # Load Immediate
.text:91C034B8                 divw      r11, r27, r11 # Divide Word
.text:91C034BC                 mulli     r11, r11, 0x1E # Multiply Low Immediate
.text:91C034C0                 subf.     r11, r11, r27 # Subtract from
.text:91C034C4                 bne       loc_91C034E0

通常在 PowerPC 中,在bne(如果不相等则分支)指令之前有一条比较指令。有人可以解释一下这是如何比较的或者上面的说明中发生了什么吗?

【问题讨论】:

  • subf 设置标志。事实上,很多架构上的比较只是做减法,结果被丢弃。
  • @Jester 在这种情况下 BNE 指令检查不相等是什么?这可以使用 % 运算符吗?
  • 它正在检查 r11 == 0 是否确实看起来像除以 30 (0x1E) 的余数。
  • @Jester 不会是 r11 != 0 吗?
  • 我没说什么时候分行。它正在检查r11==0 和分支是否不是:)

标签: assembly instructions powerpc


【解决方案1】:

Power 上的BNE 指令与许多具有类似分支指令的指令集一样,实际上不需要比较函数。上电时,这条指令只是检查条件寄存器 (CR) 中的位,测试某些位是设置还是清除。

在您提供的情况下,subf 的结果将根据结果修改 CR 寄存器。程序员依靠这种减​​法的副作用来执行测试。

事实上,这通常等同于实际的比较指令,因为比较通常会执行减法来确定要在 CR 中设置哪些位。程序员只是同时做两件事。

我建议您查看PowerPC User Instruction Architecture 参考资料中的第 2 章,其中涵盖了分支处理器。特别要注意第 2.3.1 节:

对于比较指令,指定的 CR 字段设置为反映 比较的结果。指定 CR 字段的位是 解释如下。位的完整描述 set 在第 3.3.9 节的指令描述中给出,“Fixed- 点比较说明”,第 58 页和第 4.6.7 节, “浮点比较指令”(第 113 页)。

位说明:

0- 小于,浮点小于 (LT, FL) 用于定点比较 指令,(RA)

1- 大于,浮点大于 (GT, FG) 对于定点比较指令,(RA) > SI 或 (RB)(有符号 比较)或 (RA) >u UI 或 (RB)(无符号比较)。为了 浮点比较指令,(FRA) > (FRB)。

2- 相等, Floating-Point Equal (EQ, FE) 对于定点比较指令, (RA) = SI、UI 或 (RB)。对于浮点比较指令,(FRA) = (FRB)。

3- 摘要溢出,无序浮点 (SO, FU) 对于定点比较指令,这是最终状态的副本 XERSO 在指令完成时。对于浮点比较 指令,(FRA) 和 (FRB) 之一或两者都是 NaN。

请注意,这是在比较之后设置位的方式,因此然后由分支指令使用。如果您查看subf 指令的引用,您可以看到哪些CR 位也受到减法的影响,从而允许您像进行比较一样进行分支。

【讨论】:

  • 什么是BNE指令检查不相等在这种情况下?这可以使用 % 运算符吗?
  • 它不是在测试是否有不相等的东西。如果您在此之前立即进行了比较,这就是它的效果。它实际上只是测试条件寄存器中的位。我将添加对答案的引用。
  • BNE 根本不测​​试,它只检查零标志。如果这是通过 CMP 设置的(通常是一个 SUB,不存储其结果),或者它已被设置/重置,例如一个 DEC,没关系。
  • @Tommylee2k 所以在这种特殊情况下,它正在检查 r11 是否不为零?或者另一种说法是检查它是否为假?
  • 它正在检查最后一次受 subf 影响的零标志......所以是的,据我所知(subf 结果存储在 r11 中),如果 r11 是,bne 将跳转不为零
猜你喜欢
  • 1970-01-01
  • 2014-08-28
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 2016-01-05
相关资源
最近更新 更多