2013-09-27 12 views
8

Ich schreibe Real-Modus-Funktion, die normale Funktion mit Stackframes und so sein sollte, aber es sollte% sp anstelle von% esp verwenden. Gibt es einen Weg, es zu tun?Wie GCC zu 16-Bit-Code für Real-Modus

+0

Welches Betriebssystem soll unter laufen? GCC unterstützt MS-DOS nicht. –

Antwort

4

Soweit ich weiß, unterstützt GCC keine Code-Generierung für 16-Bit x86. Für Legacy-Bootloader und ähnliche Zwecke sollten Sie einen kleinen Stub in die Assemblersprache schreiben, um die CPU in den 32-Bit-Modus zu versetzen und die Ausführung an 32-Bit-Code zu übergeben. Für andere Zwecke sollten Sie wirklich keinen 16-Bit-Code schreiben.

+0

Würden Sie bitte viel mehr erklären. Was ist mit -m16 Option? –

2

GCC produziert keinen 8086-Code. Die GNU AS-Direktive .code16gcc kann verwendet werden, um die Ausgabe von GCC für den Betrieb in einem 16-Bit-Modus zu konfigurieren, setzen Sie asm(".code16gcc") am Anfang Ihrer C-Quelle, Ihr Programm ist auf 64 Kbyte begrenzt.

+0

Dokumentiert unter: https://sourceware.org/binutils/docs/as/i386_002d16bit.html#i386_002d16bit –

+2

Mit .code16gcc (ich bin immer noch nicht sicher, man kann es eine stabile Funktion nennen) erzeugt Code, der in 16 Bit läuft Real-Modus, jedoch verwendet es ein Befehlspräfix, das nur für 386+ verfügbar ist. Das heißt, wenn Sie auf 8086/8088 (echte Hardware oder Emulator) abzielen, wird der Code wahrscheinlich nicht richtig funktionieren. Wenn Sie den Eintrag in den geschützten 32-Bit-Modus laden möchten, schreiben Sie einen kleinen 16-Bit-Assembler-Stub, der alles eingerichtet, in den geschützten Modus wechselt und dann eine 32-Bit-C-Funktion aufruft, die den Start Ihres Programms darstellt. –

+0

Sie können den 16-Bit-Assembler natürlich in GCC als Inline-Assembly mit der __asm__-Anweisung codieren. –

6

GCC 5.2.0 (und mögliche frühere Versionen) unterstützen die 16-Bit-Codegenerierung mit dem Flag -m16. Der Code wird jedoch mit hoher Wahrscheinlichkeit auf 32-Bit-Prozessorfunktionen (z. B. 32-Bit-breite Register) zurückgreifen, daher sollten Sie die generierte Assembly sorgfältig prüfen.

Von den man Seiten:

Die -m16 Option ist die gleiche wie -m32, mit Ausnahme, dass es gibt den „.code16gcc“ assembly Direktive zu Beginn der Montags Ausgabe , so dass die Binär kann im 16-Bit-Modus ausgeführt werden.