Ich schreibe Real-Mode-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?
GCC 5.2.0 (und mögliche frühere Versionen) unterstützen 16-Bit-Codegenerierung mit dem -m16
-Flag. Der Code wird jedoch mit hoher Wahrscheinlichkeit auf 32-Bit-Prozessor-Features (z. B. 32-Bit-breite Register) angewiesen. Daher sollten Sie die generierte Assembly sorgfältig überprüfen.
Von den man
Seiten:
Die Option -m16 ist die gleiche wie -m32, abgesehen davon, dass sie die Option ".code16gcc" Assembly-Direktive am Anfang der Assembly-Ausgabe damit die Binärdatei im 16-Bit-Modus ausgeführt werden kann.
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 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.
GCC erzeugt keinen 8086-Code. Die GNU AS-Direktive .code16gcc
kann verwendet werden, um die Ausgabe von GCC in einem 16-Bit-Modus zusammenzustellen. Setzen Sie asm(".code16gcc")
am Anfang Ihrer C-Quelle, Ihr Programm ist auf 64 Kbyte begrenzt.
Tags und Links c assembly inline-assembly