Assembler - язык неограниченных возможностей

         

Глоссарий


Активационная запись (activation record) — область стека, заполняемая при вызове процедуры

Ассемблер (assembly language) — язык программирования низкого уровня

Ассемблер (assembler) — компилятор с языка ассемблера

Байт (byte) — тип данных, имеющий размер 8 бит, минимальная адресуемая единица памяти

Бит (bit) — минимальная единица измерения информации

«Всплывающая» программа (popup program) — резидентная программа, активирующаяся по нажатию определенной «горячей» клавиши

«Горячая» клавиша (hotkey) — клавиша или комбинация клавиш, используемая не для ввода символов, а для вызова программ и подобных необычных действий

Двойное слово (double word) — тип данных, имеющий размер 32 бита

Дескриптор (descriptor) — восьмибайтная структура, хранящаяся в одной из таблиц GDT, LDT или IDT и описывающая сегмент или шлюз

Директива (directive) — команда ассемблеру, которая не соответствует командам процессора

Драйвер (driver) — служебная программа, выполняющая функции посредника между операционной системой и внешним устройством

Защищенный режим (protected mode) — режим процессора, в котором действуют механизмы защиты, сегментная адресация с дескрипторами и селекторами и страничная адресация

Задача (task) — программа, модуль или другой участок кода программы, который можно запустить, выполнять, отложить и завершить

Идентификатор (handle или identifier) — число (если handle) или переменная другого типа, используемая для идентификации того или иного ресурса

Исключение (exception) — событие, при котором выполнение программы прекращается и управление передается обработчику исключения

Код (code) — исполнимая часть программы (обычная программа состоит из кода, данных и стека)

Компилятор (compiler) — программа, преобразующая текст, написанный на понятном человеку языке программирования, в исполнимый файл


Конвейер (pipe) — последовательность блоков процессора, которая задействуется при выполнении команды



Конвенция (convention) — договоренность о передаче параметров между процедурами

Конечный автомат (finite state machine) — программа, которая может переключаться между различными состояниями и выполнять в разных состояниях разные действия

Кэш (cache) — быстрая память, использующаяся для буферизации обращений к основной памяти

Лимит (limit) — поле дескриптора (равно размеру сегмента минус 1)

Линейный адрес (linear address) — адрес, получаемый сложением смещения и базы сегмента

Ловушка (trap) — исключение, происходящее после вызвавшей его команды

Метка (label) — идентификатор, связанный с адресом в программе

Нить (thread) — процесс, данные и код которого совпадают с данными и кодом других процессов

Нереальный режим (unreal mode) — реальный режим с границами сегментов по 4 Гб

Операнд (operand) — параметр, передаваемый команде процессора

Описатель носителя (media descriptor) — байт, используемый DOS для идентификации типа носителя (обычно не используется)

Останов (abort) — исключение, происходящее асинхронно

Отложенное вычисление (lazy evaluation) — вычисление, которое выполняется, только если реально требуется его результат

Очередь предвыборки (prefetch queue) — буфер, из которого команды передаются на расшифровку и выполнение

Ошибка (fault) — исключение, происходящее перед вызвавшей его командой

Пиксель (pixel) — минимальный элемент растрового изображения

Повторная входимость (reentrancy) — возможность запуска процедуры из обработчика прерывания, прервавшего выполнение этой же процедуры

Подчиненный сегмент (conforming segment) — сегмент, на который можно передавать управление программам с более низким уровнем привилегий

Прерывание (interrupt) — сигнал от внешнего устройства, приводящий к прерыванию выполнения текущей программы и передаче управления специальной программе-обработчику (см. ловушка)



Разворачивание циклов (loop unrolling) — превращение циклов, выполняющихся известное число раз, в линейный участок кода

Реальный режим (real mode) — режим, в котором процессор ведет себя идентично 8086 — адресация не выше одного мегабайта памяти, размер всех сегментов ограничен и равен 64 Кб, только 16-битный режим

Резидентная программа (resident program) — программа, остающаяся в памяти после возврата управления в DOS

Сегмент (segment) — элемент сегментной адресации в памяти или участок программы для DOS/Windows

Селектор (selector) — число, хранящееся в сегментном регистре

Секция (section) — участок программы для UNIX

Скан-код (scan-code) — любой код, посылаемый клавиатурой

Слово (word) — тип данных, имеющий размер 16 бит

