从 页面SETcc,我可以做一个测试,看看一个(有符号的)数字是否为负数:
test %ax, %ax
sets %r10b
Run Code Online (Sandbox Code Playgroud)
如果一个数字为零,则:
test %ax, %ax
setz %r10b
Run Code Online (Sandbox Code Playgroud)
是否有条件检查某事是否为正。我正在寻找一个 ZF=0 和 SF=0 的,如果存在的话。检查(签名)数字是否为正的建议方法是什么?
我唯一能想到的是:
cmp %ax, $0
setg %r10b
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点test?
是的,你可以使用
test %ax, %ax
setg %r10b
Run Code Online (Sandbox Code Playgroud)
正如您在链接的页面上看到的那样,该setg指令的精确定义是,如果 ZF = 0 且 SF = OF,即如果零标志清除且符号标志等于溢出标志,则它设置其操作数。该test指令被定义为清除溢出标志,因此在这种情况下,setg如果 ZF = 0 且 SF = 0,则设置其操作数,这正是被测试的值严格为正的时候。
同样,您可以使用setleaftertest来设置值是否为非正数,并且在此上下文中setgeandsetl分别等效于setns和sets。
当然,条件跳转指令也是如此。