redsabien
@redsabien

Вопрос о сегментных регистрах и процессе загрузки регистра DS?

В учебниках по ассемблеру можно видеть следущий код для exe программы

.Data
name db 'name'
.Code
mov ax,@Data
mov ds,ax
ret
etc......

Не могу понять откуда берется значение этого регистра (DS) откуда программа может знать где окажутся ее данные чтобы самой указать это значение?
  • Вопрос задан
  • 203 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
откуда программа может знать где окажутся ее данные чтобы самой указать это значение?

Она не может знать до загрузки, поэтому все сегментные части адресов записаны как смещения относительно начала программы, т.е. как будто программа будет загружена по адресу 0. EXE-файл содержит таблицу релокаций, это массив смещений относительно начала программы, по которым находятся сегментные части адресов. Загрузчик EXE-файла проходит по этому массиву и прибавляет к словам в памяти фактический сегментный адрес, по которому программа загружена.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
gbg
@gbg Куратор тега Программирование
Любые ответы на любые вопросы
Регистры перед запуском программы устанавливает DOS.
Ответ написан
Как говорится еще по принципам Фон Неймана программа и данные не неотличимы друг от друга. Соответственно запуск вашей программы сводится к тому, что запускающая программа устанавливает указатель сегмента кода на начало вашего кода. А дальше уже ваша программа должна вертеться как умеет.
Программу пишите вы, затем ее компилирует компилятор (да звучит не очень). В компиляторе введено такое упрощение, что вы можете указать адрес сегмента данных конструкцией "@Data". В скомпилированной программе это будет константа, т.е. в ходе компиляции компилятор сам определит и подставит эту константу.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы