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