<<
>>

Директивы сегментации программы

Программа на языке Ассемблер состоит из одного или нескольких участков, ко- торые принято называть сегментами программы. Обычно выделяются сегменты для описания используемых в программе констант, полей памяти и кодов ко- манд, задающих действия по обработке данных.
Причем для каждого вида кодов выделяются отдельные сегменты. В этом смысле сегменты программы на языке Ассемблер похожи на разделы программы на языке Паскаль.

Сегменты программы, в которых сосредоточены коды команд, принято называть программными сегментами кодов. А ее сегменты, содержащие описания исполь- зуемых в программе полей и констант, называются программными сегментами данных. Сегмент программы, образуемый для работы со стеком, называется про- граммным сегментом стека.

ВНИМАНИЕ --------------------------------------------------------------------------------------------------------

Не следует путать сегмент программы и сегмент оперативной памяти. Сегмент про- граммы — это часть текста программы, то есть оформленная по специальным пра- вилам последовательность операторов на языке Ассемблер, а сегмент оперативной памяти — это некоторый ее участок, фрагмент аппаратуры компьютера.

Для объявления некоторого участка программы сегментом используются две директивы сегментации, segment и ends (от end segment), которыми с двух сторон ограничивается этот участок. Директива segment записывается в начале такого участка, а директива ends — в его конце (рис. 4.27, а).

Рис. 4.27. Программный сегмент: а — схема организации; б — фрагмент

Директивы segment и ends обязаны иметь одну и ту же метку, по которой опо- знаются ограничивающие сегмент директивы сегментации.

Кроме того, директива segment может иметь несколько параметров, из которых на рис. 4.27, а показан только один параметр строка, служащий для визуального контроля за назна- чением сегмента, а также для некоторых других целей. На рис. 4.27, б приве- ден пример, содержащий фрагмент программного сегмента. Директивы segment и ends обозначены меткой сdsеg. Параметром директивы segment является строка 'code', которая часто выбирается для характеристики сегментов кода программы, содержащих мнемокоды машинных команд.

Ранее было сказано, что для выполнения любой программе предоставляется до четырех сегментов оперативной памяти. Далее выяснилось, что программа мо- жет состоять из произвольного количества программных сегментов. Теперь сле- дует понять как соотносятся сегменты оперативной памяти и программные сег- менты, о которых идет речь в этом разделе.

ВНИМАНИЕ --------------------------------------------------------------------------------------------------------

Программные сегменты размещаются в указанных программистом сегментах опе- ративной памяти.

Роль, закрепленная за тем или иным программным сегментом, известна только программисту, разрабатывающему эту программу. Программист произвольным образом разбивает программу на любое количество сегментов и распределяет программные конструкции между ними. Соглашение, по которому директивы определения данных сосредоточены в программном сегменте данных, не является обязательным. Это удобный и общепринятый способ структуризации программ, которому рекомендуется следовать. Транслирующей программе о выборе, сде- ланном программистом, ничего не известно.

Чтобы сообщить ассемблеру, какие программные сегменты в каких сегментах па- мяти следует разместить, программист может использовать директиву assume (принимать, присваивать), которая имеет следующий формат:

assume имя регистра: метка сегмента {, имя регистра: метка сегмента}

В соответствии с общепринятыми соглашениями конструкция, заключенная в фи- гурные скобки, может повторяться нуль или любое большее количество раз.

Поэтому можно сказать, что директива assume имеет один или несколько пара- метров, и если параметров несколько, то они отделяются друг от друга запятой.

Все параметры директивы имеют одинаковую структуру и играют одну и ту же роль. Каждый из них служит для задания связи между программным сегментом и выбранным для его размещения сегментом памяти. Параметр состоит из разде- ленных двоеточием названия сегментного регистра (имя регистра), с помощью которого фиксируется нужный сегмент памяти, и метки директивы сегментации (метка сегмента), которая определяет программный сегмент. Например, с по- мощью директивы

assume сs:сdsg

