Pourquoi DOS définit-il le registre SP sur 0xFFFE après avoir chargé un fichier .COM?

10

Sur la page wikpedia sur les fichiers .COM https://en.wikipedia.org/wiki/COM_file, il indique:

Les fichiers .COM sous DOS définissent tous les registres de segments x86 à la même valeur et le registre SP (pointeur de pile) à 0xFFFE, ainsi la pile commence tout en haut du segment de mémoire et fonctionne à partir de là.

Mais cela définit en fait la pile pour commencer un mot sous le haut du segment. Lorsque vous poussez une valeur sur la pile, le CPU décrémente SP à 0xFFFC et y stocke la valeur, gaspillant ainsi le mot supérieur du segment. Quelle est la raison pour laquelle DOS ne définit pas SP à 0 à la place?

nadder
la source
6
DOS y stocke un pointeur sur une int 20hinstruction afin que vous puissiez quitter votre programme en émettant une retinstruction.
fuz

Réponses:

16

C'est pour la compatibilité avec CP / M.

Dans CP / M, vous pouvez simplement revenir de votre programme en utilisant retet votre programme se terminera proprement. Ceci a été réalisé en ayant un 0x0000en haut de la pile et en ayant une int 20hinstruction à l'adresse 0x0000. Même si int 20hc'est la façon officielle de DOS de quitter un programme, l'option de quitter le programme en utilisant a call 0été conservée de CP / M, et la portée la plus externe retfonctionne de la même manière depuis son retour 0.

Afin d'avoir ce 0x0000mot en haut de la pile, vous devez évidemment commencer la pile utilisable 2 octets plus bas. C'est pourquoi SPest initialement à 0xFFFE, pointant vers ce 0x0000mot qui à son tour pointe vers l' int 20hinstruction.

CherryDT
la source