在x86汇编中使用nasm编程。
使用MOVQ指令,我将m64放到xmm中
MOVQ xmm1, qword [mymem64]现在我想将它与零进行比较,这样我就可以使用Jcc了。
如何做到这一点,以及必须使用什么指令?(快速查看手册,我没有找到)
PS。我更喜欢Intel语法:P
发布于 2011-04-19 22:51:33
如果要根据值有条件跳转,请不要使用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 发布于 2011-04-20 00:05:24
请注意,比较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发布于 2020-12-05 08:32:31
如果您只测试一个四字(64位),您应该避免SSE:
CMP qword [mymem64], 0
JNZ .out 即使您正在测试完整的128位XMM的值,这也是正确的:
MOV rax, qword [mymem128]
OR rax, qword [mymem128+8]
JNZ .out 但是,如果您有一个具有SSE 4.1的CPU,并且需要测试128位,那么请使用:
VMOVDQU xmm0, xmmword [mymem128]
VPTEST xmm0, xmm0
JNZ .out https://stackoverflow.com/questions/5721092
复制相似问题