2014-12-10 3 views
1

в MS-DOS. Почему инициализация регистров DS и ES должна выполняться программистом вручную, хотя ответственность за инициализацию этих регистров несет операционная система.Почему мы должны инициализировать регистры DS и ES в MS-DOS?

Почему мы не должны делать это для регистров CS и SS? Какая особенность MS-dos ведет к этому?

+1

В чем заключен контекст? Разумеется, MS-DOS инициализирует эти регистры, для чего нужна ОС *. Если вы пишете приложение и должны использовать эти регистры, они должны быть настроены на то, что вам нужно * приложение * (которое обычно отличается), и вы должны сохранить предыдущие значения регистра до того, как вернетесь в ОС. 'Cs' является сегментом кода и обязательно должен быть тем, что требуется вашему приложению для его выполнения. И стек управляется ОС всей системы, поэтому 'ss' должен быть правильно настроен для вашего приложения. 'ds' и' es' не имеют таких центральных ролей. – lurker

ответ

0

EXE-файлы могут не иметь отдельного или специального сегмента для стандартных инициализаций DS и иметь несколько статических сегментов данных. IOW все глобальные переменные FAR.

Первая загрузка DS затем относится к сегменту первой переменной, которая должна быть загружена.

1

Это просто выбор дизайнера ОС.

DOS - это минимальная ОС, поэтому минимально возможно. Регистры CS и SS необходимо установить. Без CS, установленного для вас, ваш код не мог работать. SS должен быть установлен, потому что DOS использует один стек для всего. Прерывания используют стек более 30 раз в секунду, даже когда ваша программа запущена. (Вот почему вы должны отключать прерывания при изменении SS.) Другие сегменты нужны только в том случае, если ваша программа использует их (и, безусловно, можно писать код, который этого не делает), поэтому DOS не касается.

На самом деле в версиях DOS я помню (и прошло много лет, так что это может быть неправильно), DS и ES были установлены равными CS, что вы хотите для очень маленьких программ с не более 64k кода + данных + стека.

+3

Действительно DS и ES изначально настроены на сегмент PSP, который совпадает с CS и SS для файлов .COM, но отличается для файлов .EXE. Некоторые линкеры настаивают на том, что по крайней мере DS инициализируется сегментом PSP. –