Максимов Н.В., Партыка Т.Л., Попов И.И. Архитектура ЭВМ и вычислительных систем (2005) (1186253), страница 76
Текст из файла (страница 76)
Режимы процессора. Система команд процессоров 180x86...389лице указаны правила вычисления исполнительного адреса в зависимости от значений полей mod и mem (a8 — адрес размером в байт,а!6 — адрес размером в слово):mem\mod000110000[BX]+[SI][BX]+[SI]+a8[BX] + [SI] +a!6001[BX]+[DI][BX] +[DI] +a8[BX]+[DI]+al6010[BP]+[SI][BP]+[SI]+a8[BP]+[SI]+al6Oil[BP]+[DI][BP]+[DI]+a8[BP]+[DI]+al6100[SI][SI]+a8[SI]+al6101[DI][DI]+a8[DI]+al6110a!6[BP] +a8[BP]+al6111[BX][BX]+a8[BX]+al6Замечания.
Если в команде не задан адрес, то он считается нулевым.Если адрес задан в виде байта (а8), то он автоматически расширяется сознаком до слова (а 16). Случай mod = 00 и mem = 110 указывает на отсутствиерегистров-модификаторов, при этом адрес должет иметь размер слова (адресноевыражение [ВР] ассемблер транслирует в mod = 01 и mem = 110 при а8 = 0).Случай mod = 11 соответствует формату «регистр—регистр».3.
Формат «регистр—непосредственный операнд» (3—4 байта):КОПsw11КОП'regнепосред. операнд ( 1 - 2 6 )Команды этого, формата описывают операции reg := reg immed (immed — непосредственный операнд). Бит w указывает наразмер операндов, а поле reg — на регистр-операнд (см. ранее).Поле КОП в первом байте определяет лишь класс операции (например, класс сложения), уточняет же операцию поле КОП из второгобайта.
Непосредственный операнд может занимать 1 или 2 байта взависимости от значения бита w, при этом операнд-слово записывается в команде в «перевернутом» виде. Ради экономии памяти в180X86 предусмотрен случай, когда в операции над словами непосредственный операнд может быть задан байтом (на этот случайуказывает «1» в бите s при w = 1), и тогда перед выполнением операции байт автоматически расширяется (со знаком) до слова.390Глава 4. Персональные компьютеры4. Формат «память—непосредственный операнд» (3—6 байтов):копswmodКОП"memадрес(0 26)непоср. оп(1 26)Команды этого формата описывают операции типа memmem - immed. Смысл всех полей — тот же, что и в предыдущихформатах.Помимо рассмотренных в 180X86 используются и другие форматы команды с двумя операндами; так, предусмотрен специальныйформат для команд, один из операндов которых фиксирован (обычно это регистр АХ).
Имеют свои форматы и команды с другим числом операндов.З а п и с ь к о м а н д в M A S M . Ранее уже было дано краткоеописание форматов ассемблерных команд, здесь же следует его конкретизировать, с учетом дополнительных сведений. Из сказанногоясно, что одна и та же операция в зависимости от типов операндовзаписывается в виде различных машинных команд: например, в180X86 имеется 28 команд пересылки байтов и слов. В то же время вMASM все эти «родственные» команды записываются единообразно: например, все команды пересылки имеют одну и ту же символьную форму записи:MOV opl,op2 (opl:=op2)Анализируя типы операндов, ассемблер сам выбирает подходящую машинную команду.В общем случае команды записываются в MASM следующимобразом:МЕТКА: МНЕМОКОД ОПЕРАНДЫ /КОММЕНТАРИЙМетка с двоеточием, а также точка с запятой и комментариймогут отсутствовать.
Метка играет роль имени команды, ее можноиспользовать в командах перехода на данную команду. Комментарий не влияет на смысл команды, а лишь поясняет ее. Операнды,если есть, перечисляются через запятую. Основные правила записиоперандов следующие.Регистры указываются своими именами, например:MOV AX,SI ;оба операнда — регистры4.3. Режимы процессора. Система команд процессоров 180x86... 391Непосредственные операнды задаются константными выражениями (их значениями являются константы-числа), например:MOV ВН,55 - непосредственный операндMOV DI,SIZE X SIZE X (число байтов, занимаемыхпеременной X) - непосредственный операндАдреса описываются адресными выражениями (например, именами переменных), которые могут быть модифицированы по одному или двум регистрам; например, в следующих командах первыеоперанды задают адреса:MOV Х , А НMOV X [ B X ] [ D I ] , 5MOV [ B X ] , C LПри записи команд в символьной форме необходимо внимательно следить за правильным указанием типа (размера) операндов,чтобы не было ошибок.
Тип обычно определяется по внешнемувиду одного из них, например:MOV АН,5MOV А Х , 5Пересылка байта, так как АН - байтовыйрегистрПересылка слова, так как АХ - 16-битовыйрегистр-операнд (5 может быть байтом исловом, по нему нельзя определить размерпересылаемой величины)MOV [ВХ],300 Пересылка слова, так как число 300не может быть байтомЕсли по внешнему виду можно однозначно определить тип обоих операндов, тогда эти типы должны совпадать, иначе ассемблерзафиксирует ошибку. Примеры:MOV DS,AXОба операнда имеют размер словаMOV СХ,ВНОшибка: регистры СХ и ВН имеют разныеразмерыMOV DL,300Ошибка: DL — байтовый регистр, а число 300не может быть байтомВозможны ситуации, когда по внешнему виду операндов нельзяопределить тип ни одного из них, как, например, в командеMOV [ B X ] , 5392Глава 4.
Персональные компьютерыЗдесь число 5 может быть и байтом, и словом, а адрес из регистра вх может указывать и на байт памяти, и на слово. В подобныхситуациях ассемблер фиксирует ошибку. Чтобы избежать ее, надоуточнить тип одного из операндов с помощью оператора с названием PTR:MOV BYTE PTR [BX],5Пересылка байтаMOV WORD PTR [BX],5Пересылка слова(Операторы — это разновидность выражений языка MASM,аналогичные функциям.)Оператор PTR необходим и в том случае, когда надо изменитьтип, предписанный имени при его описании. Если, например, хописано как имя переменной размером в слово:XDW999и если надо записать в байтовый регистр АН значение только первого байта этого слова, тогда воспользоваться командой видаMOV А Н , Хнельзя, так как ее операнды имеют разный размер.
Эту командуследует записать несколько иначе:MOV А Н , B Y T E PTR XЗдесь конструкция BYTE PTR x означает адрес х, однако рассматриваемый как адрес байта, а не слова. (Напомним, что с одногои того же адреса может начинаться байт, слово и двойное слово;оператор PTR уточняет, какого размера ячейка имеется.)И еще одно замечание. Если в символьной команде, оперирующей со словами, указан непосредственный операнд размером вбайт, как, например, в командеMOV А Х , 8 O hто возникает некоторая неоднозначность: что будет записано в регистр АХ — число OOSOh (+128) или OFFSOh (-128)? В подобных ситуациях ассемблер формирует машинную команду, где операнд-байтрасширен до слова, причем расширение происходит со знаком, еслиоперанд был записан как отрицательное число, и без знака — в остальных случаях. Например:MOV АХ,-128 ; => MOV AX,OFFSOh (A:=-128)MOVAX,128 ; => MOV AX,OOSOh (А:=+128)MOV AX,80h ; => MOV AX,OOSOh (A:=+128)4.3.
Режимы процессора. Система команд процессоров 180x86...393СегментированиеС е г м е н т ы п а м я т и . С е г м е н т н ы е р е г и с т р ы . Первыемодели 180X86 имели оперативную память объемом 2'6 байтов(64 Кб) и потому использовали 16-битовые адреса. В последующихмоделях память была увеличена до 220 байтов (1 Мбайт = 1000 Кб),для чего уже необходимы 20-битовые адреса.
Однако в этих 180X86для преемственности были сохранены 16-битовые адреса: именнотакие адреса хранятся в регистрах и указываются в командах, а также получаются в результате модификации по базовым и индекснымрегистрам. Как же удается 16-битовыми адресами ссылаться на1 Мбайт памяти и большие объемы?Эта проблема решается с помощью сегментирования адресов(неявного базирования адресов).
В 180X86 вводится понятие «сегмент памяти». Так называется любой участок памяти размером до64 Кб и с начальным адресом, кратным 16. Абсолютный (20-битовый) адрес А любой ячейки памяти можно представить как сумму20-битового начального адреса (базы) В сегмента, которому принадлежит ячейка, и 16-битового смещения D — адреса этой ячейки, отсчитанного от начала сегмента: А = в + D. (Неоднозначность выбора сегмента не играет существенной роли, главное — чтобы сумма ви D давала нужный адрес.) Адрес в заносится в некоторый регистрS, а в команде, где должен быть указан адрес А, вместо него записывается пара из регистра s и смещения D (в MASM такая пара, называемая адресной парой или указателем, записывается как s: в).Процессор же устроен так, что при выполнении команды он преждевсего по паре s: D вычисляет абсолютный адрес А как сумму содержимого регистра s и смещения о и только затем обращается к памяти по этому адресу А.
Таким образом, заменяя в командах абсолютные адреса на адресные пары, удается адресовать всю память 16-битовыми адресами (смещениями).В качестве регистра s разрешается использовать не любой регистр, а только один из четырех регистров, называемых сегментными: CS, DS, SS и ES. В связи с этим одновременно можно работать счетырьмя сегментами памяти: начало одного из них загружается врегистр CS и все ссылки на ячейки этого сегмента указываются ввиде пар CS : D, начало другого заносится в DS и все ссылки на егоячейки задаются в виде пар DS : D и т.
д. Если одновременно надоработать с большим числом сегментов, то следует своевременно сохранять содержимое сегментных регистров и записывать в них начальные адреса пятого, шестого и т. д. сегментов.Отметим, что используемые сегменты могут располагаться в памяти произвольным образом: они могут не пересекаться или Пересе-394Глава 4. Персональные компьютерыкаться и даже совпадать. Какие сегменты памяти использовать, вкаких сегментных регистрах хранить их начальные адреса — все этодело автора программы.Как и все регистры 180X86, сегментные регистры имеют размерслова. Поэтому возникает вопрос: как удается разместить в них20-битовые начальные адреса сегментов памяти 9 Ответ следующий.Поскольку все эти адреса кратны 16 (см.