比较xmm中的四字

时间:2011-04-19 18:43:10

标签: assembly x86 nasm sse

使用nasm在x86程序集中编程...

使用MOVQ指令我将m64放到xmm

MOVQ xmm1, qword [mymem64]

现在我想把它比作零,所以我可以使用Jcc

如何做和必须使用什么指令? (快速查看我没有找到的手册)

PS。我更喜欢英特尔语法:P

3 个答案:

答案 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