2010-01-24 75 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