Вставить регистр 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. Существует небольшая разница во времени выполнения между этими двумя инструкциями!