Как обнулить определенный байт в регистре XMM?
Я хочу знать, есть ли простой эффективный способ сделать следующее
дано:
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 ответ
Если размер известен во время компиляции, вы можете использовать пару команд сдвига, например, так:
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]
Вы можете построить маску в стеке, если вам нужно определить ее динамически. Просто убедитесь, что он правильно выровнен...