我想知道是否有一种简单有效的方法来执行以下操作
下式给出:
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
等来完成它,但我希望有一个更简单,更有效的方法。这似乎是一个简单的普通要求,如果没有更简单的解决方案,我会感到惊讶。
答案 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]
如果需要动态定义,可以在堆栈上构建掩码。只要确保它正确对齐......