указывается, что программный сегмент с меткой сdsg нужно разместить в сег- менте кода оперативной памяти, а директивой

assume сs:сdsg, ds:dtsg, ss:stsg

задается размещение трех программных сегментов с метками сdsg, dtsg, stsg на трех сегментах памяти — кода (сегментный регистр сs), данных (сегментный регистр ds) и стека (сегментный регистр ss) соответственно.

Директива assume должна быть хотя бы один раз включена в один из программ- ных сегментов. Каждый программный сегмент, выделенный в программе, дол- жен быть представлен в этой директиве своим параметром. Если какой-либо сег- мент памяти программистом не используется, то вместо метки программного сегмента в параметре директивы можно указать слово nothing или же вообще опустить такой параметр.

Операционная система во время подготовки программы к загрузке в оператив- ную память выделяет под ее сегменты необходимые участки памяти. При этом адреса сегментов кода и стека автоматически загружаются в соответствующие сегментные регистры сs и ss. Затем в эти сегменты памяти записываются про- граммные сегменты, метки которых сопоставлены этим сегментным регистрам директивой assume. Таким образом, адреса, находящиеся в регистрах сs и ss, становятся значениями меток загруженных в них программных сегментов. В усло- виях последнего примера метка сdsg инициализируется адресом, загруженным в регистр сs, а метка stsg — адресом из регистра ss.

ВНИМАНИЕ --------------------------------------------------------------------------------------------------------

Процедуру подготовки, во время которой объекты программы (метки, переменные, регистры и т.

д.) получают начальные значения, принято называть инициализацией (от лат initialis — первоначальный).

В связи с тем, что операционная система использует регистр ds в процессе под- готовки программы к загрузке, она не может самостоятельно загрузить в него нужный адрес и установить связь между программным сегментом и сегментом памяти. А регистр дополнительного сегмента памяти еs автоматически не ини- циализируется операционной системой, потому что программисты не всегда ис- пользуют этот сегмент памяти. Поэтому инициализация указанных регистров должна предусматриваться программистом в разрабатываемой программе. Опе- рационная система, используя адреса участков памяти, находящиеся в регистрах сs и ss, записывает в память соответствующие сегменты программы. Вслед за ними она размещает программные сегменты данных, если они есть. Адреса полей памяти, в которые при этом попадут их начальные конструкции, автоматически становятся значениями меток этих программных сегментов. Так метки сегмен- тов данных получают свои значения. Остается только загрузить значения полу- ченных адресов в соответствующие сегментные регистры. Эта процедура выпол- няется по специальным правилам, которые обсуждаются в дальнейшем. Пример последовательности команд, реализующих такую загрузку для регистра ds, по- казан на рис. 4.27, б.

4.3.3.

<< | >>
Источник: Степанов А. Н.. Архитектура вычислительных систем и компьютерных сетей. 2007

Еще по теме Директивы сегментации программы:

  1. Программа Да и программа Нет
  2. Свободное воспроизведение программ для ЭВМ и баз данных. Декомпилирование программ для ЭВМ
  3. Музыкальные концертные программы
  4. Г л а в а 9 О ПРОГРАММАХ
  5. Программа телевидения
  6. ПРОЕКТНЫЙ И ИСПОЛНИТЕЛЬНЫЙ УРОВНИ ПРОГРАММ
  7. ИЗНАЧАЛЬНО КОРОТКАЯ ПРОГРАММА
  8. Установка программы Астропроцессор ZET
  9. Г л ав а 30 ПРОГРАММЫ СТАРОСТИ. ДОЛГОЖИТЕЛИ
  10. Глава 3. ПРОГРАММА СОЦИОЛОГИЧЕСКОГО ИССЛЕДОВАНИЯ
  11. Первый запуск программы
  12. Глава 1. Программа и анкета
  13. Основная программа духовного очищения
  14. КОЛЛЕКТИВ НАУЧНЫЙ: ПРОГРАММА ИССЛЕДОВАТЕЛЬСКАЯ
  15. Программы по иностранным языкам
  16. О программе Астропроцессор ZET