如果没有比较指令,如果不相等,它如何分支?

时间:2016-03-29 23:09:57

标签: assembly instructions powerpc

.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(如果不相等的分支)指令之前存在比较指令。有人可以解释一下这是如何比较或上面的说明中发生了什么?

1 个答案:

答案 0 :(得分:3)

关于Power的BNE指令,就像许多具有类似分支指令的指令集一样,实际上并不需要比较函数。在电源上,该指令只是检查条件寄存器(CR)中的位,测试是否设置或清除某些位。

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

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

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

  

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

     

位描述:

     

0-小于,浮点小于(LT,FL)用于定点比较   说明书,(RA)< SI或(RB)(签名比较)或(RA)      

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

     

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

     

3-汇总溢出,浮点无序(SO,FU)对于定点比较指令,这是最终状态的副本   XERSO完成指令。用于浮点比较   说明书,(FRA)和(FRB)中的一个或两个是NaN。

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