Assembly cmp和subcc/组装中的其他

Assembly cmp和subcc/组装中的其他,assembly,sparc,Assembly,Sparc,SPARC汇编有一个cmp指令,用于比较两个数字(如果我理解正确,则使用减法)。它还有subcc、addcc、和cc等。执行计算后,使用cmp比较两个数字与设置条件代码之间有什么区别?我对这个概念的理解有点困难 在执行计算后,使用cmp和设置条件代码比较两个数字有什么区别 通常(例如在x86或68000型处理器上),cmp只设置状态标志,而不修改操作数或将结果存储在任何位置 sub等也在更改目标操作数(它们需要将结果存储在某处),这在执行比较操作时是不必要的 本质上,cmp是一个sub操作,其结

SPARC汇编有一个
cmp
指令,用于比较两个数字(如果我理解正确,则使用减法)。它还有
subcc
addcc
和cc
等。执行计算后,使用
cmp
比较两个数字与设置条件代码之间有什么区别?我对这个概念的理解有点困难

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

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

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

本质上,
cmp
是一个
sub
操作,其结果被简单地丢弃(可能节省指令周期)。进行比较时,您不需要结果,只需要知道结果是否为零,以及结果是否为负

特别是在SPARC上,
cmp
是一种“合成指令”,用于提高可读性,最终由汇编程序转换为
subcc
指令。请参阅第页的“合成说明”


因此,
cmp%reg1,%reg2
由汇编程序转换为
subcc%reg1,%reg2,%g0
。这将减去两个寄存器,并通过将结果存储到寄存器
%g0
中,有效地丢弃结果<代码>%g0是一个寄存器,读取时总是返回
0
,写入时不会更改。因此,在指令级别上,
cmp
subcc
之间没有任何区别(换句话说,SPARC没有单独的
cmp
指令,而是使用带有特殊目标寄存器的
subcc
进行比较).

我希望cmp是subcc,目标寄存器为g0,因此结果不会覆盖任何值寄存器,而只覆盖硬连线零寄存器。我怀疑它能节省任何周期,除非实现非常不寻常。这不是我在SPARC(
cmp
转换为
subcc
)的情况下基本上说的吗?是的,但你只知道发生了什么,而不是它是如何发生的。虽然链接的文本确实涵盖了这一部分,但需要一段时间才能到达这一部分。了解g0的使用以及如何构造合成指令都很有帮助。此外,当考虑CMP如何实现时,它可能不会节省指令周期,反而会使指令集变得更简单。有效语句:我已经更新了答案,希望现在有点清楚一些。