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

Assembly 如果没有比较指令,如果不相等,它如何分支?,assembly,instructions,powerpc,Assembly,Instructions,Powerpc,通常在PowerPC中,在bne(如果不相等则分支)指令之前有一条比较指令。有人能解释一下这是如何进行比较的,或者上面的指令中发生了什么吗?Power上的BNE指令与许多具有类似分支指令的指令集一样,实际上不需要比较功能。通电时,此指令只是检查条件寄存器(CR)中的位,测试是否设置或清除了某些位 在您提供的情况下,subf的结果将根据结果修改CR寄存器。程序员依靠这个减法的副作用来执行测试 事实上,这通常相当于实际的比较指令,因为比较通常会执行减法来确定在CR中设置哪些位。程序员只是一次做两件事

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

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

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

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

我建议您看一下参考资料中的第2章,其中介绍了分支处理器。特别注意第2.3.1节:

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

位描述:

0-小于,浮点小于(LT,FL)用于定点比较 说明,(RA)SI或(RB)(有符号 比较)或(RA)>uUI或(RB)(无符号比较)。对于 浮点比较指令(FRA)>(FRB)

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

3-摘要溢出,浮点无序(SO,FU)为定点比较指令,这是一个最终状态的拷贝 Xeroso在完成本说明时。用于浮点比较 说明,(FRA)和(FRB)中的一个或两个都是NaN


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

subf
设置标志。事实上,许多体系结构上的比较只是相减,结果被丢弃。@Jester在这种情况下,什么是BNE指令检查不相等?这可能是%运算符的使用吗?它正在检查
r11==0
,这看起来确实像是除以
30
0x1E
)的余数。@Jester它不是r11吗!=0?我没说树枝什么时候被拿走。它正在检查
r11==0
,如果不是,则进行分支:)在这个实例中,什么是BNE指令检查不相等?这可能是%运算符的使用吗?它不是在测试某个值是否不相等。如果你在这之前做过比较,这就是它的效果。它实际上只是测试条件寄存器中的位。我将为答案添加一个引用。BNE根本不测试,它只检查零标志。如果这是通过CMP设置的(通常是SUB,不存储其结果),或者是通过DEC设置/重置的,则无所谓。@Tommylee2k所以在这种特殊情况下,它检查r11是否不为零?或者用另一种方式说,它将检查它是否为假?它检查零标志,它最后一次受子功能影响。。。是的,据我所见(subf结果存储在r11中),如果r11不是零,bne将跳转
.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