2013-09-27 5 views

Odpowiedz

4

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.

+0

Czy mógłbyś wyjaśnić znacznie więcej. A co z opcją -m16? –

2

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.

+0

Udokumentowane na: https://sourceware.org/binutils/docs/as/i386_002d16bit.html#i386_002d16bit –

+2

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. –

+0

Możesz oczywiście ręcznie kodować 16-bitowy asembler w GCC jako inline assembly używając dyrektywy __asm__. –

6

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.

Powiązane problemy