Piszę funkcję trybu rzeczywistego, która powinna być normalną funkcją z ramkami stosu i tak, ale powinna używać% sp zamiast% esp. Czy jest jakiś sposób na zrobienie tego?Jak powiedzieć GCC, aby wygenerował 16-bitowy kod dla trybu rzeczywistego
Odpowiedz
O ile mi wiadomo, GCC nie obsługuje generowania kodu dla 16-bitowego x86. W przypadku starszych programów rozruchowych i podobnych celów, należy napisać mały kod pośredniczący w języku asemblerowym, aby umieścić procesor w trybie 32-bitowym i przekazać wykonanie do kodu 32-bitowego. Do innych celów naprawdę nie powinieneś pisać kodu 16-bitowego.
Czy mógłbyś wyjaśnić znacznie więcej. A co z opcją -m16? –
GCC nie generuje kodu 8086. Dyrektywę GNU AS .code16gcc
można użyć do złożenia wyjścia GCC do pracy w trybie 16-bitowym, umieszczając asm(".code16gcc")
na początku źródła C, twój program będzie ograniczony do 64 KB.
Udokumentowane na: https://sourceware.org/binutils/docs/as/i386_002d16bit.html#i386_002d16bit –
Użycie kodu .code16gcc (nadal nie jestem pewien, czy można go nazwać stabilną funkcją) spowoduje utworzenie kodu działającego w 16-bitach tryb rzeczywisty, jednak używa prefiksu instrukcji, który jest dostępny tylko w wersji 386+. Oznacza to, że jeśli celujesz w 8086/8088 (prawdziwy sprzęt lub emulator), kod prawdopodobnie nie będzie działał poprawnie. Jeśli zamierzasz uruchomić wpis w trybie chronionym 32-bitowym, to napisz mały 16-bitowy kodeks asemblera, który wszystko ustawi, wejdzie w tryb chroniony, a następnie wywoła 32-bitową funkcję "C", która jest początkiem twojego programu. –
Możesz oczywiście ręcznie kodować 16-bitowy asembler w GCC jako inline assembly używając dyrektywy __asm__. –
GCC 5.2.0 (i możliwe wcześniejsze wersje) obsługują 16-bitowe generowanie kodu z flagą -m16
. Jednak kod prawie na pewno będzie opierał się na 32-bitowych funkcjach procesora (takich jak rejestry o szerokości 32 bitów), dlatego należy uważnie sprawdzić wygenerowany zespół.
Z man
stron:
Opcja -m16 jest taka sama jak -m32, z wyjątkiem, że wysyła „.code16gcc” dyrektywą zmontują na początku montażowej tak że binarny może działać w trybie 16-bitowym.
- 1. GCC: jak powiedzieć GCC, aby umieścić funkcję "główną" na początku sekcji .text?
- 2. GCC wygenerował zespół równoważny instrukcji continue w C
- 3. Krótki kod Pythona, aby powiedzieć "Wybierz niższą wartość"?
- 4. Przejście z trybu rzeczywistego do chronionego w jądrze Linuksa
- 5. Jak powiedzieć RadioButtonList, aby NIE generować tabeli
- 6. Jak powiedzieć valgrind, aby zapamiętywać rozwidlone procesy?
- 7. Jak powiedzieć bash, aby nie rozszerzać zmiennej $ _?
- 8. XCode automatycznie wygenerował komentarze?
- 9. Dlaczego przerwań należy wyłączyć przed przełączeniem do trybu chronionego z trybu rzeczywistego?
- 10. Jak mogę powiedzieć szablonom Django, aby nie parsować bloku zawierającego kod, który wygląda jak znaczniki szablonów?
- 11. Jak mogę powiedzieć visualvm, gdzie znaleźć mój kod źródłowy?
- 12. Jak uruchomić preprocesor GCC, aby uzyskać kod po rozszerzeniu makr takich jak #define?
- 13. Jak oddzielić dobry kod od starego/dziwnego kodu trybu
- 14. Czy kod wyjściowy gcc C po przerobieniu?
- 15. Jak powiedzieć lcov, aby zignorować linie w plikach źródłowych
- 16. Jak mogę powiedzieć, że mój kod działa w trybie Mono?
- 17. Wymuś GCC aby zrezygnować z niektórych globali
- 18. Jak utworzyć autonomiczne rozszerzenie trybu dla ACE?
- 19. Jak powiedzieć botowi google, aby pominąć część kodu HTML?
- 20. Jak powiedzieć Gradle, aby użyć --console = plain cały czas?
- 21. gcc nie ostrzega o martwy kod
- 22. Dlaczego gcc tworzy redundantny kod zespołu?
- 23. Jak mogę powiedzieć kompilatorowi, aby nie tworzył obiektu tymczasowego?
- 24. Jak mogę powiedzieć Scrapy, aby indeksował tylko linki wewnątrz Xpath?
- 25. Jak powiedzieć CMake, aby używać Clang w systemie Windows?
- 26. jak powiedzieć gradle, aby pobrać wszystkie słoiki źródłowe
- 27. Jak mogę powiedzieć Django, aby zapisać moją testową bazę danych?
- 28. Skąd magazyn Eclipse wygenerował pliki serwletów dla Tomcat?
- 29. Jak mogę mieć WPF używać jednego stylu okna dla trybu debugowania i innego dla trybu zwolnienia?
- 30. Jak powiedzieć sbt-proguard, aby dołączyć java * .jars?
Który system operacyjny ma działać? GCC nie obsługuje MS-DOS. –