Почему DOS устанавливает регистр SP в 0xFFFE после загрузки файла .COM? - PullRequest
10 голосов
/ 23 марта 2020

На странице википедии о файлах .COM https://en.wikipedia.org/wiki/COM_file он гласит:

.COM-файлы в DOS устанавливают все регистры сегментов x86 на одно и то же значение и SP ( указатель стека) записывается в 0xFFFE, таким образом, стек начинается с самой верхней части сегмента памяти и работает оттуда вниз.

Но это фактически устанавливает стек на начало одного слова ниже вершины сегмента. , При перемещении значения в стек ЦП будет уменьшать SP до 0xFFF C и сохранять его там, тратя таким образом верхнее слово сегмента. В чем причина того, что DOS не устанавливает SP в 0?

1 Ответ

16 голосов
/ 23 марта 2020

Это для совместимости с CP / M.

. В CP / M вы можете просто вернуться из своей программы, используя ret, и ваша программа будет корректно завершена. Это было достигнуто за счет наличия 0x0000 на вершине стека и наличия инструкции int 20h по адресу 0x0000. Несмотря на то, что int 20h является официальным способом DOS для выхода из программы, опция выхода из программы с использованием call 0 была сохранена в CP / M, а внешний диапазон ret работает так же, так как возвращается к 0.

Чтобы это слово 0x0000 находилось на вершине стека, вам нужно запустить пригодный стек на 2 байта ниже, очевидно. Вот почему SP изначально находится на 0xFFFE, указывая на то слово 0x0000, которое, в свою очередь, указывает на инструкцию int 20h.

...