Смещение (offset) — относительный адрес, отсчитываемый от начала сегмента

Стековый кадр (stack frame) — область стека, занимаемая параметрами процедуры, активационной записью и локальными переменными или только локальными переменными

Страничная адресация (pagination) — механизм адресации, в котором линейное адресное пространство разделяется на страницы, которые могут располагаться в разных областях памяти или вообще отсутствовать

Таблица переходов (jumptable) — массив адресов процедур для косвенного перехода на процедуру с известным номером

Шлюз (gate) — структура данных, позволяющая осуществлять передачу управления между разными уровнями привилегий в защищенном режиме


Кодировки второй половины ASCII



Рис. 19. Кодировка IBM

Кодировка по умолчанию для первых компьютеров — этот набор символов хранится в постоянной памяти и используется BIOS (рис. 19).


Рис. 20. Кодировка cp866

Кодировка cp866 используется DOS-приложениями как основная кодировка и компьютерной сетью Fidonet как транспортная кодировка (рис. 20).


Рис. 21. Кодировка KOI8-R (RFC 1489)

Кодировка KOI8-R используется как транспортная кодировка в Internet и как основная кодировка в большинстве бесплатно распространяемых операционных систем (рис. 21).


Рис. 22. Кодировка ISO 8859-5

Кодировка ISO 8859-5 используется как основная в большинстве коммерческих UNIX-совместимых операционных систем (рис. 22).


Рис. 23. Кодировка cp1251

Кодировка cp1251 используется как основная в графических приложениях для Microsoft Windows (рис. 23).



Коды символов расширенного ASCII


Таблица 24. Расширенные ASCII-коды

