If statement AT&;T组件

If statement AT&;T组件,if-statement,assembly,conditional-statements,operator-keyword,If Statement,Assembly,Conditional Statements,Operator Keyword,在AT&T Assembly中,如何使用and运算符作为条件执行if语句 assume x = 0x60 assume y = 0x45 例如: if(x and y) //do something 这是正确的代码吗 .globl func func: push %r10 //r10 = x push %r11 //r11 = y movq $0x60, %r10 movq $0x45, %r11 jmp .l

AT&T Assembly
中,如何使用and运算符作为条件执行if语句

assume x = 0x60
assume y = 0x45
例如:

if(x and y)
    //do something
这是正确的代码吗

.globl func

func:
    push %r10     //r10 = x
    push %r11     //r11 = y
    movq $0x60, %r10        
    movq $0x45, %r11
    jmp .loop

.loop:
     movq %r10, %r12
     and $r11, %r12
     cmpq $0xFF, %r12
     je .if
     jmp .done
.if:
     //Do something here
     jmp .done     
.done:
    pop %r10     //r10 = x
    pop %r11     //r11 = y
    ret

代码审查:

您的代码过于复杂。(但这对初学者来说很正常;如果你在asm方面有了更多的经验后再回头看,你会说同样的话。)

您不需要保存/恢复r10或r11:允许函数对其进行删除。i、 他们被称为被击倒。通常,您会使用“传统”寄存器,如eax/rax和edx/rdx(由于您的数字较小,因此具有32位操作数大小)来保存代码大小。但是您可以担心以后保存REX前缀;r10和r11很好

您不需要任何
jmp
指令。
jmp
到下一行是多余的,并且无论是否有标签,no op:execution都会自动执行到下一行

您只需要一个
je
jne
跳过
。如果条件为false,则跳过


if分支 您的
和/cmp
条件对于布尔值或按位
没有意义。为什么只有设置了所有8位时才是真的?SSE2 SIMD指令,如
pcmpeqb
生成0或0xFF比较结果,但如果两个输入操作数均为非零,则没有指令生成
0xFF
。(所以您实现的是
if((x&y)==0xFF)

对于按位,
如果(x&y)
,使用
测试%r10,%r11/jz.done
。对于布尔值,在x上的测试和分支为非零(
测试%r10,%r10/jz.done
),然后对y重复

.globl bitwise_and     # args:  x in RDI,   y in RSI
bitwise_and:           # x86-64 System V calling convention

    test  %rdi, %rsi     # set flags according to x&y
    jz    .Lfalse        # skip the next block if (x&y) == 0
        # if condition was true, fall into the if block

    .Lfalse:
    ret
或布尔值

.globl boolean_and     # args:  x in RDI,   y in RSI
boolean_and:

    test  %rdi, %rdi
    jz    .Lfalse
    test  %rsi, %rsi
    jz    .Lfalse
        # if condition was true, fall into the if block

    .Lfalse:
    ret
不幸的是,x86并没有一种很好的方法来只使用一条分支指令来检查任何一个输入是否为零。编译器通常会像检查C的
x&&y
运算符的短路行为那样单独检查每个输入


对于
x | | y
,它更好:
x | | y
x | | y
为真的相同情况下为真,因此我们可以只做
或%rdi,%rsi
,根据结果设置标志。然后
jz
跳过
如果
块,或者结果为零。

运算符按位的d还是逻辑和?