Warum setzt DOS das SP-Register nach dem Laden einer .COM-Datei auf 0xFFFE?


10

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?


6
DOS speichert dort einen Zeiger auf eine int 20hAnweisung, sodass Sie Ihr Programm durch Ausgabe einer retAnweisung beenden können.
Fuz

Antworten:


16

Dies dient der Kompatibilität mit CP / M.

In CP / M können Sie einfach mit von Ihrem Programm zurückkehren retund Ihr Programm wird sauber beendet. Dies wurde erreicht, indem 0x0000oben am Stapel ein und int 20han der Adresse ein Befehl vorhanden war 0x0000. Obwohl dies int 20hdie offizielle Methode von DOS ist, ein Programm zu beenden, wurde die Option zum Beenden des Programms mit call 0CP / M beibehalten, und der äußerste Bereich retfunktioniert genauso, da er zu zurückkehrt 0.

Um dieses 0x0000Wort oben im Stapel zu haben, müssen Sie den verwendbaren Stapel natürlich 2 Bytes weiter unten starten. Deshalb SPist zunächst an 0xFFFEund zeigt auf das 0x0000Wort, das wiederum auf die int 20hAnweisung verweist .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.