使用NASM x86汇编编程比较四字......在XMM
用MOVQ指令我把M64到XMM
MOVQ xmm1, qword [mymem64]
,现在我想将它比作零,所以我可以用JCC
它是如何完成的以及指令必须使用的? (快速查看手册中我没有找到)
PS。我更喜欢Intel语法:P
使用NASM x86汇编编程比较四字......在XMM
用MOVQ指令我把M64到XMM
MOVQ xmm1, qword [mymem64]
,现在我想将它比作零,所以我可以用JCC
它是如何完成的以及指令必须使用的? (快速查看手册中我没有找到)
PS。我更喜欢Intel语法:P
如果要根据值有条件地跳转,请不要使用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
注意,它不会使感觉比较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
不错,只有我写在x86程序集中,所以没有r64 ... – davispuh 2011-04-20 09:07:48
好吧,现在我明白了。我已经使用了x86_64这么长时间,有时我忘记了还有一些32位机器 – hirschhornsalz 2011-04-20 09:11:08
我也有x64的盒子,但在32位程序中间不能使用64位寄存器... – davispuh 2011-04-20 09:42:06
我同意。但是,要回答这个问题:使用PCMPEQQ和PMOVMSKB。此外,有时您可以使用由PCMP创建的掩码来将条件跳转替换为按位算术。 – Jester 2011-04-19 23:00:27
Ouch,PCMPEQQ是一个SSE4.1指令,我最近的四核甚至不支持:P – 2011-04-19 23:09:53
谢谢,我的电脑有SSE4.1,但我最好不要用它:PI想过这种方式但是,MOVQ指令非常有吸引力:D – davispuh 2011-04-20 09:04:48