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

10

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

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

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

nadder
источник
6
DOS хранит указатель на int 20hинструкцию, чтобы вы могли выйти из программы, выполнив retинструкцию.
Фуз

Ответы:

16

Это для совместимости с 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инструкцию.

CherryDT
источник