Aktywne Wpisy
![mistejk](https://wykop.pl/cdn/c3397992/mistejk_tHqfIbIkwf,q60.jpg)
mistejk +290
![mistejk - Państwo polskie at it’s finest
https://wiadomosci.onet.pl/tylko-w-onecie/p...](https://wykop.pl/cdn/c3201142/270e6ef9ee98dc1c9fe3404c2501da8751e82cc5a1dff959181131d155433a1a,w150.jpg?author=mistejk&auth=82861ac379baf2c87fc84d87842a8818)
źródło: Zdjęcie z biblioteki
Pobierz![pomelobezkaca2](https://wykop.pl/cdn/c0834752/f013ac0e0eb025dbf6ebef9d6a718a7840a0133498d3c5a5af239a1d8c1016dc,q60.jpg)
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
PobierzWykop.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, 23
call square(int)
a po stronie samej funkcji:
mov DWORD PTR [rbp-4], edi
wię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.