如果为正则设置字节

car*_*ass 3 x86 assembly

从 页面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

Nat*_*dge 5

是的,你可以使用

    test %ax, %ax
    setg %r10b
Run Code Online (Sandbox Code Playgroud)

正如您在链接的页面上看到的那样,该setg指令的精确定义是,如果 ZF = 0 且 SF = OF,即如果零标志清除且符号标志等于溢出标志,则它设置其操作数。该test指令被定义为清除溢出标志,因此在这种情况下,setg如果 ZF = 0 且 SF = 0,则设置其操作数,这正是被测试的值严格为正的时候。

同样,您可以使用setleaftertest来设置值是否为非正数,并且在此上下文中setgeandsetl分别等效于setnssets

当然,条件跳转指令也是如此。

像往常一样,gcc 和 clang 知道这个技巧。