如果您想“将布尔结果存储在寄存器中”,则需要单独的指令来<
, <=
, >
,>=
等。您还需要一组用于有符号比较,另一组用于无符号比较。
在 x86 指令集中,所有这些都有一条指令cmp
(设置一堆标志),然后您使用适当的or指令查看您感兴趣的标志(例如,对于条件跳转,您使用, / , , /表示无符号(“低于”/“高于”),而, / , , /表示有符号(“更少”/“更大”))。jxx
setxx
jb
jbe
jna
ja
jae
jnb
jl
jle
jng
jg
jge
jnl
这种方法的另一个特点是,您可以在执行变异操作后实际检查标志,例如进行加法或借用减法。示例(假设esi
指向一个 128 位数字,该数字被添加到另一个edi
指向的 128 位数量):
add [edi], [esi]
adc [edi+4], [esi+4]
adc [edi+8], [esi+8]
adc [edi+12], [esi+12]
jc overflow
那只是 5 条指令(好吧,假设;实际上,x86 指令不能让两个操作数都是地址,一个必须是寄存器,这意味着加载该寄存器将需要更多指令)。使用“寄存器中的布尔结果”方法听起来会更复杂(但我猜不会太多,如果您使用的是允许三向加法的指令集)。