ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
Часть 9 . -172 - 8.2 КОДИРОВАНИЕ КОМАНД 8.2.1 Общий обзор Коды всех команд образуют подмножество общего формата коман д, показанного на рис.8-1. Команды состоят из 1 или 2-х байтов ко да операции, возможно описателя адреса, состоящего из байта "mod r/ m" и байта "масштабного индекса ", смещения, если требуется и, ес ли требуется, поля непосредственного операнда. Внутри кода или кодов операций можно определить более мелк ие поля кодировки. Эти поля варьируются в зависимости от клас са операций. Эти поля определяют такую информацию, как направлен ие передачи операнда, размер смещения, код номера регистра и ли распространение знака. Почти все команды, относящиеся к операнду, находящемуся в памяти, имеют байт режима адресации, следующий непосредственно за первыми байтами кода операции. Этот байт, байт поля "mod r/m ", указывает на режим адресации, который может быть использова н. Основная кодировка байта "mod r/m", чтобы полностью определи ть режим адресации. Режимы адресации могут указывать на непосредственное смещени е, которое следует за байтом "mod r/m", или на байт индексно го смещения. Если смещение присутствует, то его возможная дли на составит 8, 16 или 32 разряда. Если в команде указан непосредственный операнд, то эт от непосредственный операнд следует за любым байтом смещени я. Непосредственный операнд, если он задан, всегда является последн им в поле команды. Рис.8-1 показывает несколько полей, которые могут появиться в команде, такие как поле "mod" и поле "r/m", но не показывает вс ех полей команды. В команде общего формата могут присутствова ть несколько меньших полей, тогда с собственными байтами код ов операции. Таблица 8-2 является полным списком всех полей, котор ые могут быть использованы в командах 80386. За табл.8-2 приведе ны детальные таблицы кодировки каждого из полей команды. ------------------------------------------- |TTTTTTTT|TTTTTTTT|mod TTT r/m|ss index base| ====> ------------------------------------------- 7 0 7 0 7 6 5 3 2 0 7 6 5 3 2 0 --------v-------- -----v----- ------v----- код операции "mod r/m" "s-i-b" (один или два байт байт байта) ------------v------------ (T битовое предс- регисторный и адресный тавление кода вид спецификатора операции ====> d32|16|8|none data32|16|8|none ------v------ -------v-------- отображение прямые адреса данные (4,2,1 байт (4,2,1 байт или отсутс- или отсутс- твует) твует) Рис.8-1. Основной формат команд . -173 - Таблица 8-2. Внутренние поля команд 80386 ----------------------------------------------------------------- -- Имя поля | Детектор (описатель) | Число разрядо ----------------------------------------------------------------- -- w | Вид числа: байт или полный формат | 1 | (16 или 32 разряда) | d | Направление изменения адреса | 1 | числа | s | Вид представления знака в непос- | 1 | редственном операнде | reg | Код регистра | 3 | | mod r/m | Вид режима адресации (исполнитель- | 2 для "mod" | ным адресом может быть содержание | 3 для "r/m" | регистра общего назначения | ss | Размер смещения для режима индекс- | 2 | ной адресации со смещением | index | Код регистра, используемого | 3 | как индексный регистр | base | Код регистра, используемого | 3 | как базовый регистр | sreg | Код сегментного регистра CS, SS, | 2 | DS, ES | sreg | Код сегментного регистра CS, SS, | 3 | DS, ES, FS, GS | tttn | Для условных команд, вид условия | 4 | совпадения или условия различия | ----------------------------------------------------------------- -- 8.2.2 Расширения стека команд на 32 разряда В 80386 список команд 86/186/286 расширяется в двух ортогональных направлениях: добавляются 32-х разрядные формы всех 16-х разрядных команд для того, чтобы отличить работу с 32-х разрядными типами данных и 32-х разрядные виды адресации станов ятся возможными для всех инструкций обращения к памяти. Это ортогонал ьное расширение стека команд достигается с помощью (D) бита в описа теле кода сегмента и путем наличия двух префиксов в списке команд. Команда оперирует с 16 или 32-х разрядными операндам и, зависящими от установки D бита в описателе кода сегмента, который и дает длину операнда для обоих операндов и эффективность адресаци и, когда исполняется этот код сегмента. При использовании прямой и ли виртуальной адресации 8086 никаких кодов описателей сегментов не используется, но значение D или O рассматривается внутри 8038 6, когда операции выполняются именно в этих видах адресации (для 16 -и разрядных слов сравнимых с 86/186/286). Два префикса (префикс длинны операнда и префикс дли ны эффективного адреса) позволят не принимать во внимание дли ны операнда и эффективного адреса. Эти префиксы могут предшествова ть любому байту кода операции и действуют только на ту команд у, которой они предшествуют. Если необходимо, перед байтами ко да операции могут быть установлены 1 или 2 этих префикса. Налич ие префиксов длины операнда и длины эффективного адреса долж но заменить длину операнда или эффективного адреса на противоположн ую тому, которая указана установкой D-бита. Например, если установ ка D-битом длины операнда соответствует 32-х разрядному операнду, то наличие префикса длины операнда заставит инструкцию выполняться к ак 16-и разрядная. В другом примере, если D-бит эффективного адре са 16-и -174 - разрядный, то наличие префикса длины эффективного адреса заставля ет инструкцию использовать 32-х битный эффективный адрес. Эти 32-х разрядные расширения допустимы во всех видах 8038 6, включая вид прямых адресов и виртуальных для 8086. В этих вид ах D-бит указывает на 16-и разрядные формы, поэтому префиксы нужн ы, чтобы определить 32-х разрядные операнды или адреса. Независимо от предшествующих описаний, инструкции с 8- и 16 -и разрядными операндами не влияют на содержимое старших разряд ов расширенных регистров. 8.2.3 Кодирование полей команд Внутри команды имеются несколько полей указывающих в ид адресации, выбор регистра и т.д. Такое кодирование этих пол ей приведено ниже. 8.2.3.1 Кодирование длины операнда (W) полем Для любой данной команды, выполняются операции с данным и, команда выполняется как операция 32-х разрядная или 16-и разрядна я. Внутри ограничений размера операции, поле W кодирует разм ер операнда как или 1 байт или как полный размер операции в табли це приведенной ниже. ----------------------------------------------------------------- -- W поле | Размер операнда при | Размер операнда при | 16-и разрядных операциях| 32-х разрядных | с данными | операциях с данными ----------------------------------------------------------------- -- 0 | 8 бит | 8 бит 1 | 16 бит | 16 бит ----------------------------------------------------------------- -- 8.2.3.2 Кодирование reg поля регистров общего назначения (основных) Главный регистр определяется с помощью reg поля, которое мож ет появится в первых (основных) байтах кода операции или как поле r /m в байте "mod r/m". Кодирование поля reg, когда поле W в команде отсутствует ----------------------------------------------------------------- -- reg поле | Выбранный регистр | Выбранный регистр | при выполнении | при выполнении | 16-и разрядных операций | 32-х разрядных опер аций | с данными | с данными ----------------------------------------------------------------- -- 000 | Ax | EAX 001 | CX | ECX 010 | DX | EDX 011 | BX | EBX 100 | SP | ESP 101 | BP | EBP 101 | SI | ESI 101 | DI | EDI ----------------------------------------------------------------- -- . -175 - Кодирование reg поля, при наличие W поля ----------------------------------------------------------------- -- Регистр определяемый reg полем во время выполнения операций с 16-разрядными данными ----------------------------------------------------------------- -- reg | Функция W поля |------------------------------------------------------ -- | (если W=0) | (если W=1) ----------------------------------------------------------------- -- 000 | AL | AX 001 | CL | CX 010 | DL | DX 011 | BL | BX 100 | AH | SP 101 | CH | BP 110 | DH | SI 111 | BH | DI ----------------------------------------------------------------- -- ----------------------------------------------------------------- -- Регистр определяемый reg полем во время выполнения операций с 32-х разрядными данными ----------------------------------------------------------------- -- reg | Функции W поля |------------------------------------------------------ -- | (если W=0) | (если W=1) ----------------------------------------------------------------- -- 000 | AL | EAX 001 | CL | ECX 010 | DL | EDX 011 | BL | EBX 100 | AH | ESP 101 | CH | EBP 110 | DH | ESI 111 | BH | EDI ----------------------------------------------------------------- -- . -176 - 8.2.3.3 Кодирование сегментного регистра полем (sreg) Sreg-поле в основных командах-это 2-разрядное пол е, позволяющее указывать один из четырех сигментных регистров 8028 6. Sreg-поле в других командах-это 3-разрядное поле, позволяющ ее указывать сигменты FS и GS для 80386. 2-разрядное sreg поле ----------------------------------------------------------------- -- 2-разрядное sreg поле | Выбранный сигментный регистр ----------------------------------------------------------------- -- 00 | ES 01 | CS 10 | SS 11 | DS ----------------------------------------------------------------- -- 3-разрядное sreg поле ----------------------------------------------------------------- -- 3-разрядное sreg поле | Выбранный сигментный регистр ----------------------------------------------------------------- -- 000 | ES 001 | CS 010 | SS 011 | DS 100 | FS 101 | GS 110 | не используется 111 | не используется ----------------------------------------------------------------- -- 8.2.3.4 Кодирование видов адресации За исключением специальных команд таких как PUSH или POP, г де вид операции преопределен, вид адресации всех текщих инструкц ии определяется байтами адресации, которые следуют за остальным код ом операции. Первый байт адресации-байт "mod r/m", а следующий ба йт адресации информации, "s-i-b" (циклы индикации) байт, мож ет присутствовать. S-i-b байт-это (байт базы-шкалы-индексов) специальный ба йт определяющий, когда используется 32-х разрядный вид адресации, и когда байт "mod r/m" имеет r/m=100 и mod=00,01\/10. Если S-i-b ба йт присутствует, то 32-х разрядный вид адресации является функци ей mod, SS, "индекс" и полей "базы". Первый байт адресации, "mod r/m" байт также состоит из 3 -х битов (показан, как ТТТ на рис.8-1) иногда используется к ак расширение первого, основного кода операции. Однако, эти три би та могут быть использованы как поле регистора. Когда вычисляется эффективный адрес используется или 16 -и разрядная или 32-х разрядная адресация. 16-и разрядная адресац ия использует 16-и разрядные компоненты для вычисления 16-и разрядно го адреса, в то время как при 32-х разрядной адресации использует ся 32-х разрядные компоненты адреса для вычисления 32-х разрядно го адреса. Когда используется 16-и разрядная адресация, байт "m od r/m", интерпретируется как спецификатор 16-и разрядной адресаци и. Когда используется 32-х разрядная адресация, то байт "mod r/ m" интерпретируется как спецификатор 32-х разрядной адресации. Таблицы, которые следуют далее определяют все кодировки вс ех -177 - 16- и 32-х разрядных видов адресации. Кодирование 16-и разрядного вида адресации байтом "mod r/m" ----------------------------------------------------------------- -- mod r/m | Эффективные адреса ----------------------------------------------------------------- -- 00 000 | DS:[BX+SI] 00 001 | DS:[BX+DI] 00 010 | SS:[BP+SI] 00 011 | SS:[BP+DI] 00 100 | DS:[SI] 00 101 | DS:[DI] 00 110 | DS:d16 00 111 | DS:[BX] | 01 000 | DS:[BX+SI+d8] 01 001 | DS:[BX+DI+d8] 01 010 | SS:[BP+SI+d8] 01 011 | SS:[BP+DI+d8] 01 100 | DS:[SI+d8] 01 101 | DS:[DI+d8] 01 110 | DS:[BX+d8] 01 111 | SS:[BP+d8] | 10 000 | DS:[BX+SI+d16] 10 001 | DS:[BX+DI+d16] 10 010 | SS:[BP+SI+d16] 10 011 | SS:[BP+DI+d16] 10 100 | DS:[SI+d16] 10 101 | DS:[DI+d16] 10 110 | DS:[BX+d16] 10 111 | SS:[BP+d16] | 11 000 | регистр-смотри ниже 11 001 | "-" 11 010 | "-" 11 011 | "-" 11 100 | "-" 11 101 | "-" 11 110 | "-" 11 111 | "-" ----------------------------------------------------------------- -- . -178 - ----------------------------------------------------------------- -- Регистор, который определяется r/m с 16-и разрядными операциями над данными ----------------------------------------------------------------- -- mod r/m | Функция W поля |----------------------------------------------- -- | (если W=0) | (если W=1) ----------------------------------------------------------------- -- 11 000 | AL | AX 11 001 | CL | CX 11 010 | DL | DX 11 011 | BL | BX 11 100 | AH | SP 11 101 | CH | BP 11 110 | DH | SI 11 111 | BH | DI ----------------------------------------------------------------- -- ----------------------------------------------------------------- -- Регистр, который определяется r/m с 32-х разрядными операциями над данными ----------------------------------------------------------------- -- mod r/m | Функция W поля |----------------------------------------------- -- | (если W=0) | (если W=1) ----------------------------------------------------------------- -- 11 000 | AL | EAX 11 001 | CL | ECX 11 010 | DL | EDX 11 011 | BL | EBX 11 100 | AH | ESP 11 101 | CH | EBP 11 110 | DH | ESI 11 111 | BH | EDI ----------------------------------------------------------------- -- Кодирование 32-х разрядных видов адресов "mod r/m" байтом (при отсутствии S-i-b) ----------------------------------------------------------------- -- mod r/m | Эффективные адреса ----------------------------------------------------------------- -- 10 000 DS:[EBX+ESI+d32] 10 001 DS:[EBX+EDI+d32] 10 010 SS:[EBP+ESI+d32] 10 011 SS:[EBP+EDI+d32] 10 100 s-i-b присутствует 10 101 DS:[EDI+d32] 10 110 DS:[EBX+d32] 10 111 SS:[EBP+d32] 11 000 регистр-смотри ниже 11 001 "-" 11 010 "-" 11 011 "-" 11 100 "-" 11 101 "-" 11 110 "-" 11 111 "-" -179 - 00 000 DS:[EBX+ESI] 00 001 DS:[EBX+EDI] 00 010 SS:[EBP+ESI] 00 011 SS:[EBP+EDI] 00 100 s-i-b присутствует 00 101 DS:[EDI] 00 110 DS:d32 00 111 DS:[EBX] 01 000 DS:[EBX+ESI+d8] 01 001 DS:[EBX+EDI+d8] 01 010 SS:[EBP+ESI+d8] 01 011 SS:[EBP+EDI+d8] 01 100 s-i-b присутствует 01 101 DS:[EDI+d8] 01 110 DS:[EBX+d8] 01 111 SS:[EBP+d8] ----------------------------------------------------------------- -- ----------------------------------------------------------------- -- Регистр, который определяется r/m с 16-и разрядными операциями над данными ----------------------------------------------------------------- -- mod r/m | Функция W поля |----------------------------------------------- -- | (если W=0) | (если W=1) ----------------------------------------------------------------- -- 11 000 | AL | AX 11 001 | CL | CX 11 010 | DL | DX 11 011 | BL | BX 11 100 | AH | SP 11 101 | CH | BP 11 110 | DH | SI 11 111 | BH | DI ----------------------------------------------------------------- -- ----------------------------------------------------------------- -- Регистр, который определяется r/m с 32-х разрядными операциями над данными ----------------------------------------------------------------- -- mod r/m | Функция W поля |----------------------------------------------- -- | (если W=0) | (если W=1) ----------------------------------------------------------------- -- 11 000 | AL | EAX 11 001 | CL | ECX 11 010 | DL | EDX 11 011 | BL | EBX 11 100 | AH | ESP 11 101 | CH | EBP 11 110 | DH | ESI 11 111 | BH | EDI ----------------------------------------------------------------- -- . -180 - Кодирование 32-х разрядных видов адресов (при mod r/m и s-i-b байтах) ----------------------------------------------------------------- -- База | Эффективные адреса ----------------------------------------------------------------- -- 00 000 | DS:[EAX+(масштабный индекс)] 00 001 | DS:[ECX+("-")] 00 010 | DS:[EDX+("-")] 00 011 | DS:[EBX+("-")] 00 100 | SS:[EAX+("-")] 00 101 | DS:[d32+("-")] 00 110 | DS:[ESI+("-")] 00 111 | DS:[EDI+("-")] | 01 000 | DS:[EAX+(масштабный индекс)+d8] 01 001 | DS:[ECX+("-")+d8] 01 010 | DS:[EDX+("-")+d8] 01 011 | DS:[EBX+("-")+d8] 01 100 | SS:[ESP+("-")+d8] 01 101 | SS:[EBP+("-")+d8] 01 110 | DS:[ESI+("-")+d8] 01 111 | DS:[EDI+("-")+d8] | 10 000 | DS:[EAX+(масштабный индекс)+d32] 10 001 | DS:[ECX+("-")+d32] 10 010 | DS:[EDX+("-")+d32] 10 011 | DS:[EBX+("-")+d32] 10 100 | SS:[EAX+("-")+d32] 10 101 | SS:[EBP+("-")+d32] 10 110 | DS:[ESI+("-")+d32] 10 111 | DS:[EDI+("-")+d32] ----------------------------------------------------------------- -- ----------------------------------------------------------------- -- ss | Масштаб ----------------------------------------------------------------- -- 00 | x1 01 | x2 10 | x4 11 | x8 ----------------------------------------------------------------- -- ----------------------------------------------------------------- -- Индекс | Индексный регистр ----------------------------------------------------------------- -- 000 | EAX 001 | ECX 010 | EDX 011 | EBX 100 | нет 101 | EBP 110 | ESI 111 | EDI ----------------------------------------------------------------- -- . -181 - 8.2.3.5 Кодирование направления операции (d) полем В большинстве двухоперационных операций d поле присутству ет для указания того, чтобы операнд рассматривался ка источник, а также как приемник результата. ----------------------------------------------------------------- -- d | Направление операции ----------------------------------------------------------------- -- 0 | Регистр/Память <-- Регистр | "reg" поле указывает, что операнд-источник; | "mod r/m" или "mod ss index base" указывают операн д, | куда загружается результат -------------|--------------------------------------------------- -- 1 | Регистр <-- Регистр/Память | "reg" поле указывает операнд результата; | "mod r/m" или "mod ss index base" указывает операн д, | куда загружается результат ----------------------------------------------------------------- -- 8.2.3.6 Кодирование одинарного и расширенного (s) поля S поле сначала встречается в операциях с поля ми непосредственных данных. S поле действует только если разм ер непосредственных данных-8 разрядов и они размещаются в 16- и ли 32-х разрядных полях назначения. ----------------------------------------------------------------- -- s | Действие в режиме 8-и разряд-| Действие в режиме 16/32- | ного формата данных | разрядного формата данны ----------------------------------------------------------------- -- 0 | нет | нет | | 1 | Расширенный формат 8 разрядов| нет | для заполнения 16-или 32-х | | разрядных полей назначения | ----------------------------------------------------------------- -- . -182 - 8.2.3.7 Кодирование поля (tttn) условного теста Для команд условных (условных переходов и установки состояни я) tttn кодируется как n-указывающее на использование состоян ия (n=0) или его отрицание (n=1), и ttt дающее состояния, котор ые нужно проверить. ----------------------------------------------------------------- -- Мнемоника | Состояние | tttn ----------------------------------------------------------------- -- O | Переполнение | 0000 NO | Нет переполнения | 0001 B/NAE | Ниже/Не выше или равно | 0010 NB/AE | Не ниже/выше или равно | 0011 E/Z | Равно/нуль | 0100 NE/NZ | Не равно/Не нуль | 0101 BE/NA | Ниже или равно/Не выше | 0110 NBE/A | Не ниже или равно/выше | 0111 S | Знак ("1") | 1000 NS | Не знак ("0") | 1001 P/PE | Паритет/Паритет четности | 1010 NP/PO | Не паритет/Паритет нечетности | 1011 L/NGE | Меньше чем/Не больше или равно | 1100 NL/GE | Не меньше чем/Больше или равно | 1101 LE/NG | Меньше чем или равно/Больше чем | 1110 NLE/G | Не меньше или равно/Больше чем | 1111 ----------------------------------------------------------------- -- 8.2.3.8 Кодирование управляющего или отладочного, или тестового регистра (eee) полем Для загрузки и описания управляющего, отладочного и тестово го регистров. Когда рассматривается управляющий регистр ----------------------------------------------------------------- -- eee Код | Имя регистра ----------------------------------------------------------------- -- 000 | CR0 010 | CR2 011 | CR3 ----------------------------------------------------------------- -- Любой другой код не используется ----------------------------------------------------------------- -- Когда рассматривается отладочный регистр ----------------------------------------------------------------- -- eee Код | Имя регистра ----------------------------------------------------------------- -- 000 | DR0 001 | DR1 010 | DR2 011 | DR3 110 | DR6 111 | DR7 ----------------------------------------------------------------- -- Любой другой код не используется ----------------------------------------------------------------- -- -183 - Когда рассматривается тестовый регистр ----------------------------------------------------------------- -- eee Код | Имя регистра ----------------------------------------------------------------- -- 110 | TR6 111 | TR7 ----------------------------------------------------------------- -- Любой другой код не используется ----------------------------------------------------------------- -- |