2011-08-21 10 views
7

Uczę się montażu x64 w systemie Windows dla "zabawy". MSDN documentation for the x64 calling convention on Windows mówi:W puli ABI Win64, czy zarezerwowane miejsce stosu argumentów może być używane do przechowywania ogólnego przeznaczenia?

Abonent jest odpowiedzialny za przydzielanie przestrzeni parametrów do wywoływany, i zawsze musi przeznaczyć wystarczającą ilość miejsca dla parametrów 4 Rejestr, nawet jeśli wywoływany nie ma, że ​​wiele parametrów. Pomaga to w prostocie obsługi nieoprototypowanych funkcji C oraz funkcji vararg C/C++.

Jak moi funkcje nie są C funkcje unprototyped lub varargs C/C++ funkcje, czy to oznacza, że ​​zawsze mogę użyć [rsp+8] do [rsp+32] (zakładając niezmienioną wartość rsp tuż po wywołaniu) do przechowywania ogólnego przeznaczenia wewnątrz mojej funkcji , jak w przypadku zmiennych lokalnych?

Odpowiedz

6

Tak, można użyć przestrzeni do rysowania parametrów wejściowych w dowolnym celu. Ale już to wiedziałeś: Zezwolenie na to jest już implikowane przez legalność modyfikowania parametrów przychodzących.

void somefunction(int arg1) 
{ 
    arg1 = anyvalue; // mov [rsp+8], anyvalue 
} 
+0

Dzięki za jednoznaczną odpowiedź. Jednak modyfikowanie parametrów wejściowych będzie raczej "mov rcx, anyvalue", ponieważ argument jest przekazywany przez 'rcx', dlatego nie miałem pewności co do' [rsp + 8] '. – Trillian

+3

Ale możesz także rozlewać parametry przychodzące. Dlatego w końcu zarezerwowana przestrzeń istnieje. 'void somefunction (int arg1) {/ * rozlewanie: mov [rsp + 8], rcx */arg1 = dowolna wartość;/* mov [rsp + 8], dowolna wartość * /} " –

1

myślę, co stara się zrobić więcej coś takiego:

*(decltype(&anyvalue))((PBYTE)&arg1+8) = anyvalue; // mov [rsp+8+8], anyvalue 

O ile mi zrozumieć, Microsoft twierdzi, że jesteś zobowiązany przeznaczyć wystarczającą ilość miejsca dla wywoływany do przechowywania czterech rejestry (rcx, rdx, r8. r9), nawet w funkcji, która przyjmuje tylko jeden argument (w rcx).

Uwaga: Przepraszam za brzydkie kodu C i odlewu starej szkoły zmieszanego z nowego słowa kluczowego decltype

Powiązane problemy