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还是逻辑和?