Вставить регистр XMM в стек

Есть ли способ поместить упакованное целое число двойного слова из регистра XMM в стек? а потом попсовывать обратно когда нужно?

В идеале я ищу что-то вроде PUSH или POP для регистров общего назначения, я проверил руководства Intel, но я пропустил команду или ее нет...

Или мне придется распаковать значения в общие регистры, а затем отправить их?

2 ответа

Решение

Нет, в x86 такой инструкции asm нет, но вы можете сделать что-то вроде:

//Push xmm0
sub     esp, 16
movdqu  dqword [esp], xmm0

//Pop xmm0
movdqu  xmm0, dqword [esp]
add     esp, 16

РЕДАКТИРОВАТЬ:

Пример верхнего кода - прямая эмуляция push/pop.

В случае, если вы используете в стеке и другие локальные переменные, кроме ebp регистр должен быть сначала правильно установлен, например:

push ebp
mov  ebp, esp
sub  esp, LocaStackVariablesSize
//... your code
mov  esp, ebp
pop  ebp  
ret

В этом случае вы также можете использовать решение Daniels!

Я бы порекомендовал использовать для этой цели отдельный 16-битный выровненный стек, так что вы можете использовать movdqa вместо movdqu. Существует небольшая разница во времени выполнения между этими двумя инструкциями!

Другие вопросы по тегам