如何使xmm寄存器中的特定字节为空?

时间:2016-09-28 00:38:20

标签: assembly 64-bit sse

我想知道是否有一种简单有效的方法来执行以下操作

下式给出:

sample       db   'hello worldxxxxx'
sample_len   db   11

我想:

movdqa xmm0, [sample]
; here I want to put a zero in the 11th byte of xmm0 (11 coming from [sample_len].
; I don't want to modify the original data.

高于[sample_len]的字节可以归零或不归零,无关紧要。我知道我可以用六个sse指令和/或使用pcmpestrm等来完成它,但我希望有一个更简单,更有效的方法。这似乎是一个简单的普通要求,如果没有更简单的解决方案,我会感到惊讶。

1 个答案:

答案 0 :(得分:3)

如果在编译时已知大小,则可以使用如下的几个移位指令:

PSLLDQ xmm0, (16 - 11) * 8
PSRLDQ xmm0, (16 - 11) * 8

您也可以使用PAND指令。但是,这需要另一个128位数字:

; if in a loop, you would pre-load the mask in a register
MOVDQA xmm1, [mask]
PAND xmm0, xmm1

; if one time event, directly access memory
PAND xmm0, [mask]

如果需要动态定义,可以在堆栈上构建掩码。只要确保它正确对齐......