Максимов Н.В., Партыка Т.Л., Попов И.И. Архитектура ЭВМ и вычислительных систем (2005) (1186253), страница 77
Текст из файла (страница 77)
ранее), то в них младшие4 бита (последняя шестнадцатеричная цифра) всегда нулевые, а потому эти биты можно не хранить явно, а лишь подразумевать.Именно так и делается: в сегментном регистре всегда хранятся только первые 16 битов (первые четыре шестнадцатеричные цифры) начального адреса сегмента (эта величина называется номером сегмента или просто сегментом). При вычислении же абсолютного адреса (А.,5,.) по паре s: D процессор сначала приписывает справа ксодержимому регистра s четыре нулевых бита (другими словами,умножает на 16) и лишь затем прибавляет смешение о, причем суммирование ведется по модулю 220:.А.,бс = 16 х [s] + D (mod 220).Если, например, в регистре CS хранится величина I234h, тогдаадресная пара 1234h:507h определяет абсолютный адрес, равный16 х 1234h + 507h= 12340h + 507h = 12847h.С е г м е н т н ы е р е г и с т р ы п о у м о л ч а н и ю .
Согласно описанной схеме сегментирования адресов, замену абсолютных адресовна адресные пары надо производить во всех командах, имеющих операнд-адрес. Однако был разработан способ, позволяющий избежатьвыписывания таких пар в большинстве команд. Суть его в том, чтоустанавливается по умолчанию, какой именно сегментный регистрна какой сегмент памяти будет указывать, и что в командах задаетсятолько смещение: не указанный явно сегментный регистр автоматически восстанавливается согласно этой договоренности. И толькопри необходимости нарушить эту договоренность надо полностьюуказывать адресную пару.
Список умолчаний приводится в табл. 4.4.С учетом такого распределения ролей сегментных регистров машинные программы обычно строятся так: все команды программыразмещаются в одном сегменте памяти, начало которого заносится врегистр cs, а все данные размещаются в другом сегменте, началокоторого заносится в регистр DS; если нужен стек, то под него отводится третий сегмент памяти, начало которого записывается в регистр ss. После этого практически во всех командах можно указывать не полные адресные пары, а лишь смещения, так как сегментные регистры в этих парах будут восстанавливаться автоматически.4.3.
Режимы процессора. Система команд прощгссоров 180x86...395Таблица 4 4 Сегментные регистры по умолчаниюРегистрУмолчанияКомментарийCSУказывает на начало области памяти, в которой размещены команды программы (эта область называется сегментом команд или сегментом кодов), и потому при ссылках на ячейки этой области регистр CSможно не указывать явно, он подразумевается поумолчаниюАбсолютный адрес очередной команды,подлежащей выполнению, всегда задается парой CS IP в счетчике команд IP всегда находится смещение этой командыотносительно адреса из регистра CSDSУказывает на сегмент данных (область памяти с кон- Во всех ссылках на этот сегмент регистрстантами, переменными и другими величинами про- DS можно явно не указывать, так как онподразумевается по умолчаниюграммы)SSУказывает на стек - область памяти, доступ к кото- Все ссылки на стек, в которых явно нерой осуществляется по принципу «последним запи- указан сегментный регистр, по умолчасан - первым считан»нию сегментируются по регистру SSESЧаще всего он применяется для доступа кСчитается свободным, он не привязан ни к какомуданным, которые не поместились илисегменту памяти и его можно использовать по свосознательно не были размещены в сегему усмотрениюменте данныхЗдесь, правда, возникает такой вопрос: как по смещению определить, на какой сегмент памяти оно указывает? Этот вопрос рассматривается далее, а в общих чертах ответ такой: ссылки на сегмент команд могут содержаться только в командах перехода, а ссыл-.ки практически во всех других командах (кроме строковых истековых) — это ссылки на сегмент данных.
Например, в командепересылкиMOV А Х , Химя X воспринимается как ссылка на данное, а потому автоматически преобразуется в адресную пару DS.-x. В команде же безусловного перехода по адресу, находящемуся в регистре вх,JMP ВХабсолютный адрес перехода определяется парой cs : [ВХ].Итак, если в ссылке на какую-то ячейку памяти не указан явносегментный регистр, то этот регистр берется по умолчанию Явноже сегментные регистры надо указывать, только если по каким-топричинам регистр по умолчанию не подходит. Если, например, вкоманде пересылки следует сослаться на стек (скажем, надо записать в регистр АН байт стека, помеченный именем х), тогда нас ужене будет устраивать договоренность о том, что по умолчанию операнд команды MOV сегментируется по регистру DS, и потому мы обя-396Глава 4.
Персональные-компьютерызаны явно указать иной регистр - в нашем случае регистр SS, таккак именно он указывает на стек:MOV A H , S S : XОднако такие случаи встречаются редко и поэтому в командах,как правило, указываются только смещения.Отметим, что в MASM сегментный регистр записывается в самой команде непосредственно перед смещением (именем переменной, меткой и т. п.), однако на уровне машинного языка ситуациянесколько иная. Имеются четыре специальные однобайтовые команды, называемые префиксами замены сегмента (обозначаемыекак C S : , DS:, SS: и ES:).
Они ставятся перед командой, операнд-адрес которой должен быть просегментирован по регистру, отличному от регистра, подразумеваемому по умолчанию. Например,приведенная ранее символическая команда пересылки — это на самом деле две машинные команды:SS:MOV А Н , ХСегментирование, базирование и индексирован и е а д р е с о в . Поскольку сегментирование адресов — это разновидность модификации адресов, то в 180X86 адрес, указываемый вкоманде, в общем случае модифицируется по трем регистрам: сегментному, базовому и индексному. В целом, модификация адресапроизводится в два этапа.
Сначала учитываются только базовый ииндексный регистры (если они, конечно, указаны в команде), причем вычисление здесь происходит в области 16-битовых адресов;полученный в результате 16-битовый адрес называется исполнительным (эффективным) адресом. Если в команде не предусмотрено обращение к памяти (например, она загружает адрес в регистр), то наэтом модификация адреса заканчивается и используется именно исполнительный адрес (он загружается в регистр).
Если же нужен доступ к памяти, тогда на втором этапе исполнительный адрес рассматривается как смещение и к нему прибавляется (умноженное на16) содержимое сегментного регистра, указанного явно или взятогопо умолчанию, в результате чего получается абсолютный (физический) 20-битовый адрес, по которому реально и происходит обращение к памяти (рис.
4.15).Отметим, что сегментный регистр учитывается только в «последний» момент, непосредственно перед обращением к памяти, адо этого работа ведется только с 16-битовыми адресами. Если учестьк тому же, что сегментные регистры, как правило, не указываются в4.3. Режимы процессора. Система команд процессоров 180x86...150000397ОИсполнительный адрес|015Сегмент0000О ^ч/СумматорФизический адресРис.
4.15. Модификация адресовкомандах, то можно в общем-то считать, что 180X86 работает с16-битовыми адресами.Как уже сказано, если в ссылке на ячейку памяти не указан сегментный регистр, то он определяется по умолчанию. Это делаетсяпо следующим правилам.1. В командах перехода адрес перехода сегментируется по регистру CS и только по нему, так как абсолютный адрес команды, которая должна быть выполнена следующей, всегда определяется паройCS:IP (попытка изменить в таких командах сегментный регистр будет безуспешной).Отметим, что сегментирование по регистру CS касается именноадреса перехода, а не адреса той ячейки, где он может находиться.Например, в команде безусловного перехода по адресу, находящемуся в ячейке х:JMP Xимя х сегментируется по регистру DS, а вот адрес перехода, взятыйиз ячейки X, уже сегментируется по регистру CS.2.
Адреса во всех других командах, кроме строковых (STOS,MOVS, SCAS и CMPS), по умолчанию сегментируются.• по регистру DS, если среди указанных регистров-модификаторов нет регистра ВР,• по регистру ss, если один из модификаторов — регистр ВР.Таким образом, адреса вида А, А [ в х ] , A [ S i ] , A [ D I ] ,А [ в х ] [si] и А [ в х ] [DI] сегментируются по регистру DS, а адресаА [ В Р ] , A [ B P ] [ S i ] H A [ B P ] [ D I ] — по регистру ss, т. е. адреса трехпоследних видов используются для доступа к ячейкам стека.398Глава 4. Персональные компьютеры3. В строковых командах STOS, MOVS, SCAS и CMPS, имеющихдва операнда-адреса, на которые указывают индексные регистры siи DI, один из операндов (на который указывает si) сегментируетсяпо регистру DS, а другой (на него указывает DI) — по регистру ES.П р о г р а м м н ы е с е г м е н т ы . Д и р е к т и в а A S S U M E . Рассмотрим, как осуществляется сегментирование в программах наMASM.
Для того чтобы указать, что некоторая группа операторовпрограммы образует единый сегмент памяти, они оформляются какпрограммный сегмент: перед ними ставится директива SEGMENT, после них — директива ENDS, причем в начале обеих этих директивдолжно быть указано одно и то же имя, играющее роль имени сегмента.
Программа в целом представляет собой последовательностьтаких программных сегментов, в конце которой указывается директива конца программы END, например:DTI SEGMENT ;программный сегмент с именем DT1A DB ОВ DW ?DTI ENDSDT2 SEGMENT /программный сегмент DT2С DB 'hello1DT2 ENDSCODE SEGMENT ;программный сегмент CODEASSUME CS:CODE, DS:DT1, ES:DT2BEG: MOV AX,DT2MOV DS,AXMOV BH,CCODE ENDSEND BEG ;конец текста программыПредложения программного сегмента ассемблер размещает в одном сегменте памяти (в совокупности они не должны занимать более 64 Кб) начиная с ближайшего свободного адреса, кратного 16.Номер (первые 16 битов начального адреса) этого сегмента становится значением имени сегмента. В MASM это имя относится к константным, а не к адресным выражениям, в связи с чем в командеMOV A X , D T 2второй операнд является непосредственным, поэтому в регистр АХбудет записано начало (номер) сегмента DT2, а не содержимое начальной ячейки этого сегмента.4.3.
Режимы процессора. Система команд процессоров 180x86...399Имена же переменных (А, в, с) и метки (BEG) относятся к адресным выражениям, и им ставится в соответствие адрес их ячейкиотносительно «своего» сегмента:имени А соответствует адрес 0;имени в — адрес 1;имени с — адрес 0, а метке BEG — адрес 0.Все ссылки на предложения одного программного сегмента ассемблер сегментирует (по умолчанию) по одному и тому же сегментному регистру. По какому именно — устанавливается специальнойдирективой ASSUME.