Auf der Wikpedia-Seite zu .COM-Dateien https://en.wikipedia.org/wiki/COM_file heißt es:
.COM-Dateien unter DOS setzen alle x86-Segmentregister auf den gleichen Wert und das SP-Register (Stack Pointer) auf 0xFFFE. Der Stack beginnt also ganz oben im Speichersegment und arbeitet von dort aus.
Dies setzt den Stapel jedoch so, dass er ein Wort unter dem oberen Rand des Segments beginnt. Wenn ein Wert auf den Stapel verschoben wird, dekrementiert die CPU SP auf 0xFFFC und speichert den Wert dort, wodurch das oberste Wort des Segments verschwendet wird. Was ist der Grund dafür, dass DOS SP nicht stattdessen auf 0 setzt?
int 20h
Anweisung, sodass Sie Ihr Programm durch Ausgabe einerret
Anweisung beenden können.Antworten:
Dies dient der Kompatibilität mit CP / M.
In CP / M können Sie einfach mit von Ihrem Programm zurückkehren
ret
und Ihr Programm wird sauber beendet. Dies wurde erreicht, indem0x0000
oben am Stapel ein undint 20h
an der Adresse ein Befehl vorhanden war0x0000
. Obwohl diesint 20h
die offizielle Methode von DOS ist, ein Programm zu beenden, wurde die Option zum Beenden des Programms mitcall 0
CP / M beibehalten, und der äußerste Bereichret
funktioniert genauso, da er zu zurückkehrt0
.Um dieses
0x0000
Wort oben im Stapel zu haben, müssen Sie den verwendbaren Stapel natürlich 2 Bytes weiter unten starten. DeshalbSP
ist zunächst an0xFFFE
und zeigt auf das0x0000
Wort, das wiederum auf dieint 20h
Anweisung verweist .quelle