На странице википедии о файлах .COM https://en.wikipedia.org/wiki/COM_file она гласит:
Файлы .COM в DOS устанавливают все регистры сегмента x86 на одно и то же значение, а регистр SP (указатель стека) - на 0xFFFE, поэтому стек начинается с самой верхней части сегмента памяти и оттуда работает вниз.
Но это фактически устанавливает стек на одно слово ниже вершины сегмента. При перемещении значения в стек ЦПУ будет уменьшать SP до 0xFFFC и сохранять там значение, тратя таким образом верхнее слово сегмента. В чем причина того, что DOS не устанавливает SP в 0?
int 20h
инструкцию, чтобы вы могли выйти из программы, выполнивret
инструкцию.Ответы:
Это для совместимости с 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
инструкцию.источник