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?
Odpowiedz
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.
- 1. W jaki sposób nieinwestycyjnie zwracać `Może` obiektyw?
- 2. Dlaczego wartość logiczna 4 bajty w .NET?
- 3. x86 Czy push/pop może mieć mniej niż 4 bajty?
- 4. Co oznacza ten błąd: `somefile.c: 200: error: rozmiar ramki 1032 bajtów jest większy niż 1024 bajty`?
- 5. ObjectMapper.readValue może zwracać wartość pustą?
- 6. Jaki jest właściwy sposób używania porównania "większy niż", "mniej niż" na liczbach całkowitych zerulujących w Kotlin?
- 7. MongoDB: rozmiar wyniku zapytania większy niż rozmiar kolekcji
- 8. W jaki sposób pg_column_size może być mniejsza niż długość oktet_length?
- 9. Rozmiar 64-bitowego dll 50% większy niż 32-bitowy
- 10. Minimalna Subarray który jest większy niż Key
- 11. Rozmiar aktualizacji aplikacji na iOS jest znacznie większy niż rozmiar aplikacji.
- 12. Jaki jest maksymalny rozmiar, który może pomieścić zmienna sesji?
- 13. Dlaczego 1 nie jest większy niż -0x80000000
- 14. W jaki sposób jar może rozprzestrzenić lukę w aplikacji internetowej, w której jest używana?
- 15. `testl` eax przeciwko eax?
- 16. JavaScript nie większy niż 0
- 17. Bitmapa skompresowana z jakością = 100 większy rozmiar pliku niż oryginał
- 18. MySQL Query, wybierz większy niż
- 19. Dlaczego kompilacja z Crashlytics ma rozmiar większy niż plik .ipa?
- 20. W jaki sposób przeliczana jest wartość NSObject?
- 21. W jaki sposób Intent może mieć wartość null w onHandleIntent()?
- 22. Domyślny rozmiar czcionki JavaFX pod Linuksem jest większy niż w systemie Windows
- 23. czas użytkownika większy niż w czasie rzeczywistym
- 24. Kiedy WeakReference # get() zaczyna zwracać wartość null?
- 25. Odata: Filtr "Większy niż data"
- 26. Lucene.Net większy niż/mniej niż TermRangeQuery?
- 27. Jak rozwiązać "iterator powinien zwracać ciągi, a nie bajty"
- 28. Tkanina JS: Obszar wyboru obiektu tekstowego jest większy niż rzeczywisty rozmiar tekstu.
- 29. FMDatabaseQueue Jak zwracać wartość
- 30. Jaki jest rozmiar wskaźnika?
Zobacz odpowiedzi na to pytanie: http://stackoverflow.com/questions/2155730/how-do-c-compilers-implement-functions-that-return-large-structures –