2010-01-24 43 views
0

给定一个长度为8的字节向量,例如,如何使用mmx指令将所有2转换为5?简单装配mmx练习的帮助

.data 
v1 BYTE 1, 2, 3, 4, 1, 2, 3, 4 

谢谢。

编辑:2和5只是一个例子。它们实际上是一个过程的参数。

回答

6

我相信有几种方法可以做到这一点。例如,以下应该工作:

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状态。在例程结束时还会发出SFENCEMFENCE指令(因为MASKMOVQ会生成非时间提示)。

如果您使用MMX而不是XMM,则不必担心对齐。

编辑:如果您在说明的细节方面遇到问题,英特尔®64和IA-32架构软件开发人员手册指令集参考(卷2A和2B)应包含您想要的所有内容知道。你可以找到它们here

+0

感谢您的回复。我忘记提到2和5只是一个例子。他们实际上是一个过程的参数?我将如何能够编程生成面具?顺便说一句,我正在寻找其他方法,而不是MASKMOVQ。更喜欢和,或者xor等...... – nunos 2010-01-24 19:53:04

+0

(1)当然,它是2和5的关系并不重要。根据您的需要和可用的指令集,有几种方法可以生成常量字节的掩码。例如,您可以使用通用工具生成它们,然后使用MOVQ将它们加载到MMX寄存器中,也可以使用MOVD从通用寄存器加载并使用PUNPCK ..或PSHUF从1个字节生成掩码。指示。 (2)当然你也可以使用PAND和POR等来实现,只是因为MASKMOVQ已经存在,所以我认为这可能更直接。 – PhiS 2010-01-25 08:10:40