Клавиша Код Клавиша Код Клавиша Код Клавиша Код Клавиша Код
F1 3Bh Alt-R 13h Shift-F11 87h Alt-Tab A5h Alt-I 17h
F2 3Ch Alt-S 1Fh Shift-F12 88h Ctrl-Tab 94h Alt-J 24h
F3 3Dh Alt-T 14h Alt-0 81h Alt-Del A3h Alt-K 25h
F4 3Eh Alt-U 16h Alt-1 82h Alt-End 9Fh Alt-L 26h
F5 3Fh Alt-V 2Fh Alt-2 83h Alt-Home 97h Ctrl-Right 74h
F6 40h Alt-W 11h Alt-3 84h Alt-Ins A2h Ctrl-End 75h
F7 41h Alt-X 2Dh Alt-4 85h Alt-PgUp 99h Ctrl-Home 77h
F8 42h Alt-Y 15h Alt-5 86h Alt-PgDn A1h Ctrl-PgDn 76h
F9 43h Alt-Z 2Ch Alt-6 87h Alt-Enter 1Ch Ctrl-PgUp 84h
F10 44h Alt-\ 2Bh Alt-7 88h Ctrl-F1 5Eh Alt-Up 98h
F11 85h Alt-, 33h Alt-8 89h Ctrl-F2 5Fh Alt-Down A0h
F12 86h Alt-. 34h Alt-9 8Ah Ctrl-F3 60h Alt-Left 9Bh
Alt-F1 68h Alt-/ 35h AltC 8Bh Ctrl-F4 61h Alt-Right 9Dh
Alt-F2 69h Alt-BS 0Eh Alt-= 8Ch Ctrl-F5 62h Alt-K/ A4h
Alt-F3 6Ah Alt-[ 1Ah NUL 03h Ctrl-F6 63h Ctrl-K* 37h
Alt-F4 6Bh Alt-] 1Bh Shift-Tab 0Fh Ctrl-F7 64h Alt-K- 4Ah
Alt-F5 6Ah Alt-; 27h Ins 52h Ctrl-F8 65h Alt-K+ 4Eh
Alt-F6 6Dh Alt-' 28h Del 53h Ctrl-F9 66h Alt-KEnter A6h
Alt-F7 6Eh Alt-` 29h SysRq 72h Ctrl-F10 67h Ctrl-K/ 95h
Alt-F8 6Fh Shift-F1 54h Down 50h Ctrl-F11 89h Ctrl-K* 96h
Alt-F9 70h Shift-F2 55h Left 4Bh Ctrl-F12 8Ah Ctrl-K- 8Eh
Alt-F10 71h Shift-F3 56h Right 4Dh Alt-A 1Eh Ctrl-K+ 90h
Alt-F11 8Bh Shift-F4 57h Up 48h Alt-B 30h Ctrl-K8 8Dh
Alt-F12 8Ch Shift-F5 58h Enter 4Fh Alt-C 2Eh Ctrl-K5 8Fh
Alt-M 32h Shift-F6 59h Home 47h Alt-D 20h Ctrl-K2 91h
Alt-N 31h Shift-F7 5Ah PgDn 51h Alt-E 12h Ctrl-K0 92h
Alt-O 18h Shift-F8 5Bh PgUp 49h Alt-F 21h Ctrl-K. 93h
Alt-P 19h Shift-F9 5Ch Ctrl-Left 73h Alt-G 22h    
Alt-Q 10h Shift-F10 5Dh Alt-Esc 01h Alt-H 23h    

Префикс «K» соответствует клавишам на цифровой клавиатуре.



Команды процессоров Intel 8088– Pentium II


Таблица 27. Команды

Команда Код 8088
8087
80186 80286
80287
80386
80387
80486 P 5 P 6
AAA 37 8 8 3 4 3 3 NP 1m
AAD i8 D5 ib 60 15 14 19 14 10 NP 3m
AAM i8 D4 ib 83 19 16 17 15 18 NP 4m
AAS 3F 8 7 3 4 3 3 NP 1m
ADC ac,im 14w im 4 4 3 2 1 1 PU 2m
ADC r,im 80sw /2im 4 4 3 2 1 1 PU 2m
ADC m,im 80sw /2im 23+ea 16 7 7 3 3 PU 4m
ADC r,r 10dw /r 3 3 2 2 1 1 PU 2m
ADC m,r 10dw /r 24+ea 10 7 7 3 3 PU 4m
ADC r,m 10dw /r 13+ea 10 7 6 2 2 PU 3m
ADD ac,im 04w im 4 4 3 2 1 1 UV 1m
ADD r,im 80sw /0 im 4 4 3 2 1 1 UV 1m
ADD m,im 80sw /0 im 23+ea 16 7 7 3 3 UV 4m
ADD r,r 00dw /r 3 3 2 2 1 1 UV 1m
ADD m,r 00dw /r 24+ea 10 7 7 3 3 UV 4m
ADD r,m 00dw /r 13+ea 10 7 6 2 2 UV 2m
AND ac,im 24w im 4 4 3 2 1 1 UV 1m
AND r,im 80sw /4 im 4 4 3 2 1 1 UV 1m
AND m,im 80sw /4 im 23+ea 16 7 7 3 3 UV 4m
AND r,r 20dw /r 3 3 2 2 1 1 UV 1m
AND m,r 20dw /r 24+ea 10 7 7 3 3 UV 4m
AND r,m 20dw /r 13+ea 10 7 6 2 2 UV 2m
ARPL r,r 63 /r     10 20 9 7 NP C
ARPL m,r 63 /r     11 21 9 7 NP C
BOUND r,m 62 /r   35 13 10 7 8 NP C
BSF r16,r16 0F BC /r       10+3n 6..42 6..34 NP 2m
BSF r32,r32 0F BC /r       10+3n 6..42 6..42 NP 2m
BSF r16,m16 0F BC /r       10+3n 6..43 6..35 NP 3m
BSF r32,m32 0F BC /r       10+3n 6..43 6..43 NP 3m



Общая информация о скоростях выполнения


Скорости выполнения команд для процессоров 8086 – Р5 даны в тактах (когда говорят, что тактовая частота процессора 100 MHz, это означает, что за секунду проходит 100 миллионов тактов).

Для процессоров Р5 (Pentium, Pentium MMX) помимо скорости указано, может ли команда выполняться одновременно с другими, и если да, то в каком конвейере (см. главу 9.3.2):

UV — может выполняться одновременно, в любом конвейере;

PU — может выполняться одновременно, в U-конвейере;

PV — может выполняться одновременно, в V-конвейере;

FX — может выполняться одновременно с командой FXCH;

NP — не может выполняться одновременно (для ММХ — не может выполняться одновременно с командой того же типа, который указан после буквы «n»).

Для процессоров Р6 (Pentium Pro, Pentium II) указано количество микроопераций, на которые декодируется команда. Буквой «С» отмечены команды со сложным строением (см. главу 9.3.3).

Во всех случаях даны минимально возможные скорости — если шина данных не заблокирована, операнды выровнены по границам двойных слов, операнды находятся в кэше данных, команды по адресу для перехода находятся в кэше кода, переходы угаданы процессором правильно, в момент выполнения команды не происходит заполнения кэша, страницы находятся в TLB (иначе для Р5 следует прибавить 13 – 28 тактов), не происходит исключений в момент выполнения команды, не происходят AGI и т.д.

Операнды обозначаются следующим образом:

im — непосредственный операнд;

i8, i16, i32 — непосредственный операнд указанного размера;

ас — ЕАХ, АХ, AL;

r — любой регистр общего назначения;

r8 — АН, AL, BH, BL, DH, DL, CH, CL;

r16 — АХ, ВХ, СХ, DX, ВР, SP, SI, DI;

r32 — ЕАХ, ЕВХ, ЕСХ, EDX, EBP, ESP, ESI, EDI;

sr — сегментный регистр;

m — операнд в памяти;

mm — регистр ММХ;

s0 — регистр ST(0);

si — регистр ST(i).

Для команд условных переходов приводятся два значения скорости выполнения — если переход произошел и если нет.

Другие используемые сокращения:

РМ — защищенный режим;

RM — реальный режим;

VM — режим V86;

TS — переключение задачи;

CG — шлюз вызова;

TG — шлюз задачи;

/in — увеличение привилегий;

/out — уменьшение привилегий;

/NT — переход во вложенную задачу.

Время переключения задачи:

Pentium: TS = 85 при переключении в 32-битный и 16-битный TSS и 71 при переключении в V86 TSS;

80486: TS = 199 при переключении в 32-битный и 16-битный TSS и 177 при переключении в V86 TSS;

80386: TS = 307 – 314 при переключении в 32-битный и 16-битный TSS и 224 – 231 при переключении в V86;

80286: JS = 280.


Общий формат команды процессора Intel


Команда может содержать до шести полей:

Префиксы— от нуля до четырех однобайтных префиксов.

Код — один или два байта, определяющие команду.

ModR/M — 1 байт (если он требуется), описывающий операнды:

биты 7 – 6: поле MOD — режим адресации;

биты 5 – 3: поле R/O — либо указывает регистр, либо является продолжением кода команды;

биты 2 – 0: поле R/M — либо указывает регистр, либо совместно с MOD - режим адресации.

SIB — 1 байт, если он требуется (расширение ModR/M для 32-битной адресации):

биты 7 – 6: S — коэффициент масштабирования;

биты 5 – 3: I — индексный регистр;

биты 2 – 0: В — регистр базы.

Смещение — 0, 1, 2 или 4 байта.

Непосредственный операнд — 0, 1, 2 или 4 байта — будем использовать /ib и /iw для указания этих операндов.



Префиксы


Все префиксы выполняются за 1 такт и имеют размер 1 байт:

F0h: LOCK

F2h: REPNE/REPNZ

F3h: REP/REPE/REPZ

2Eh: CS:

36h: SS:

3Eh: DS:

26h: ES:

64h: FS:

65h: GS:

66h: OS

67h: AS



В этом приложении приведены скорости


В этом приложении приведены скорости выполнения всех команд процессоров Intel от 8086 до Pentium II и машинные коды, которые им соответствуют.


Символы ASCII


Номера строк соответствуют первой цифре в шестнадцатеричном коде символа, номера столбцов — второй, так что, например, код большой латинской буквы A — 41h (см. рис. 18).


Рис. 18. Таблица символов ASCII



Скан-коды клавиатуры


Таблица 25. Скан-коды

Клавиша Код Клавиша Код Клавиша Код Клавиша Код
Esc 01h Enter 1Ch K* 37h Ins 52h
1 ! 02h Ctrl 1Dh Alt 38h Del 53h
2 @ 03h A 1Eh SP 39h SysRq 54h
3 # 04h S 1Fh Caps 3Ah Macro 56h
4 $ 05h D 20h F1 3Bh F11 57h
5 % 06h F 21h F2 3Ch F12 58h
6 ^ 07h G 22h F3 3Dh PA1 5Ah
7 & 08h H 23h F4 3Eh F13/LWin 5Bh
8 * 09h J 24h F5 3Fh F14/RWin 5Ch
9 ( 0Ah K 25h F6 40h F15/Menu 5Dh
0 ) 0Bh L 26h F7 41h F16 63h
- _ 0Ch ; : 27h F8 42h F17 64h
= + 0Dh ' " 28h F9 43h F18 65h
BS 0Eh ` ~ 29h F10 44h F19 66h
Tab 0Fh LShift 2Ah Num 45h F20 67h
Q 10h \ | 2Bh Scroll 46h F21 68h
W 11h Z 2Ch Home 47h F22 69h
E 12h X 2Dh - 48h F23 6Ah
R 13h C 3Eh PgUp 49h F24 6Bh
T 14h V 2Fh K- 4Ah EraseEOF 6Dh
Y 15h B 30h   4Bh Copy/Play 6Fh
U 16h N 31h K5 4Ch CrSel 72h
I 17h M 32h ® 4Dh Delta 73h
O 18h , < 33h K+ 4Eh ExSel 74h
P 19h . > 34h End 4Fh Clear 76h
[ { 1Ah / ? 35h I 50h    
] } 1Bh RShift 36h PgDn 51h    

