首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xmm中四字的比较

xmm中四字的比较
EN

Stack Overflow用户
提问于 2011-04-19 18:43:10
回答 3查看 5.8K关注 0票数 4

在x86汇编中使用nasm编程。

使用MOVQ指令,我将m64放到xmm中

代码语言:javascript
复制
MOVQ xmm1, qword [mymem64]

现在我想将它与零进行比较,这样我就可以使用Jcc了。

如何做到这一点,以及必须使用什么指令?(快速查看手册,我没有找到)

PS。我更喜欢Intel语法:P

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-19 22:51:33

如果要根据值有条件跳转,请不要使用SSE。为了能够设置Jcc所需的标志,您需要将该值存储在通用寄存器中。如果您使用64位,您可以这样做:

代码语言:javascript
复制
    mov     r8,[m64]
    test    r8,r8
    jnz     .out

如果您使用的是32位,则可以分别检查这两个部分:

代码语言:javascript
复制
    mov     eax,dword [m64]
    mov     edx,dword [m64+4]
    or      eax,edx
    jnz     .out    
票数 5
EN

Stack Overflow用户

发布于 2011-04-20 00:05:24

请注意,比较xmm寄存器中的64位操作数是没有意义的,因此可以使用通用寄存器。

如果需要对操作数进行AND或ANDN测试,可以使用PTEST:

代码语言:javascript
复制
PTEST  XMM0, [yourmem128] ; compare
JZ     somewhere          ; jump if all bits of the logical and are zero

如果要测试两个64位操作数,则需要使用PCMPEQQ。

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2020-12-05 08:32:31

如果您只测试一个四字(64位),您应该避免SSE:

代码语言:javascript
复制
    CMP     qword [mymem64], 0
    JNZ     .out    

即使您正在测试完整的128位XMM的值,这也是正确的:

代码语言:javascript
复制
    MOV     rax, qword [mymem128]
    OR      rax, qword [mymem128+8]
    JNZ     .out    

但是,如果您有一个具有SSE 4.1的CPU,并且需要测试128位,那么请使用:

代码语言:javascript
复制
    VMOVDQU xmm0, xmmword [mymem128]
    VPTEST  xmm0, xmm0
    JNZ     .out    
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5721092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档