|
|
|
|
Переместимый код
Макроассемблер 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
-----------------------------------------------------------------
|
|
|