Префикс «K» соответствует клавишам на цифровой клавиатуре.

Таблица 26. Служебные скан-коды

Код Функция Код Функция
00h Буфер клавиатуры переполнен FAh ACK
AAh Самотестирование закончено FCh Ошибка самотестирования
E0h Префикс для серых клавиш FDh Ошибка самотестирования
E1h Префикс для клавиш без кода отпускания FEh RESEND
F0h Префикс отпускания клавиши FFh Ошибка клавиатуры
EEh Эхо    



Список используемых сокращений


ABI — Application Binary Interface — интерфейс для приложений на низком уровне

AGI — Address Generation Interlock — задержка для генерации адреса

AMIS — Alternative Multiplex Interrupt Specification — спецификация альтернативного мультиплексорного прерывания

API — Application Program Interface — интерфейс между приложением и программой

ASCII — American Standard Code for Information Interchange — американский стандартный код для обмена информацией

AT&T — American Telephone and Telegraph — американский телефон и телеграф (компания, которой принадлежала торговая марка UNIX)

BCD — Binary Coded Decimal — двоично-десятичный формат

BIOS — Basic Input/Output System — основная система ввода-вывода

BIT — BInary digiT — двоичная цифра

BPB — BIOS Parameter Block — блок параметров BIOS (для блочных устройств)

