На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 2 / Переместимый код Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Переместимый код

Макроассемблер MASM и компоновщик LINK обычно вырабатывают перемещаемые программы. Т.е. при нормальном использовании они создают такие программы, которые могут быть перемещены в памяти с помощью MS-DOS, и при этом правильно функционировать. Изменится только содержимое регистров сегментов. Это свойство используется множеством прикладных программ. Одни программы могут загружать другие программы, используя функцию 4Вh (полезную для оверлейных - перекрываемых программ). Несколько программ могут быть загружены в память одновременно (полезно для мультизадачных систем или программ резидентной памяти, таких как, например, программы предварительной подкачки данных для печати).


Как уже указывалось, MS-DOS выполняет эту возможность путем изменения только значений регистров и таких мест в программе, которые ссылаются на имя сегмента или имя процедуры far (далекий). Можно также расширить эти концепции гибкости на области данных, используемые программой. Обычно перемещаемые программы содержат и перемещаемые области данных. Когда загрузчик MS-DOS помещает программу в память, он назначает значения для всех ссылок на сегменты раньше ссылок на программные сегменты. Листинг 2-5, полученный из программного файла .EXE стандартного типа, показывает ссылку на сегмент данных, используемую для загрузки регистра сегмента данных. Листинг 2-6 показывает эквивалентную программу, полученную с помощью макроассемблера MASM.



              Листинг 2-5. Исходный код для заголовка программы .EXE
         -----------------------------------------------------------------

         data_seg SEGMENT              ; определение сегмента данных
                  ...                  ; значения и области данных

         data_seg ENDS
         code_seg SEGMENT              ;  определение кодового сегмента
                  ASSUME cs:code_seg
                  ASSUME ds:data_seg
         main     PROC   FAR           ; точка входа в программу
         start:
                  mov    ax,data_seg   ;  передача адреса сегмента данных
                  mov    ds,ax         ; ... в AX и оттуда в ...
                  mov    es,ax         ; ... регистры сегмента
                  ...     ...
         -----------------------------------------------------------------

При стандартном использовании переменная data_seg не является константой.Скорее, эта переменная является перемещаемым значением сегмента, которое указано в листинге 2-6 макроассемблера MASM четырьмя знаками "тире" и буквой R. При загрузке программы MS-DOS вставляет в программу действительное значение для его использования в процессе выполнения программы. Это значение является адресом ячейки памяти, в которую была загружена переменная data_seg. Таким образом, с помощью MS-DOS, программный код и области данных могут быть перемещены в физической памяти.



                 Листинг 2-6. Листинг для заголовка программы .EXE
         -----------------------------------------------------------------

         0000                           code_seg SEGMENT
                                                 ASSUME cs:code_seg ASSUME
                                                 ds:data_seg
         0000                           main     PROC   FAR
         0000                           start:
         0000 B8 ---- R                          mov     ax,data_seg
         0003 8E D8                              mov     ds,ax
         0005 8E C0                              mov     es,ax
         -----------------------------------------------------------------

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz