2012-04-15 9 views
12

Czy istnieje sposób na wypychanie spakowanej liczby podwójnej z rejestru XMM do stosu? a potem w razie potrzeby wyskakuje z powrotem?
Prześlij rejestr XMM do stosu

Idealnie szukam czegoś podobnego PUSH lub POP dla rejestrów ogólnego przeznaczenia, mam zaznaczone Intel instrukcje ale albo brakowało polecenia lub nie jest ...

Albo będę musiał rozpakować wartości do rejestrów ogólnych, a następnie je wypchnąć?

Odpowiedz

20

Nie, nie ma takiej instrukcji asm pod x86, ale można zrobić coś takiego:

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

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

EDIT:

Górna przykładowy kod jest emulacja Direct Push/pop.

W przypadku, którego używasz na stosie również inne zmienne lokalne, niż rejestru ebp musi być najpierw odpowiednio ustawić, jak:

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

W takim przypadku można również wykorzystać rozwiązanie Daniels!

+0

Dzięki za odpowiedź. Na tej podstawie (Twoje rozwiązanie nie działa dokładnie) wymyśliłem działający (zobacz moje pytanie). Nadal oznaczane jako odpowiedź ... –

+0

@Daniel Gruszczyk: Tak, możesz również używać ebp, ale upewnij się, że rejestr ebp jest poprawnie ustawiony. Pamiętaj, że inne dyrektywy push lub call mogą nadpisywać dane na stosie, jeśli ebp nie jest ustawiony prawidłowo. –

+2

Może warto edytować odpowiedź z tym, co w końcu udało się zrealizować, aby pomóc przyszłym użytkownikom, którzy zobaczą to pytanie. –