|
...
-----------------------------------------------------------------
При стандартном использовании переменная data_seg не является
константой.Скорее, эта переменная является перемещаемым значением
сегмента, которое указано в листинге 2-6 макроассемблера MASM че-
тырьмя знаками "тире" и буквой R. При загрузке программы MS-DOS
вставляет в программу действительное значение для его использова-
- 2-24 -
ния в процессе выполнения программы. Это значение является адре-
сом ячейки памяти, в которую была загружена переменная 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
-----------------------------------------------------------------
Отдельные области данных
Если в программе определяется несколько сегментов данных (ис-
пользуя, соответственно, директивы ASSUME), то внутренние прог-
раммы могут иметь отдельные области данных. Но, при обычном стиле
программирования каждый раз при вызове программы каждая программа
ограничена доступом к одной и той же области данных. Область дан-
ных предназначена для программы и наоборот.
При обычном использовании назначенные области не являются по-
мехой, так как большинство программ выполняется последовательно,
одна за другой. Но, что произойдет, если попытаться выполнить од-
ну и ту же процедуру более одного раза и в одно и то же время?
Будет или нет более поздний вызов перезаписывать предшествующие
вызовы данных, из-за того, что программа использует только одну
область данных? Здесь можно удивиться, почему одна и та же проце-
дура будет вызываться более одного раза одновременно?
По крайней мере, это возможно в трех случаях. Во-первых,
мультизадачные системы могут иметь множество выполняемых прог-
рамм, разделяющих общие библиотеки программ, называемые библиоте-
ками исполнимых модулей (потому что программный код доступен во
время исполнения, а не включается в программу во время компонов-
ки). Вместо наличия нескольких копий внутренних программ, разме-
щенных в программном файле, библиотеки исполнимых модулей имеют
только одну копию программы, размещенной в памяти (для более под-
робного обсуждения библиотек исполнимых модулей смотри главу 3).
Если бы даже все они могли выполнять одну и ту же программу в од-
но и то же время, библиотеки исполнимых модулей должны были бы
иметь отдельные области данных, чтобы избежать неумышленное сов-
местное использование и порчу данных.
Второй случай, когда одна и та же процедура может быть вызва-
на программами одновременно, происходит в системах управления
прерываниями. Допустим, что выполняется некоторая программа и
произошло прерывание из-за некоторого внешнего события.
|