Помогите с простой сборкой mmx упражнение - PullRequest
0 голосов
/ 24 января 2010

Учитывая вектор байтов с длиной, кратной 8, как я могу, используя инструкции mmx, преобразовать все 2 в 5, например?

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

Спасибо.

изменить: 2 и 5 только пример. На самом деле они являются параметрами процедуры.

1 Ответ

6 голосов
/ 24 января 2010

Я уверен, что есть несколько способов сделать это. Например, должно работать следующее:

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, вам не придется беспокоиться о выравнивании.

Редактировать: Если у вас возникли проблемы с подробностями инструкций, Руководство разработчика программного обеспечения для архитектуры Intel® 64 и IA-32, Справочник по наборам инструкций (тома 2A и 2B), должно содержать все, что вы когда-либо хотели узнать , Вы можете найти их здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...