例如,给定一个长度为 8 倍数的字节向量,我如何使用 mmx 指令将所有 2 转换为 5?
.data
v1 BYTE 1, 2, 3, 4, 1, 2, 3, 4
谢谢。
编辑:2 和 5 只是一个例子。它们实际上是过程的参数。
我确信有几种方法可以做到这一点。例如,以下应该工作:
mmx
1)在两个寄存器(mm0
- mm7
)中制作(或加载)一个5的掩码和一个2的掩码
2) 将数据加载到另一个 mmx 寄存器中,例如使用MOVQ
3) 将保存要测试的数据的寄存器与 2 的掩码进行比较,例如使用,PCMPEQB
这将根据寄存器中的元素是否为 2得到掩码FFh
00h
4) 使用MASKMOVQ
、带有 5 的寄存器和比较生成的掩码,以选择性地将 5 写入之前持有 2 的位置。MASKMOVQ
将存储保存FFh
值的掩码位置的数据。
5)重复这个直到完成。
6)最后,发出EMMS
退出MMX状态。还要在例程结束时发出SFENCE
or指令(因为会生成非临时提示)。MFENCE
MASKMOVQ
如果您使用 MMX 而不是 XMM,则不必担心对齐问题。
编辑:如果您对指令的详细信息有疑问,英特尔® 64 和 IA-32 架构软件开发人员手册,指令集参考(第 2A 和 2B 卷)应该包含您想知道的所有内容。你可以在这里找到它们。