Aktywne Wpisy

mistejk +290
źródło: Zdjęcie z biblioteki
Pobierz
Jak ktoś chce sie podzielic, to w tej nitce piszemy swoj wzrost. Ja wmieszam sie w komentarzach
#przegryw
#przegryw
Skopiuj link
Skopiuj link
źródło: Zdjęcie z biblioteki
Pobierz
Wykop.pl
Czytam sobie specyfikację SystemV ABI dla AMD64 i w części 3.2.3 jest napisane:
2. If the class is INTEGER, the next available register of the sequence %rdi,%rsi, %rdx, %rcx, %r8 and %r9 is used.Hmm, napisałem więc prostą funkcję i sprawdzam w asm jej wywołanie:
mov edi, 23call square(int)
a po stronie samej funkcji:
mov DWORD PTR [rbp-4], ediwięc parametr ewidentnie leci przez rdi tak jak mówi specyfikacja.
Dlaczego zatem powszechnie się mówi że parametry są przekazywane przez stos, zamiast mówić że są przekazywane przez stos albo rejestry?
#programowanie #informatyka #cpp
Jeżeli uważasz że nie ma funkcji która w normalnych zastosowaniach przyjmuje więcej argumentów niż cpu ma rejestrów to popatrz chociażby na printf.
EDIT: Ale domyślnie z tego co widzę to 4 pierwsze argumenty też idą przez rejestry:
By default, the x64 calling convention passes the first four arguments to a function in registers.Tutaj LINK.
https://en.wikipedia.org/wiki/X86_calling_conventions#cdecl
Ps a o xorowaniu pamięci pamiętałeś? :)
W System V ABI x86-64 konwencja sie zmienila i teraz masz gwarancje, ze niektore rejestry zachowaja swoja wartosc, stad tez 6 argumentow laduje w rejestrach, reszta w stacku.
Jeśli calling convention może zależeć od flag kompilatora, (jak fastcall dla MSCV) to różne object file mogą mieć różną calling convention na tym samym systemie z tą sama archiktekturą.
Jak wtedy wyglądala linkowanie tych pilków jesli odwołują się do funkcji w innych object plikach? Jeśli każdy object file może
int square(int, int)co daje informacje o typie parametrów, ale nie mówi nic o ABI ani o calling convention ergo nie mówi to nic o tym czy przekazać parametry przez stos czy przez rejestry.
Chyba że o innym headerze mówisz a ja nie podumałem.