在XMM

2011-04-19 65 views
2

使用NASM x86汇编编程比较四字......在XMM

用MOVQ指令我把M64到XMM

MOVQ xmm1, qword [mymem64] 

,现在我想将它比作零,所以我可以用JCC

它是如何完成的以及指令必须使用的? (快速查看手册中我没有找到)

PS。我更喜欢Intel语法:P

回答

4

如果要根据值有条件地跳转,请不要使用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  
+0

我同意。但是,要回答这个问题:使用PCMPEQQ和PMOVMSKB。此外,有时您可以使用由PCMP创建的掩码来将条件跳转替换为按位算术。 – Jester 2011-04-19 23:00:27

+0

Ouch,PCMPEQQ是一个SSE4.1指令,我最近的四核甚至不支持:P – 2011-04-19 23:09:53

+0

谢谢,我的电脑有SSE4.1,但我最好不要用它:PI想过这种方式但是,MOVQ指令非常有吸引力:D – davispuh 2011-04-20 09:04:48

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 
+0

不错,只有我写在x86程序集中,所以没有r64 ... – davispuh 2011-04-20 09:07:48

+0

好吧,现在我明白了。我已经使用了x86_64这么长时间,有时我忘记了还有一些32位机器 – hirschhornsalz 2011-04-20 09:11:08

+2

我也有x64的盒子,但在32位程序中间不能使用64位寄存器... – davispuh 2011-04-20 09:42:06

相关问题