assembler. Учебник для вузов_Юров В.И_2003 -637с (862834), страница 15
Текст из файла (страница 15)
Код операции может занимать от одного до трех байт. Длянекоторых машинных команд часть битов кода операции может находитьсяв байте mod r/m.Многим командам соответствует несколько кодов операций, каждый из которых определяет нюансы выполнения операции. Отметим, что поле кода операциине имеет однозначной структуры (см. рис. 3.1). В зависимости от конкретных команд, не обязательно разных с точки зрения языка ассемблера, оно может иметьв своем составе от одного до трех элементов, назначение которых описано в табл. 3.2.Один из этих трех элементов является непосредственно кодом операции или еечастью, остальные уточняют детали операции. Такое строение поля кода операции усложняет, в частности, процесс дизассемблирования.
Для определения размера и границ очередной команды необходимо полностью проанализировать ееполе кода операции.64Глава 3. Система команд процессора IA32Таблица 3.2. Назначение дополнительных битов поля кода операцииПолеКоличествоНазначениеd1Определяет направление передачи данных: 0 — передачаданных из регистра reg в память (или регистр), адресуемуюполем т/т; 1 — передача данных из памяти (или регистра),адресуемой нолем r/m, в регистр reg. При наличии байта sibадрес операнда в памяти формируется с учетом содержимогоэтого байтаs1Задает необходимость расширения 8-разрядногонепосредственного операнда до 16 или 32 бита.
Старшие битыпри этом заполняются значением старшего (знакового) битаисходного 8-разрядного операндаW1Определяет размер данных, которыми оперирует команда: байт,слово, двойное слово: 0 — 8 битов; 1 — 16 битов для 16-разрядного размера операндов или 32 бита для 32-разрядного размераоперандовreg3Определяет регистр, используемый в команде. Значение полязависит от ноля w, в том числе если поле w отсутствует(см. следующий подраздел)Последующие поля машинной команды определяют характеристики и местоположение операндов, участвующих в операции, и особенности их использования(см.
далее).Байт режима адресации mod r/mБайт режима адресации mod r/m, иногда называемый постбайтом, несет информацию об операндах и режиме адресации. Большинство команд процессора Intel —двухоперандные. Операнды могут находиться в памяти, а также в одном или двухрегистрах. Архитектура IA-32 не допускает, чтобы оба операнда команды находились в памяти. Если операнд находится в памяти, то байт mod r/m определяет компоненты (смещение, базовый и индексный регистры), используемые для вычисления его эффективного адреса (см. главу 2). Байт mod r/m состоит из трех полей(см.
рис. 3.1).!' Поле mod (два бита) определяет способ адресации и количество байтов, занимаемых в команде адресом операнда (поле смещения в команде). Поле mod используется совместно с полем r/m, которое определяет способ модификации адресаоперанда полем смещения в команде. Поле mod в комбинации с полем r/m образует 32 возможных значения, обозначающих один из восьми регистров и 24 режима адресации. К примеру, если mod = 00, то поле смещения в команде отсутствует и адрес операнда определяется содержимым базового и/или индексногорегистра.
Какие именно регистры потребуются для вычисления эффективногоадреса, определяется значением этого байта. Если mod = 01, то поле смещенияв команде присутствует, занимает один байт и модифицируется содержимымбазового и/или индексного регистра. Если mod = 10, то поле смещения в команде присутствует, занимает два или четыре байта (в зависимости от значения,действующего по умолчанию или определяемого префиксом размера адреса)Формат машинных команд IA-3265и модифицируется содержимым базового и/или индексного регистра. Еслиmod = 11, то операндов в памяти нет — они находятся в регистрах. Это же значение байта mod используется в случае, когда команда работает с непосредственным операндом.* Поле reg (3 бита) определяет либо регистр (табл.
3.3 и 3.4), находящийся в команде на месте второго операнда, либо возможное расширение кода операции(давая в совокупности размер поля КОП в 11 битов).яПоле г/т используется совместно с полем mod и определяет либо регистр, находящийся в команде на месте первого операнда (если mod = 11), либо базовыеи индексные регистры, применяемые для вычисления эффективного адреса (совместно с полем смещения в команде).Таблица 3.3. Значения кодов в поле reg (поле w присутствует в команде)w=0ALw=1000001CLCX/ECX010DLDX/EDXOilBLBX/EBX100AHSP/ESP101CHBP/EBPno111DHSI/ESIBHDI/EDIПоле regAX/EAXТаблица З.4. Значения кодов в поле reg (поле w отсутствует)Поле reg1 6-разрядные операции32-разрядные операции000АХЕАХ001схЕСХ010DXEDXонВХЕВХ100SPESP101ВРЕВРно111SIESIDIEDI.В таблицах нет содержимого поля reg для 16-разрядных регистров в 32-разрядных операциях, так как в архитектуре Intel отдельно использовать старшую половину 32-разрядного регистра невозможно.В архитектуре Intel один из операндов обязательно находится в регистре, и онможет быть первым или вторым.
Расположение первого и второго операндов в формате команды фиксировано. Но, например, команда MOV может выполнять пересылку как из регистра в память, так и из памяти в регистр. В машинном представлении3 Зак. 25666Глава 3. Система команд процессора IA32это одна и та же команда. В ее поле reg будет содержаться код регистра (см. табл. 3.3и 3.4), а в поле r/m — код режима адресации (см. далее). Эти две команды будутразличаться только одним битом d, который определяет направление передачи.Если в команде участвуют два регистра, то в этом случае вступает в силу правило:поле reg определяет второй операнд, а поле г/т — первый.
Если команда mov работает с ячейкой памяти, то в исходном тексте программы могут быть следующиеварианты записи этой команды:movabll,ax-.пересылка содержимого ах в ячейку памяти abllилиmov ax,abll;пересылка содержимого ячейки памяти abll в ахВ машинном представлении эти две команды будут выглядеть одинаково, заисключением бита d:' для команды MOV abll,ax бит d = 0;-.. для команды MOV ax,abll бит d = 1.Наиболее сложными для декодирования являются команды с операндом в памяти. Фирма Intel сопровождает описание системы команд специальными таблицами, облегчающими интерпретацию содержимого байта mod r/m (табл. 3.5 и 3.6).С их помощью можно довольно легко восстановить компоненты, из которых формировался адрес операнда, и, в конечном итоге, восстановить соответствующуюкоманду ассемблера для данной машинной команды.Таблица 3.5.
Значения байта mod r/m (16-разрядная адресация)г8ALCLDLBLAHCHDHBHг!6AXCXDXBXSPBPSIDIг32EAXECXEDXEBXESPEBPESIEDI/цифра (код операции)01234567reg000001010on100101110111Эффективный адресmodr/mШестнадцатеричные значения mod r/m[BX+SI]000000008101820283038[BX+DI]000010109111921293139[BP+SI]0001002Oa12la222a32За[BP+DI]00Oil03Ob13Ib232b333bOc[SI]001000414Ic242c343c[DI]0010105Od15Id252d353dсмещ 1600ПО06Oe16le262e363e[ВХ]0011107Of17If272f373f[ВХ+81]+смещ_8010004048505860687078[ВХ+О1]+смещ_8010014149515961697179[ВР+81]+смещ_801010424a525a626a727a[ВР+О1]+смещ_801on434b535b636b737b[81]+смещ_801100444c545c646c747cФормат машинных команд IA-3267Эффективный адресmodr/mШестнадцатеричные значения mod г/т[О1]+смещ_801101454d555d656d757d[ВР]+смещ_801110464е565e666e767e[ВХ]+смещ_801111474f575f676f777f[ВХ+81]+смещ_161000080889098aOa8bOb8[ВХ+О1]+смещ_161000181899199ala9blb9[ВР+81]+смещ_1610010828а929aa2aab2ba[ВР+О1]+смещ_1610011838Ь939ba3abb3bb[81]+смещ_1610100848с949ca4acb4be[О1]+смещ_16858d959da5adb5bd10101[ВР]+смещ_1610110868е969ea6aeb6be[ВХ]+смещ_1610111878f979fa7af77bfEAX/AX/AL11000 .
сОс8dOd8eOe8ГОf8ECX/CX/CL11001clс9dld9ele9Пf9EDX/DX/DL11010с2саd2Dae2eaf2faEBX/BX/BLИ011сЗcbd3Dbe3ebGfbESP/SP/AH11100с4ееd4DCe4ecf4fcЕВР/ВР/СН11101с5cdd5Dde5edfSfdES1/SI/DH11сбсеd6Dee6ееf6feEDI/DI/BH11по111с7cfd7Dfe7eff7ffТаблица З.6. Значения байта mod r/m (32-разрядная адресация)ЕСХEDXЕВХESPЕВРESIEDI01234567000001010011100101ПО111r32ЕАХ/цифра (код операции)regЭффективный адресmodr/mШестнадцатеричные значения mod r/m[ЕАХ]00ооо0008101820283038[ЕСХ]000010109111921293139[EDX]0001002Оа121а222а32За[ЕВХ]00on03Ob131Ь232Ь33ЗЬ[sib]0010004Ос141с242с34ЗсСмещ 320010105Od15Id252d353d[ESI]00Ое161е262е36Зе[EDI]по111060007Of17If272f373f[ЕАХ]+смещ_80100040485058606870787179[ЕСХ]+смещ_801001414951596169[ЕОХ]+смещ_801010424а525а626а7а72продолжение68Глава 3. Система команд процессора IA32Таблица 3.6 (продолжение)Эффективный адресmodr/mШестнадцатеричные значения mod r/m[ЕВХ]+смещ_801011434Ь535b636b737b[sibj+смещ 801100444с545c646c747c[ЕВР]+смещ_801101454d555d656d757d[Е81]+смещ_801по464е565e666e767e[ЕО1]+смещ_801111474f575f676f777f[ЕАХ]+смещ_321000080889098aOa8bOb8[ЕСХ]+смещ_321000181899199ala9blb9.[ЕОХ]+смещ_3210010828а929aa2aab2ba[ЕВХ]+смещ_3210011838Ь939ba3abЬЗbb[SIB]10100848с949ca4acb4be[ЕВР]+смещ_3210101858d959da5adb5bd[Е81]+смещ_3210868е969ea6aeb6be[ЕО1]+смещ_3210по111878f979fa7af77bfEAX/AX/AL11000сОС8dOd8eOe8fi)reECX/CX/CL11001clС9dld9ele9flf9EDX/DX/DL11010с2саd2Dae2eaufaEBX/BX/BL11011сЗcbd3Dbe3ebОftESP/SP/AH11100с4ееd4DCe4ecf4fcЕВР/ВР/СН11101с5cdd5Dde5edf5fdESI/SI/DHИ110сбсеd6Dee6ееf6feEDI/DI/BH11111с7cfd7Dfe7efПffРассмотрим пример использования данных таблиц при значении байта mod r/mравном 87h.