BRM — Big Real Mode — большой реальный режим (то же, что и нереальный режим)

BSD — Berkeley System Distribution — один из основных видов UNIX-систем

BSS — Block, Started by Symbol — участок программы, содержащий неинициализированные данные

CMOS — Complementary Metal Oxide Semiconductor — комплементарные металлооксидные пары

COFF — Common Object File Format — общий формат объектных файлов

CPL — Current Privilege Level — текущий уровень привилегий

CRT — Cathode Ray Tube — электронно-лучевая трубка

DAC — Digital to Analog Converter — цифро-аналоговый преобразователь

DDK — Drivers Development Kit — набор для создания драйверов

DLL — Dynamically Linked Library — динамическая библиотека

DMA — Direct Memory Access — прямой доступ к памяти


DOS — Disk Operating System — дисковая операционная система

DPL — Descriptor Privilege Level — уровень привилегий дескриптора

DPMI — DOS Protected Mode Interface — интерфейс для защищенного режима в DOS

DSP — Digital Signal Processor — процессор для оцифрованного звука в звуковых картах

DTA — Disk Transfer Area — область передачи дисковых данных (в DOS)

ELF — Executable and Linking Format — формат исполнимых и компонуемых файлов

EMS — Expanded Memory Specification — спецификация доступа к дополнительной памяти

ЕРВ — Execution Program Block — блок информации об исполняемой программе

FAT — File Allocation Table — таблица распределения файлов

FCR — FIFO control register — регистр управления FIFO

FIFO — First In First Out — первый вошел — первый вышел (очередь)

FM — Frequency Modulation — частотный синтез

FPU — Floating Point Unit — блок для работы с числами с плавающей запятой

GDT — Global Descriptor Table — глобальная таблица дескрипторов

HCI — Human Computer Interface — интерфейс между пользователем и программой

HMA — High Memory Area — верхняя область памяти (64 Кб после первого мегабайта)

IBM — International Business Machines — название компании

ICW — Initialization Control Word — управляющее слово инициализации

IDE — Integrated Drive Electronics — один из интерфейсов для жестких дисков

