Следующих два утверждения для инициализации сегмента данных регистраИнициализация сегмента данных Регистра в сборе 8086 с использованием MASM компилятора
mov AX, @Data
mov DS, AX
но фактический адрес сегмента данных известен только тогда, когда загрузчик загружает программу в памяти.
- Что делает ассемблер вместо @data?
- Когда загрузчик получает фактический базовый адрес сегмента данных, он заменяет инструкцию mov AX, @data с mov AX, Actual Base Address?
- Зачем нужно писать это заявление, когда фактический базовый адрес неизвестен до этапа загрузки?
Ассемблер, скорее всего, заметит, что 'mov AX, @ Data' требует исправления. Я считаю, что компоновщик заполнит @Data in сегментом относительно начала исполняемого файла и пометит его для исправления загрузчиком DOS (в заголовке исполняемого файла есть таблица исправления). При запуске программы загрузчик программ DOS будет считывать заголовок DOS из исполняемого файла и добавлять сегмент, где DOS физически загружает программу с сегментом, помещенным в инструкцию компоновщиком. Это даст значение времени выполнения для '@ Data'. –
Причина этого в том, что программы DOS могут быть загружены в память в разных местах. Поэтому эти исправления должны быть предоставлены. Без выполнения команды «mov AX, @ Data» 'mov DS, AX' в _ код, _DS_ (сегмент данных) не будет известен во время выполнения самой программой. Без настройки _DS_ вы, вероятно, не будете читать и записывать переменные в памяти, где они ожидают, что их будут читать и писать, и ваша программа просто не будет работать должным образом. –