在SETcc
的页面上,我可以用测试(带符号(数字是否为负数
test %ax, %ax
sets %r10b
如果一个数字为零:
test %ax, %ax
setz %r10b
有没有一个条件来检查某个东西是否是阳性的。我在找一个ZF=0和SF=0的,如果存在的话。建议用什么方法来检查(签名的(数字是否为正数?
我唯一能想到的就是:
cmp %ax, $0
setg %r10b
有没有办法用test
做到这一点?
是的,您可以使用
test %ax, %ax
setg %r10b
正如您在链接的页面上看到的那样,setg
指令的精确定义是,如果ZF=0且SF=of,即如果零标志清除且符号标志等于溢出标志,它将设置其操作数。test
指令被定义为清除溢出标志,因此在这种情况下,如果ZF=0和SF=0,setg
将设置其操作数,这正是测试值为正的时候。
同样,您可以在test
之后使用setle
来设置值是否为非正,在这种情况下,setge
和setl
分别等效于setns
和sets
。
当然,条件跳转指令也是如此。
和往常一样,gcc和clang都知道这个技巧。