IDT — Interrupt Descriptor Table — таблица дескрипторов обработчиков прерываний

IER — Interrupt Enable Register — регистр разрешения прерываний

IOCTL — Input/Output Contorl — управление вводом-выводом



IOPL — Input/Output Privilege Level — уровень привилегий ввода-вывода

IRQ — Interrupt Request — запрос на прерывание (от внешнего устройства)

ISP — Interrupt Sharing Protocol — протокол разделения прерываний

LCR — Line Control Register — регистр управления линией

LDT — Local Descritor Table — таблица локальных дескрипторов

LE — Linear Executable — линейный исполнимый формат

LFN — Long File Name — длинное имя файла

LSR — Line Status Register — регистр состояния линии

MASM — Macro Assembler — макроассемблер (ассемблер компании Microsoft)

MCR — Modem Control Register — регистр управления модемом

ММХ — Multimedia Extention — расширение для работы с мультимедийными приложениями

MSR — Modem State Register — регистр состояния модема

MSR — Machine Specific Register — машинно-специфичный регистр

NE — New Executable — новый исполнимый формат

NPX — Numerical Processor Extention — расширение для работы с числами с плавающей запятой

OCW — Operation Control Word — управляющее слово (для контроллера прерываний)

РЕ — Portable Executable — переносимый исполнимый формат

POST — Power On Self Test — самотестирование при включении

PSP — Program Segment Prefix — префикс программного сегмента

RBR — Reciever Buffer Register — регистр буфера приемника

RFC — Request For Comments — запрос для комментария (форма публикации документов в Internet, включая стандарты)

RFM — Real Flat Mode — реальный flat-режим (то же, что и нереальный режим)

RTC — Real Time Clock — часы реального времени



RPL — Requestor Privilege Level — запрашиваемый уровень привилегий

RPN — Reverse Polish Notation — обратная польская запись (для арифметических выражений)

SCSI — Small Computer System Interface — один из интерфейсов для жестких дисков

SUN — Stanford University Networks — название компании

SVGA — Super VGA — любой видеоадаптер, способный на режимы, большие 13h

TASM — Turbo Assembler — турбоассемблер (ассемблер компании Borland)

THR — Transmitter Holding Register — регистр хранения передатчика

TSR — Terminate and Stay Resident — завершиться и остаться резидентным

TSS — Task State Segment — сегмент состояния задачи

UMB — Upper Memory Block — блок верхней памяти (между границами 640 Кб и 1 Мб)

VBE — VESA BIOS Extention — спецификация VESA для расширения BIOS

VCPI — Virtual Control Program Interface — один из интерфейсов к защищенному режиму для DOS

VESA — Video Electronics Standard Association — Ассоциация по стандартизации видео в электронике

VGA — Video Graphics Array — основной тип видеоадаптеров

VxD — Virtual X Device — виртуальное устройство Х (общее название виртуальных драйверов в Windows 95)

WASM — Watcom Assembler — ассемблер компании Watcom

XMS — Extended Memory Specification — спецификация доступа к расширенной памяти


Управляющие символы ASCII


Таблица 23. Управляющие символы ASCII

Код Имя Ctrl-код Назначение
00 NUL ^@ Пусто (конец строки)
01 SOH ^A Начало заголовка
02 STX ^B Начало текста
03 EOT ^C Конец текста
04 ENQ ^D Конец передачи
06 ACK ^F Подтверждение
07 BEL ^G Звонок
08 BS ^H Шаг назад
09 HT ^I Горизонтальная табуляция
0A LF ^J Перевод строки
0B VT ^K Вертикальная табуляция
0C FF ^L Перевод страницы
0D CR ^M Возврат каретки
0E SO ^N Выдвинуть
0F SI ^O Сдвинуть
10 DLE ^P Оставить канал данных
11 DC1/XON ^Q Управление устройством 1
12 DC2 ^R Управление устройством 2
13 DC3/XOFF ^S Управление устройством 3
14 DC4 ^T Управление устройством 4
15 NAK ^U Отрицательное подтверждение
16 SYN ^V Синхронизация
17 ETB ^W Конец блока передачи
18 CAN ^X Отмена
19 EM ^Y Конец носителя
1A SUB ^Z Замена
1B ESC ^[ Escape
1C FS ^\ Разделитель файлов
1D GS ^] Разделитель групп
1E RS ^^ Разделитель записей
1F US ^_ Разделитель полей
20 SP   Пробел
7F DEL ^? Удаление



