给定一个长度为8的字节向量,例如,如何使用mmx指令将所有2转换为5?简单装配mmx练习的帮助
.data
v1 BYTE 1, 2, 3, 4, 1, 2, 3, 4
谢谢。
编辑:2和5只是一个例子。它们实际上是一个过程的参数。
给定一个长度为8的字节向量,例如,如何使用mmx指令将所有2转换为5?简单装配mmx练习的帮助
.data
v1 BYTE 1, 2, 3, 4, 1, 2, 3, 4
谢谢。
编辑:2和5只是一个例子。它们实际上是一个过程的参数。
我相信有几种方法可以做到这一点。例如,以下应该工作:
1)使(或负载)5的构成的掩模和2周的的二分之一的mmx
寄存器(mm0
- mm7
)
2)加载数据到另一个MMX寄存器,例如使用MOVQ
3)比较寄存器保存要测试的数据与2的掩码,例如使用PCMPEQB
,这将导致的FFh
掩模和00h
根据在寄存器中的元素是否为2或不
4)使用MASKMOVQ
,5的寄存器,并通过将所生成的掩模比较,以选择性地写出5的到那些以前持有2的职位。 MASKMOVQ
将为保存值为FFh
的掩码位置存储数据。
5)重复此操作直至完成。
6)最后,发出EMMS
退出MMX状态。在例程结束时还会发出SFENCE
或MFENCE
指令(因为MASKMOVQ
会生成非时间提示)。
如果您使用MMX而不是XMM,则不必担心对齐。
编辑:如果您在说明的细节方面遇到问题,英特尔®64和IA-32架构软件开发人员手册指令集参考(卷2A和2B)应包含您想要的所有内容知道。你可以找到它们here。
感谢您的回复。我忘记提到2和5只是一个例子。他们实际上是一个过程的参数?我将如何能够编程生成面具?顺便说一句,我正在寻找其他方法,而不是MASKMOVQ。更喜欢和,或者xor等...... – nunos 2010-01-24 19:53:04
(1)当然,它是2和5的关系并不重要。根据您的需要和可用的指令集,有几种方法可以生成常量字节的掩码。例如,您可以使用通用工具生成它们,然后使用MOVQ将它们加载到MMX寄存器中,也可以使用MOVD从通用寄存器加载并使用PUNPCK ..或PSHUF从1个字节生成掩码。指示。 (2)当然你也可以使用PAND和POR等来实现,只是因为MASKMOVQ已经存在,所以我认为这可能更直接。 – PhiS 2010-01-25 08:10:40