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?
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
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ść * /} " –