Почему мы должны инициализировать регистры DS и ES в MS-DOS?
В MS-DOS, почему инициализация регистров DS и ES должна выполняться программистом вручную, хотя ответственность за инициализацию этих регистров лежит на операционной системе.
почему мы не должны делать это для регистров CS и SS? Какая особенность MS-DOS приводит к этому?
2 ответа
Это просто выбор дизайнера ОС.
DOS - минимальная ОС, поэтому она делает минимум возможного. Регистры CS и SS должны быть установлены. Без CS, ваш код не может работать. SS должен быть установлен, потому что DOS использует один стек для всего. Прерывания используют стек более 30 раз в секунду даже во время работы вашей программы. (Вот почему вы должны отключать прерывания при изменении SS.) Другие сегменты нужны только в том случае, если ваша программа использует их (и, конечно, можно писать код, который этого не делает), поэтому DOS не беспокоит.
На самом деле, в DOS-версиях, которые я помню (и это было много лет назад, так что это могло быть неправильно), DS и ES были установлены равными CS, что вам нужно для очень маленьких программ с не более 64 тыс. Требований кода + данных + стека.
EXE-файлы могут вообще не иметь ни одного или другого специального сегмента по умолчанию для init DS и иметь несколько сегментов статических данных. IOW все глобалы FAR.
Затем первая загрузка DS находится в сегменте первой переменной, которая должна быть загружена.