使用nasm在x86程序集中编程...
使用MOVQ指令我将m64放到xmm
MOVQ xmm1, qword [mymem64]
现在我想把它比作零,所以我可以使用Jcc
如何做和必须使用什么指令? (快速查看我没有找到的手册)
PS。我更喜欢英特尔语法:P
答案 0 :(得分:5)
如果要根据值有条件地跳转,请不要使用SSE。为了能够设置Jcc所需的标志,您需要将值存储在通用寄存器中。如果您使用的是64位,则可以执行以下操作:
mov r8,[m64]
test r8,r8
jnz .out
如果您使用的是32位,则可以分别检查这两个部分:
mov eax,dword [m64]
mov edx,dword [m64+4]
or eax,edx
jnz .out
答案 1 :(得分:3)
注意,比较xmm寄存器中的64位操作数是没有意义的,你可以使用通用寄存器。
如果需要对操作数进行AND或ANDN测试,可以使用PTEST:
PTEST XMM0, [yourmem128] ; compare
JZ somewhere ; jump if all bits of the logical and are zero
如果要测试两个64位操作数,则需要使用PCMPEQQ
PCMPEQQ XMM0, [yourmem128] ; compare two 64 bit words
PEXTRQ RAX, XMM0, 1 ; upper 64 bit
MOVQ RBX, XMM0 ; lower 64 bit
OR RAX, RBX
NEG RAX
JZ somewhere ; jump if at least one word is zero
答案 2 :(得分:2)
如果仅测试四字(64位),则应避免SSE:
CMP qword [mymem64], 0
JNZ .out
即使您正在测试完整的128位XMM,也是如此:
MOV rax, qword [mymem128]
OR rax, qword [mymem128+8]
JNZ .out
但是,如果您的CPU具有SSE 4.1,并且需要测试128位,则使用:
VMOVDQU xmm0, xmmword [mymem128]
VPTEST xmm0, xmm0
JNZ .out