- cross-posted to:
- hackernews@lemmy.bestiver.se
- cross-posted to:
- hackernews@lemmy.bestiver.se
Zastanawiam się, czemu koleś ustawia w każdej funkcji ramkę stosu, nawet jeśli nie wykonuje na nim żadnych operacji.
Bo funkcja nie wróci prawidłowo do nadrzędnej?
Mam na myśli rejestr x29.
Moje śledztwo doprowadziło to tego, że to przygotowuje funkcję na odebranie variadic args. Tak wyglądało mi to od początku, kiedy czytałem AAPCS64. Robi to dlatego, że wszystkie te funkcje mają działać jak metody objc. A wywołuje się je za pomocą funkcji objc_msgSend - https://developer.apple.com/documentation/objectivec/objc_msgsend
Jej pierwszy argument to wskaźnik self, potem jakaś sygnatura metody, a potem argumenty metody jako variadic. Więc pewnie tak jest to przekazywane przez stos.
そうですか
Ale nawet w tym hello world widać przekazywanie przez rejestry w wywołaniach objc_msgSend.
Według AAPCS64:
[Platform] may elect not to maintain a frame chain and to use the frame pointer register as a general-purpose callee-saved register
Odnośnie funkcji “variadic”:
The address of the first stacked argument is defined to be the initial value of SP.
Nie widzę nigdzie informacji, żeby FR był wymagany w tym przypadku. W X86 na pewno nie trzeba ustawiać EBP dla takich wywołań.
Sprawdziłem też pod Godboltem z opcją “-fomit-frame-pointer” i prolog/epilog funkcji jest bardzo krótki.Zauważyłem, że kompilator tak robi tylko w -O0. Starałem się na siłę to zrozumieć i rzuciłem jakimiś tezami. Ale może tak napisał, bo gdzieś tak zobaczył/przeczytał. Może tak pisał, żeby nie zapomnieć. Miałem, jeszcze pomysł, że coś to sprawdza. Nikt go nie zapytał. Zostaje jeszcze sprawdzić deasm jakiegoś prawdziwego kodu na tę platformę.

