assembler. Учебник для вузов_Юров В.И_2003 -637с (862834), страница 21
Текст из файла (страница 21)
главу 3 и приложение) и анализируя колонку файла листингас объектным кодом команды.Регистровый операнд — это просто имя регистра. В программе на ассемблереможно использовать имена всех регистров общего назначения и некоторых системных регистров:D 32-разрядные регистры ЕАХ, ЕВХ, ЕСХ, EDX, ESI, EDI, ESP, EBP;П 16-разрядные регистры АХ, ВХ, СХ, DX, SI, DI, SP, ВР;П 8-разрядные регистры АН, AL, BH, BL, CH, CL, DH, DL;П сегментные регистры CS, DS, SS, ES, FS, GS;D системные регистры CRO, CR2, CR3, CR4, DRO, DR1, DR2, DR3, DR6, DR7 (см. описание команды MOV в приложении).Например, команда add ax,bx складывает содержимое регистров АХ и ВХ и записывает результат в ВХ.
Команда dec si уменьшает содержимое SI на 1. И ещепример:константу 4 заносим в регистр almov a l , 4байт по адресу pass+4 - в регистр dlmov dl,pass+4команда с регистровыми операндамиadd al.dlОперанд — порт ввода-вывода. Помимо адресного пространства оперативнойпамяти процессор поддерживает адресное пространство ввода-вывода, котороеиспользуется для доступа к устройствам ввода-вывода. Объем адресного пространства ввода-вывода составляет 64 Кбайт. Для любого устройства компьютера в этом пространстве выделяются адреса. Конкретное значение адреса в пределах этого пространства называется портом ввода-вывода.
Физически порту94Глава 5. Синтаксис ассемблераввода-вывода соответствует аппаратный регистр (не путать с регистром процессора), доступ к которому осуществляется с помощью специальных командассемблера IN и OUT. Например,in al,60h; ввести байт из порта 60hРегистры, адресуемые с помощью порта ввода-вывода, могут иметь разрядность8,16 или 32 бита, но для конкретного порта разрядность регистра фиксирована.Команды IN и OUT работают с фиксированной номенклатурой объектов.
В качестве источника информации или получателя применяются так называемые регистры -аккумуляторы ЕАХ, АХ, AL. Выбор регистра определяется разрядностьюпорта. Номер порта может задаваться непосредственным операндом в командах IN и OUT или значением в регистре DX. Последний способ позволяет динамически определить номер порта в программе. Например,записать номер порта 20h в регистр dxmov dx,20hзаписать значение 20h в регистр almov al,20hвывести значение 20п в порт 20Нout dx.altl Структурные операнды используются для доступа к конкретному элементусложного типа данных, называемого структурой.
Мы подробно разберемся соструктурами в главе 13.* Записи (аналогично структурному типу) используются для доступа к битовому полю некоторой записи (глава 13).II Операнд находится в стеке,ж Операнд располагается в памяти. Это наиболее сложный и в то же время наиболее гибкий способ задания операндов. Он позволяет реализовать прямой и косвенный варианты адресации, являющиеся основными видами адресации.Последний вариант расположения операндов, ввиду его важности и большогообъема, рассмотрим более подробно. Обсуждение будет сопровождаться примерами команд ассемблера, цель которых — демонстрация того, как изменяется формат команды ассемблера при применении того или иного вида адресации.
В связис этим вернемся еще раз к рис. 2.8 (см. главу 2), который иллюстрирует принципформирования физического адреса на адресной шине процессора. Видно, что адрес операнда формируется как сумма двух составляющих — сдвинутого на 4 битасодержимого сегментного регистра и 16-разрядного эффективного адреса, который в общем случае вычисляется как сумма трех компонентов: базы, смещенияи индекса.Прямая адресацияПрямая адресация — это простейший вид адресации операнда в памяти, так какэффективный адрес содержится в самой команде и для его формирования не используется никаких дополнительных источников или регистров. Эффективныйадрес берется непосредственно из поля смещения машинной команды (см. главу 3),которое может иметь размер 8, 16, 32 бита.
Это значение однозначно определяетбайт, слово или двойное слово в сегменте данных.Прямая адресация может быть двух типов.я Относительная прямая адресация используется в командах условных переходов для указания относительного адреса перехода. Относительность такого пе-Синтаксис ассемблера95рехода заключается в том, что в поле смещения машинной команды содержится 8-, 16- или 32-разрядное значение, которое в результате работы команды будет складываться с содержимым регистра указателя команд IP/EIP. В результате такого сложения получается адрес, по которому и осуществляется переход.К примеру,jc ml;переход на метку ml, если флаг cf = 1mov al,2ml:Хотя в команде указана конкретная метка, ассемблер вычисляет смещение этойметки относительно следующей команды (в нашем случае mov al,2) и подставляет его в формируемую машинную команду JC.si Абсолютная прямая адресация — в этом случае эффективный адрес являетсячастью машинной команды, но формируется этот адрес только из значения полясмещения в команде.
Для формирования физического адреса операнда в памяти процессор складывает это поле со сдвинутым на четыре бита значением сегментного регистра. В команде ассемблера можно использовать несколько формтакой адресации. К примеру,mov a x , w o r d ptr [0000];записать слово по адресу;ds:0000 в регистр ахОднако такая адресация применяется редко — обычно ячейкам в программеприсваиваются символические имена. В процессе трансляции ассемблер вычисляет и подставляет значения смещений этих имен в поле смещения формируемой им машинной команды (см. главу 3). В итоге получается, что машинная команда прямо адресует свой операнд, имея, фактически, в одном из своихполей значение эффективного адреса. К примеру,data segmentperl dw 5data endscode segmentmov ax,datamov ds.axmov ax,perl ;записать слово perl (его физический адрес ds:0000) в ахМы получим тот же результат, что и при использовании командыmov a x , w o r d ptr [0000]Остальные виды адресации относятся к косвенным.
Слово «косвенный» в названии этих видов адресации означает, что в самой команде может находиться лишьчасть эффективного адреса, а остальные его компоненты находятся в регистрах, накоторые указывают своим содержимым байт mod r/m и, возможно, байт sib.Косвенная адресация имеет следующие разновидности:9 косвенная базовая, или регистровая, адресация;II косвенная базовая адресация со смещением;ii косвенная индексная адресация со смещением;ш косвенная базовая индексная адресация;ж косвенная базовая индексная адресация со смещением.96Глава 5. Синтаксис ассемблераКосвенная базовая адресацияПри косвенной базовой (регистровой) адресации эффективный адрес операндаможет находиться в любом из регистров общего назначения, кроме SP/ESP и ВР/ЕВР(это специальные регистры для работы с сегментом стека).Синтаксически в команде этот режим адресации выражается заключением имени регистра в квадратные скобки.
К примеру, команда mov ax,[ecx] помещает в регистр АХ содержимое слова по адресу сегмента данных со смещением, хранящимсяв регистре ЕСХ. Так как содержимое регистра легко изменить в ходе работы программы, данный способ адресации позволяет динамически назначить адрес операнда для некоторой машинной команды. Это очень полезно, например, для организации циклических вычислений и для работы с различными структурами данныхтипа таблиц или массивов.Косвенная базовая адресация со смещениемКосвенная базовая (регистровая) адресация со смещением является дополнениемпредыдущего вида адресации и предназначена для доступа к данным с известнымсмещением относительно некоторого базового адреса. Этот вид адресации удобноиспользовать для доступа к элементам структур данных, когда смещение элементов известно заранее на стадии разработки программы, а базовый (начальный) адресструктуры должен вычисляться динамически на стадии выполнения программы.Модификация содержимого базового регистра позволяет обращаться к одноименным элементам различных экземпляров однотипных структур данных.К примеру, команда mov ax,[edx+3h] пересылает в регистр АХ слово из областипамяти по адресу, определяемому содержимым EDX + 3h.
Команда mov ax,mas[dx]пересылает в регистр АХ слово по адресу, определяемому содержимым DX плюсзначение идентификатора mas (не забывайте, что транслятор присваивает каждому идентификатору значение, равное смещению этого идентификатора относительно начала сегмента данных).Косвенная индексная адресация со смещениемКосвенная индексная адресация со смещением очень похожа на косвенную базовую адресацию со смещением. Здесь также для формирования эффективного адреса используется один из регистров общего назначения.
Но индексная адресацияобладает одной интересной особенностью, которая очень удобна для работы с массивами. Она связана с возможностью так называемого масштабирования содержимого индексного регистра. Что это такое? Для выяснения смысла этого термина стоит вернуться к материалу главы 3. В контексте нашего обсуждения насинтересует байт sib. При описании структуры этого байта (см.
раздел «Форматмашинных команд IA-32» в главе 3) отмечалось, что он состоит из трех полей. Одноиз этих полей — поле масштаба (ss), на значение которого умножается содержимое индексного регистра. К примеру, в команде mov ax,masfesi*2] значение эффективного адреса второго операнда определяется выражением mas+(esi)*2. В связис тем, что в ассемблере нет средств индексации массивов, программисту приходится организовывать ее своими силами.