2012-03-20 17 views
7

EAX służy do przechowywania zwracanej wartości funkcji na platformie 32-bitowej, zastanawiam się tylko, czy rozmiar zwracanej wartości funkcji jest większy niż 4 bajty, jak eax ją obsługuje? W takim przypadku system operacyjny może zapisać zwracaną wartość na stosie i zapisać adres stosu w EAX, ale w jaki sposób system operacyjny może określić, czy wartość przechowywana w EAX jest adresem do wartości zwracanej, czy też rzeczywiście jest wartością zwracaną?W jaki sposób eax może zwracać wartość, której rozmiar jest większy niż 4 bajty?

+0

Zobacz odpowiedzi na to pytanie: http://stackoverflow.com/questions/2155730/how-do-c-compilers-implement-functions-that-return-large-structures –

Odpowiedz

12

Dzwoniący i uczestnik muszą uzgodnić, co zawierają rejestry i stos. Nazywa się to calling convention, która jest częścią większego pojęcia o nazwie application binary interface (ABI). Pośrednik definiuje, w jaki sposób ma być wywoływany (, tj., czy argumenty muszą znajdować się na stosie, w rejestrach itd.), A kompilator zapewnia, że ​​generowany kod jest zgodny z konwencją wywołującą.

Co do konkretnego pytania, to zależy od ABI. Czasami, jeśli wartość zwracana jest większa niż 4 bajty, ale nie większa niż 8 bajtów, można ją podzielić na EAX i EDX. Ale przez większość czasu funkcja wywołująca po prostu przydziela trochę pamięci (zwykle na stosie) i przekazuje wskaźnik do tego obszaru do wywoływanej funkcji.

Należy również pamiętać, że rola systemu operacyjnego nie jest tak ważna, jak się wydaje. Pliki binarne z różnymi konwencjami wywoływania mogą współistnieć w tym samym systemie, a pliki binarne mogą używać wewnętrznych konwencji wywoływania. ABI systemu operacyjnego jest ważne tylko wtedy, gdy plik binarny wywołuje jego biblioteki systemowe.

Powiązane problemy