Nachdem ich die Intel 8080-Struktur gelernt habe, versuche ich jetzt, Intel 8086 zu lernen und wie die Programme hier ausgelegt sind. Im Moment ist es ziemlich einschüchternd, wenn man sich die grundlegenden Beispiele anschaut, und was noch schlimmer ist, ich kann den Unterschied zwischen zwei Arten, Code für 8086 zu schreiben, über den ich gestolpert bin, nicht verstehen. Nämlich, manchmal sehe ich:
%Vor%Während ich auch gefunden habe:
%Vor% Offensichtlich weiß ich, dass diese beiden sehr unterschiedliche Dinge tun, aber was mich verwirrt ist, wie unterschiedlich die allgemeine Syntax ist. In letzterem haben wir ein "Segment annehmen", während in dem ersteren nur .model, .stack und .code (und manchmal .data, von dem, was ich gefunden habe). Gibt es einen Unterschied? Kann ich einfach wählen, welches mir besser steht? Ersteres sieht viel einfacher zu verstehen und klarer aus, aber kann ich es einfach anstelle des letzteren verwenden?Dies hängt massiv von dem Betriebssystem ab, auf das Sie abzielen (oder BIOS oder Bare Metal), dem ausführbaren Format, auf das Sie abzielen, und dem Assembler, den Sie verwenden.
Das erste von Ihnen veröffentlichte Beispiel ist für MS-DOS-.COM-Programme, das zweite Beispiel für MS-DOS-.EXE-Programme, und ich nehme an, beide verwenden den Microsoft®-Assembler.
Wenn Sie den GNU-Assembler (z. B. auf MirBSD oder GNU / Linux) verwenden möchten, um auf i8086 MS-DOS-.COM-Programme zu zielen, können Sie Folgendes verwenden:
%Vor% Kompilieren Sie diese Datei ( hw.S
) mit:
Ich habe das Ergebnis in DOSBOX unter MirBSD / i386 getestet und es in hexdump überprüft, um zu sehen, dass es korrekt ist.
Im Gegensatz zu den anderen Lösungen definieren Sie den Ursprung (org) nicht in der Assemblydatei, sondern in der Linker (ld) -Befehlszeile, hier.
Ich habe auch ein Beispiel Targeting rohes x86 BIOS und ein anderes eine (Bootsektor für Blocklisten) und einen anderen (Bootsektor für * .tar-Archive) , falls Sie interessiert sind; Sie benötigen jedoch unterschiedliche Ursprünge, und sie benötigen eine i386-CPU, obwohl sie nur den 16-Bit-Modus verwenden.
Sie können * .EXE-Dateien nicht auf diese Weise erstellen.
ELKS ist auch ein interessantes i8086-Ziel, aber ich habe noch nicht viel damit gemacht. Stelle sicher, dass du ein GNU als Version bekommst, das neu genug ist, um den .intel_syntax noprefix
-Modus zu kennen.