給定一個長度爲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