Assembler для начинающих


         

Файлы .com и .exe - часть 2


    изменен. Обычно перемещением занимается редактор связей. Однако
    пересчет значений некоторых адресов не может быть выполнен до
    загрузки программы. В каждом файле типа .EXE имеется информация о
    таких адресах.
 
      Файл типа .COM не является перемещаемым. У такого файла
    отсутствует информация, необходимая для перемещения. Вместо этого у
    программы, составляющей файл типа .COM, должен быть перемещаем
    сегмент команд. Это означает, что хотя сам сегмент команд можно
    модифицировать, начальное смещение всегда должно быть одним и тем
    же. В такой программе все смещения должны оставаться неизмененными.
    Кроме того, от программиста требуется предусмотреть, чтобы при
    любой операции с сегментными регистрами (например, запись в
    сегментный регистр полученного значения) всегда производилось
    обращение к регистру текущего сегмента команд. Примером правильной
    программной последовательностью для записи в регистр DS текущего
    значения сегмента команд будет:
 
      PUSH  CS
      POP DS
 
      Иногда может показаться заманчивым реализовать ту же операцию с
    помощью следующей последовательности команд (предположим, что как и
    в приведенной на Фиг. 5.6 программе имя сегмента команд - "CODE")
 
      MOV     AX,CODE
      MOV     DS,AX
 
      Для программного файла типа .COM эта запись будет неправильной.
    В момент ассемблирования и редактирования связей сегментное
    значение для сегмента CODE неизвестно. Оно определяется только при
    загрузке программы. Поскольку файл типа .COM не может предоставить
    загрузчику перечня всех сегментных ссылок (информация для
    перемещения), то в данном случае программа будет выполняться
    неправильно.
 
      Между описываемыми типами файлов имеются различия в отношении
    установки значений сегметных регистров и расположения стека. Для
    файла типа .COM значения регистров CS, DS, ES и SS устанавливаются
    DOS, равными такими, что они указывают на тот сегмент, в который



Содержание  Назад  Вперед