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
Antwort
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.
Würden Sie bitte viel mehr erklären. Was ist mit -m16 Option? –
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.
Dokumentiert unter: https://sourceware.org/binutils/docs/as/i386_002d16bit.html#i386_002d16bit –
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. –
Sie können den 16-Bit-Assembler natürlich in GCC als Inline-Assembly mit der __asm__-Anweisung codieren. –
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.
Welches Betriebssystem soll unter laufen? GCC unterstützt MS-DOS nicht. –