2016-09-30 11 views
2

Следующих два утверждения для инициализации сегмента данных регистраИнициализация сегмента данных Регистра в сборе 8086 с использованием MASM компилятора

mov AX, @Data 
    mov DS, AX 

но фактический адрес сегмента данных известен только тогда, когда загрузчик загружает программу в памяти.
- Что делает ассемблер вместо @data?
- Когда загрузчик получает фактический базовый адрес сегмента данных, он заменяет инструкцию mov AX, @data с mov AX, Actual Base Address?
- Зачем нужно писать это заявление, когда фактический базовый адрес неизвестен до этапа загрузки?

+0

Ассемблер, скорее всего, заметит, что 'mov AX, @ Data' требует исправления. Я считаю, что компоновщик заполнит @Data in сегментом относительно начала исполняемого файла и пометит его для исправления загрузчиком DOS (в заголовке исполняемого файла есть таблица исправления). При запуске программы загрузчик программ DOS будет считывать заголовок DOS из исполняемого файла и добавлять сегмент, где DOS физически загружает программу с сегментом, помещенным в инструкцию компоновщиком. Это даст значение времени выполнения для '@ Data'. –

+0

Причина этого в том, что программы DOS могут быть загружены в память в разных местах. Поэтому эти исправления должны быть предоставлены. Без выполнения команды «mov AX, @ Data» 'mov DS, AX' в _ код, _DS_ (сегмент данных) не будет известен во время выполнения самой программой. Без настройки _DS_ вы, вероятно, не будете читать и записывать переменные в памяти, где они ожидают, что их будут читать и писать, и ваша программа просто не будет работать должным образом. –

ответ

1

Каждый раз, когда вы пишете инструкцию, как и mov AX, @Data компилятор/Ассемблер вставляет 3 байта в вашей программе:

  • 1-й байт опкод, в случае AX это будет 0B8h
  • 2-й и 3-й байт вместе представляет собой число.
  • Что ассемблер ставит вместо @data?

Это число представляет собой расстояние между началом исполняемого файла (при загрузке в памяти) и началом секции данных. Это число выражается в параграфах aka chunks из 16 байт.

  • Когда загрузчик получает фактическую базу сегмента данных адреса это заменить инструкцию мов AX, @data с мов AX, Actual Base Address?

Загрузитель обновляет только 2-й и 3-й байты. Он никогда не касается 1-го байта!

  • Почему необходимо написать это заявление, когда фактический базовый адрес не известен до стадии загрузки?

Везде Вы пишете эти инструкции (там может быть много из них), вы предоставляете DOS с заполнителями, где загрузчик DOS может вставить правильные адреса.