Значения полей кода команды


В кодах некоторых команд мы будем встречать специальные биты и группы бит, которые обозначим w, s, d, reg, sreg и cond:

w = 0, если команда работает с байтами;

w = 1, если команда работает со словами или двойными словами;

s = 0, если непосредственный операнд указан полностью;

s = 1, если непосредственный операнд — младший байт большего операнда и должен рассматриваться как число со знаком;

d = 0, если код источника находится в поле R/O, а приемника — в R/M;

d = 1, если код источника находится в поле R/M, а приемника — в R/O.

Запись 10dw будет означать, что код команды — 000100dw.

Поле reg определяет используемый регистр и имеет длину 3 бита:

000 — AL/AX/EAX/ST(0)/MM0

001 — CL/CX/ECX/ST(1)/MM1

010 — DL/DX/EDX/ST(2)/MM2

011 — BL/BX/EBX/ST(3)/MM3

100 — AH/SP/ESP/ST(4)/MM4

101 — CH/BP/EBP/ST(5)/MM5

110 — DH/SI/ESI/ST(6)/MM6

111 — BH/DI/EDI/ST(7)/MM7

Запись C8r будет означать 11001reg.

Поле sreg определяет используемый сегментный регистр:

000 — ES

001 — CS

010 — SS

011 — DS

100 — FS

110 — GS

Поле cond определяет условие для команд Jcc, CMOVcc, SETcc, FCMOVcc.

Его значения для разных команд:

0000 — О

0001 — NO

0010 — C/B/NAE

0011 — NC/NB/AE

0100 — E/Z

0101 — NE/NZ

0110 — BE/NA

0111 — NBE/A

1000 — S

1001 — NS

1010 — Р/РЕ

1011 — NP/PO

1100 — L/NGE

1101 — NL/GE

1110 — LE/NG

1111 — LNE/G

Запись типа 4сс будет означать 0100cond.



Значения поля ModRM


Поле R/O (биты 5– 3) содержит либо дополнительные три бита кода команды, либо код операнда, который может быть только регистром. Будем обозначать второй случай reg, а в первом записывать используемые биты.

Поля MOD (биты 7 – 6) и R/M (биты 3 – 0) определяют операнд, который может быть как регистром, так и переменной в памяти:

MOD = 11, если используется регистровая адресация и R/M содержит код регистра reg;

MOD = 00, если используется адресация без смещения ([ВХ + SI] или [EDX]);

MOD = 01, если используется адресация с 8-битным смещением (variable[BX + SI]);

MOD = 10, если используется адресация с 16- или 32-битным смещением.

Значение поля R/M различно в 16- и 32-битных режимах.

R/M в 16-битном режиме:

000 — [ВХ + SI]

001 — [ВХ + DI]

010 — [BP + SI]

011 — [ВР + DI]

100 — [SI]

101 — [DI]

110 — [ВР] (кроме MOD = 00 — в этом случае после ModR/M располагается 16-битное смещение, то есть используется прямая адресация)

111 — [ВХ]

R/M в 32-битном режиме:

000 — [ЕАХ]

001 — [ЕСХ]

010 — [EDX]

011 — [ЕВХ]

100 — используется SIB

101 — [ЕВР] (кроме MOD = 00 — в этом случае используется SIB, после которого располагается 32-битное смещение)

110 — [ESI]

111 — [EDI]



Значения поля SIB


Значение поля S:

00 — не используется;

01 — умножение на 2;

10 — умножение на 4;

11 — умножение на 8;

Значения полей I и В:

(I — регистр, используемый в качестве индекса, то есть умножающийся на S, В — регистр базы, который не умножается)

000 — ЕАХ

001 — ЕСХ

010 — EDX

011 — ЕВХ

100 — для I — индекса нет
   для В — ESP

101 — для I — ЕВР
   для В — ЕВР, только если MOD = 01 или 10, если MOD = 00 — базы нет

110 — ESI

111 — EDI

Поля ModR/M и SIB будут записываться как /r, если поле R/O содержит код регистра, или /0 – /7, если поле R/O содержит дополнительные три бита кода команды. В других случаях поля ModR/M и SIB отсутствуют только у команд без операндов, так что они не будут обозначаться дополнительно.