Попов И.И., Матвеев А.А., Максимов Н.В. Архитектура электронно-вычислительных машин и систем (2004) (1186255), страница 92
Текст из файла (страница 92)
Пример:G DB 200, -5, 10h, ?, 'F'Имя, указанное в директиве, считается именующим первую изконстант.Для ссылок на остальные в MASM используются выражения вида<имя>+<целое>; например, для доступа к байту с числом -5 надо указатьвыражение G+1, для доступа к байту с 10h - выражение G+2 и т.д.Если в директиве DB перечислены только символы, например:S DB 'a','+','b'тогда эту директиву можно записать короче, заключив все этисимволы в одни кавычки:S DB 'a+b'И, наконец, если в директиве описывается несколько одинаковыхконстант (переменных), то можно воспользоваться конструкциейповторенияk DUP(a,b,...,c)которая эквивалентна повторенной k раз последовательностиa,b,...,c.Например, директивыV1 DB 0,0,0,0,0V2 DW ?,?,?,?,?,?,?,?,?,'a',1,2,1,2,1,2,1,2можно записать более коротко таким образом:V1 DB 5 DUP(0)V2 DW 9 DUP(?), 'a', 4 DUP(1,2)468Представление команд.
Модификация адресовСтруктура команд. Исполнительные адресаМашинные команды I80Х86 занимают от 1 до 6 байтов.Код операции (КОП) занимает один или два первых байтакоманды. В I80Х86 столь много различных операций, что для них нехватает 256 различных КОПов, которые можно представить в одномбайте. Поэтому некоторые операции объединяются в группу и им даетсяодин и тот же КОП, во втором же байте этот КОП уточняется. Крометого, во втором байте указываются типы и способ адресации операндов.Остальные байты команды указывают на операнды.Команды могут иметь от 0 до 3 операндов, у большинства команд- один или два операнда.
Размер операндов - байт или слово (редко двойное слово). Операнд может быть указан в самой команде (это т.н.непосредственный операнд), либо может находиться в одном изрегистров I80Х86 и тогда в команде указывается этот регистр, либоможет находиться в ячейке памяти и тогда в команде тем или инымспособом указывается адрес этой ячейки.
Некоторые команды требуют,чтобы операнд находился в фиксированном месте (например, в регистреAX), тогда операнд явно не указывается в команде. Результатвыполнения команды помещается в регистр или ячейку памяти, изкоторого (которой), как правило, берется первый операнд. Например,большинство команд с двумя операндами реализуют действиеop1 := op1 - op2где op1 - регистр или ячейка, а op2 - непосредственный операнд,регистр или ячейка.469Адрес операнда разрешено модифицировать по одному или двумрегистрам. В первом случае в качестве регистра-модификатораразрешено использовать регистр BX, BP, SI или DI (и никакой иной).
Вовтором случае один из модификаторов обязан быть регистром BX илиBP, а другой - регистром SI или DI; одновременная модификация поBX и BP или SI и DI недопустима.Регистры BX и BP обычно используются для хранения базы(начального адреса) некоторого участка памяти (скажем, массива) ипотому называются базовыми регистрами, а регистры SI и DI частосодержат индексы элементов массиваи потому называютсяиндексными регистрами.Однако такое распределение ролей необязательно, и, например, вSI может находиться база массива, а в BX - индекс элемента массива.В MASM адреса в командах записываются в виде одной изследующих конструкции:A, A[M] или A[M1][M2],где A - адрес, M - регистр BX, BP, SI или DI, M1 - регистр BX или BP, аM2 - регистр SI или DI.
Во втором и третьем варианте A можетотсутствовать, в этом случае считается, что A=0.470При выполнении команды процессор прежде всего вычисляет т.н.исполнительный (эффективный) адрес - как сумму адреса, заданного вкоманде, и текущих значений указанных регистров-модификаторов,причем все эти величины рассматриваются как неотрицательные исуммирование ведется по модулю 216 ([r] означает содержимое регистраr):A: Aисп = AA[M] : Aисп = A+[M] (mod 216)A[M1][M2]: Aисп = A+[M1]+[M2] (mod 216)Полученный таким образом 16-разрядный адрес определяет т.н.смещение - адрес, отсчитанный от начала некоторого сегмента (области)памяти. Перед обращением к памяти процессор еще добавляет ксмещению начальный адрес этого сегмента (он хранится в некоторомсегментном регистре), в результате чего получается окончательный 20разрядный адрес, по которому и происходит реальное обращение кпамяти (см.
1.4).Форматы командВ I80Х86 форматы машинных команд достаточно разнообразны.Для примера приведем лишь основные форматы команд с двумяоперандами.1) Формат "регистр-регистр" (2байта):КОП7 2d1w01176471reg15 3reg22 0Командыэтого формата описывают обычно действиеreg1:=reg1-reg2 или reg2:=reg2-reg1. Поле КОП первого байта указываетна операцию (-), которую надо выполнить.Бит w определяет размер операндов, а бит d указывает, в какой изрегистров записывается результат:w= 1=0– слова– байтыd= 1=0reg1:=reg1-reg2reg2:=reg2-reg1Во втором байте два левых бита фиксированы (для данногоформата), а трехбитовые поля reg1 и reg2 указывают на регистры,участвующие в операции, согласно следующей таблицы:reg000001010011100101110111w=1AXCXDXBXSPBPSIDIw=0ALCLDLBLAHCHDHBH2) Формат "регистр-память" (2-4 байта):КОПwmodregmemадрес (0 - 2 байта)Эти команды описывают операцииreg:=reg-memилиmem:=mem-reg.
Бит w первого байта определяет размер операндов (см.выше), а бит d указывает, куда записывается результат: в регистр (d=1)или в ячейку памяти (d=0). Трехбитовое поле reg второго байтауказываетоперанд-регистр (см. выше),двухбитовое поле modопределяет, сколько байтов в команде занимает операнд-адрес (00 - 0байтов, 01 - 1 байт, 10 - 2 байта), а трехбитовое поле mem указываетспособ модификации этого адреса. В следующей таблице указаныправила вычисления исполнительного адреса в зависимости от значенийполей mod и mem (a8 - адрес размером в байт, a16 - адрес размером вслово):mem \ mod00000101001110010111011100[BX]+[SI][BX]+[DI][BP]+[SI][BP]+[DI][SI][DI]a16[BX]01[BX]+[SI]+a8[BX]+[DI]+a8[BP]+[SI]+a8[BP]+[DI]+a8[SI]+a8[DI]+a8[BP]+a8[BX]+a847210[BX]+[SI]+a16[BX]+[DI]+a16[BP]+[SI]+a16[BP]+[DI]+a16[SI]+a16[DI]+a16[BP]+a16[BX]+a16Замечания.
Если в команде не задан адрес, то он считаетсянулевым.Если адрес задан в виде байта (a8), то он автоматическирасширяется со знаком до слова (a16). Случай mod=00 и mem=110указывает на отсутствие регистров-модификаторов, при этом адресдолжет иметь размер слова (адресное выражение [BP] ассемблертранслирует в mod=01 и mem=110 при a8=0). Случай mod=11соответствует формату "регистр-регистр".3) Формат "регистр-непосредственный операнд" (3-4 байта):КОПsw11КОП’regнепосред. операнд(1 - 2 б)Команды этого формата описывают операции reg:=reg-immed(immed - непосредственный операнд).
Бит w указывает на размероперандов, а поле reg - на регистр-операнд (см. выше). Поле КОП впервом байте определяет лишь класс операции (например, класссложения), уточняет же операцию поле КОП’ из второго байта.Непосредственный операнд может занимать 1 или 2 байта - взависимости от значения бита w, при этом операнд-слово записываетсяв команде в "перевернутом" виде. Ради экономии памяти в I80Х86предусмотрен случай, когда в операции над словами непосредственныйоперанд может быть задан байтом (на этот случай указывает1 в бите s при w=1), и тогда перед выполнением операции байтавтоматически расширяется (со знаком) до слова.4) Формат "память-непосредственный операнд" (3-6 байтов):КОПswmod КОП" memадрес(0 2б)непоср.оп (1 2б)Командыэтогоформатаописываютоперациитипаmem:=mem-immed.
Смысл всех полей - тот же, что и в предыдущихформатах.Помимо рассмотренных в I80Х86 используются и другие форматыкоманды с двумя операндами; так, предусмотрен специальный форматдля команд, один из операндов которых фиксирован (обычно эторегистр AX). Имеют свои форматы и команды с другим числомоперандов.473Запись команд в MASMИз сказанного ясно, что одна и та же операция в зависимости оттипов операндов записывается в виде различных машинных команд:например, в I80Х86 имеется 28 команд пересылки байтов и слов.
В тоже время в MASM все эти "родственные" команды записываютсяединообразно: например, все команды пересылки имеют одну и ту жесимвольную форму записи:MOV op1,op2 (op1:=op2)Анализируя типы операндов,ассемблер сам выбираетподходящую машинную команду.В общем случае команды записываются в MASM следующимобразом:МЕТКА: МНЕМОКОД ОПЕРАНДЫ ;КОММЕНТАРИЙМетка с двоеточием, а также точка с запятой и комментарий могутотсутствовать. Метка играет роль имени команды, ее можноиспользовать в командах перехода на данную команду.
Комментарий невлияет на смысл команды, а лишь поясняет ее. Операнды, если есть,перечисляются через запятую. Основные правила записи операндовследующие.Регистры указываются своими именами, например:MOV AX,SI ;оба операнда - регистрыНепосредственные операндызадаютсяконстантнымивыражениями (их значениями являются константы-числа), например:MOV BH,55 - непосредственный операндMOV DI,SIZE XSIZE X (число байтов, занимаемых переменной X)- непосредственный операндАдреса описываются адресными выражениями(например,именами переменных), которые могут быть модифицированы поодному или двум регистрам; например, в следующих командах первыеоперанды задают адреса:MOV X,AHMOV X[BX][DI],5MOV [BX],CLПри записи команд в символьной форменеобходимовнимательно следить за правильным указанием типа (размера)операндов, чтобы не было ошибок. Тип обычно определяется повнешнему виду одного из них, например:MOV AH,5MOV AX,5MOV[BX],300пересылка байта, т.к. AH - байтовый регистрпересылка слова, т.к.
AX – 16-битовый регистр операнд 5 можетбыть байтом и словом, по нему нельзя определить размерпересылаемой величины)пересылка слова, т.к. число 300 не может быть байтом474Если по внешнему виду можно однозначно определить тип обоихоперандов, тогда эти типы должны совпадать, иначе ассемблерзафиксирует ошибку. Примеры:MOV DS,AXMOV CX,BHMOV DL,300оба операнда имеют размер словаошибка: регистры CX и BH имеют разные размерыошибка: DL байтовый регистр, а число 300 неможет быть байтомВозможны ситуации, когда по внешнему виду операндов нельзяопределить тип ни одного из них, как, например, в командеMOV [BX],5Здесь число 5 может быть и байтом, и словом, а адрес из регистраBX может указывать и на байт памяти, и на слово.
В подобныхситуациях ассемблер фиксирует ошибку. Чтобы избежать ее, надоуточнить тип одного из операндов с помощью оператора с названиемPTR:MOV BYTE PTRпересылка байта[BX],5MOV WORD PTRпересылка слова[BX],5(Операторы - это разновидность выражений языка MASM,аналогичные функциям.)Оператор PTR необходим и в том случае, когда надо изменитьтип, предписанный имени при его описании.