汇编中的cmp和subcc / others

时间:2013-03-20 14:44:09

标签: assembly sparc

SPARC程序集有一条cmp指令,用于比较两个数字(如果我理解正确的话,使用减法)。它还有subccaddccandcc等。使用cmp比较两个数字和执行计算后设置条件代码有什么区别?我无法理解这个概念。

1 个答案:

答案 0 :(得分:2)

  

在执行计算后,使用cmp比较两个数字和设置条件代码有什么区别?

通常(例如在x86或68000类型处理器上)cmp仅设置状态标志,而不修改操作数或将结果存储在任何位置。

sub等也在改变目标操作数(它们需要将结果存储在某处),这在进行比较操作时是不必要的。

本质上,cmpsub操作,其中结果被简单地丢弃(可能保存指令周期)。在进行比较时,您不需要结果,只需知道结果是否为零,以及结果是否为负。

在SPARC上,特别是cmp是一个"合成指令"提供了更好的可读性,最终由汇编程序转换为subcc指令。请参阅"合成说明"在http://moss.csc.ncsu.edu/~mueller/codeopt/codeopt00/notes/sparc.html

因此,汇编程序将cmp %reg1,%reg2转换为subcc %reg1,%reg2,%g0。这会减去两个寄存器,并通过将其存储到寄存器%g0中来有效地丢弃结果。 %g0是一个寄存器,在读取时始终返回0,并且在写入时不会更改。因此,在指令级别上,cmpsubcc之间没有任何区别(换句话说,SPARC没有单独的cmp指令,但使用subcc有一个特殊的目的地登记册供比较)。