Книги, научные публикации Pages:     | 1 |   ...   | 6 | 7 | 8 |

Зубков С. В. ...

-- [ Страница 8 ] --

при дальних JMP, CALL, RET на подчиненный сегмент кода должно выпол няться условие: CPL DPL. При этом CPL не изменяется;

при дальнем CALL на шлюз вызова должны выполняться условия: CPL < DPL шлюза, RPL DPL шлюза, CPL DPL сегмента;

при дальнем JMP на шлюз вызова должны выполняться условия: CPL DPL шлюза, RPL DPL шлюза, CPL > DPL сегмента, если он подчиненный, CPL DPL сегмента, если он неподчиненный.

При вызове процедуры через шлюз на неподчиненный сегмент кода с другим уровнем привилегий процессор выполняет переключение стека. В сегменте TSS текущей задачи всегда хранятся значения для стеков уровней привиле гий О, 1 и 2 (но не стек для уровня привилегий 3, потому что нельзя передачу управления на уровень 3, кроме как при помощи команд RET/IRET).

При переключении стека в новый стек помещаются, до обратного адреса, пара метры (их число указано в дескрипторе шлюза вызова), флаги или код ошибки (в случае INT), старые значения SS:ESP, которые команда RET/IRET использует для обратного переключения. То, что надо выполнить возврат из процедуры, RET определяет так: RPL селектора, оставленного в стеке, больше (менее привилеги рованный), чем CPL.

Даже если операционная система не поддерживает многозадачность, она дол жна оформить сегмент TSS с действительными для стеков всех уровней, если она собирается использовать уровни привилегий.

10.7.4. Выполнение привилегированных команд 1. Команды LGDT, LLDT, LTR, MOV LMSW, MOV DRn, INVLPG, HLT, RDMSR, WRMSR, RDPMC, RDTS'C, SYSEXIT могут выполняться, только если CPL = 0 (хотя биты РСЕ и TSD сегмента CR4 разрешают использование команд RDPMC и RDTSC с любо го уровня).

2. Команды LLDT, SLDT, STR, LSL, LAR, VERR, и ARPL можно выполнять только в защищенном режиме - в реальном и V86 возникает ис ключение #UD.

3. Команды CLI и STI выполняются, только если CPL IOPL (IOPL - это двух битная область в регистре флагов). Если установлен бит PVI в регистре CR4, эти команды выполняются с любым CPL, но управляют флагом VIE а не IE 4. Команды IN, OUT, OUTSB, OUTSW, OUTSD выпол няются, только если CPL IOPL и если бит в битовой карте соответствующий данному порту, равен нулю. (Эта карта - поле в сегменте TSS, каждый бит которого отвечает за один порт ввода-вывода.

Признаком ее конца служит слово, в котором все 16 бит установлены в 1.), Защита на уровне страниц Обращение к странице памяти с битом U в атрибуте страницы или таблицы страниц, равным нулю, приводит к исключению #PF, если CPL = 3.

2. Попытка записи в страницу с битом W в атрибуте страницы или страниц, равным нулю, с CPL = 3 приводит к исключению #РЕ 3. Попытка записи в страницу с битом W в атрибуте страницы или таблицы страниц, равным нулю, если бит WP в регистре CRO равен приводит к ис ключению #РЕ 10.8. Управление задачами Следующий очень важный механизм, действующий только в защищенном ре жиме, - многозадачность. Задача - это элемент которую процессор мо жет исполнять, запустить или отложить. Задачи используют для выполнения про грамм, процессов, обработчиков прерываний и исключений, ядра операционной системы и пр. Любая программа, выполняющаяся в защищенном режиме, должна осуществляться как задача (хотя мы пока игнорировали это требование). Процес сор предоставляет средства для сохранения состояния задачи, запуска задачи и пе редачи управления из одной задачи в другую.

Задача состоит из сегмента состояния задачи (TSS), сегмента кода, одного или нескольких (для разных уровней привилегий) сегментов стека и одного или не скольких сегментов данных. Она определяется селектором своего сегмента TSS.

Когда задача выполняется, ее селектор TSS (вместе с дескриптором в скрытой части) загружен в регистр TR процессора.

Запуск задачи осуществляется при помощи команды GALL или JMP на сег мент TSS или на шлюз задачи, а также при запуске обработчика прерывания или исключения, который описан как задачи. При этом автоматически осуще ствляется переключение задач. Состояние текущей задачи записывается в ее TSS, состояние вызываемой задачи считывается из ее TSS, и управление передается на новые CS:EIP. Если задача не была запущена командой JMP, селектор сегмента TSS старой задачи сохраняется в TSS новой и устанавливается флаг NT, так что следующая команда IRET выполнит обратное переключение задач.

Задача не может вызываться рекурсивно. В дескрипторе которая была запущена, но не была завершена, тип изменяется на занятый и пере ход на такой TSS невозможен.

Задача может иметь собственную таблицу дескрипторов (LDT) и полный ком плект собственных таблиц страниц, так как регистры LDTR и CR3 входят в со стояние задачи.

10.8.1. Сегмент состояния задачи Сегмент состояния задачи (TSS) - это структура данных, в которой ется вся информация о задаче, если ее выполнение временно прерывается.

Процессоры в защищенном режиме TSS имеет следующую 4 байта - селектор предыдущей задачи (старшее слово содержит нули здесь и для всех остальных селекторов) 4 байта - ESP для CPL = О 4 байта - SS для CPL = О 4 байта - ESP для = 4 байта - SS для CPL = +14h: + 4 байта - SS для CPL +24h: 4 байта - EFLAGS +28h:

4 байта - ЕСХ 4 байта - EDX +38h: 4 байта - EBP 4 байта - ESI +44h: 4 байта - ES +4Ch: 4 байта - CS 4 байта - SS 4 байта - DS 4 байта - FS 4 байта - GS +60h: 4 байта - LDTR 2 байта - слово флагов задачи бит 0 - флаг Т: вызывает #DB при переключении на задачу остальные биты не определены и равны нулю 2 байта - адрес битовой карты ввода-вывода. Это 16-битное смещение от начала TSS, по которому начинается битовая карта разрешения ввода-вывода (см. разделы 10.7.4 и 10.9.2) и заканчивается бито вая карта перенаправления прерываний (см. раздел 10.9.1) дан ной задачи.

TSS является полноценным сегментом и описывается сегментным дескрипто ром, формат которого мы рассматривали раньше (см. раздел 10.4.3). Кроме того, лимит TSS не может быть меньше Ч обращение к такому дескриптору приво дит к исключению #TS. Размер TSS может быть больше, если в него входят бито вые карты ввода-вывода и перенаправления прерываний и если операционная система хранит в нем дополнительную информацию. Дескриптор TSS способен находиться только в GDT - попытка загрузить его из LDT вызывает исключение #GP. Для передачи управления задачам удобнее использовать дескрипторы шлю за задачи, которые можно помещать как в GDT, так и в LDT или IDT.

Управление задачами 70.8.2. Переключение задач Переключение задач осуществляется, если:

текущая задача выполняет дальний JMP или CALL на шлюз задачи или пря мо на текущая задача выполняет если флаг NT равен 1;

происходит прерывание или исключение, в качестве обработчика которо го в IDT записан шлюз задачи.

При переключении процессор выполняет следующие действия:

Для команд CALL и JMP проверяет привилегии (CPL текущей задачи и RPL селектора новой задачи не могут быть больше, чем DPL шлюза или TSS, на который передается управление).

2. Проверяется дескриптор TSS (его бит присутствия и лимит).

3. Проверяется, что новый TSS, старый TSS и все дескрипторы сегментов на ходятся в страницах, отмеченных как присутствующие.

4. Сохраняется состояние задачи.

5. Загружается регистр TR. Если на следующих шагах происходит исключе ние, его обработчику придется доделывать переключение задач, вместо того чтобы повторять ошибочную команду.

6. Тип новой задачи в дескрипторе изменяется на занятый, и флаг TS устанав ливается в CRO.

7. Загружается состояние задачи из нового TSS: LDTR, CR3, EFLAGS, EIP, ре гистры общего назначения и сегментные регистры.

Если переключение задачи вызывается командами JUMP, CALL, прерывани ем или исключением, селектор TSS предыдущей задачи записывается в поле свя зи новой задачи и устанавливается флаг NT. Если флаг NT установлен, команда IRET выполняет обратное переключение задач.

При любом запуске задачи ее тип изменяется в дескрипторе на занятый. По пытка вызвать такую задачу приводит к #GP. Сделать задачу снова свободной можно, только завершив ее командой IRET или переключившись на другую зада чу командой JMP.

На следующем примере покажем, как создавать задачи и переключаться меж ду ними.

Пример программы, выполняющей переключение задач.

Запускает две задачи, управление друг другу 80 раз, задачи на экран символы ASCII с небольшой задержкой.

/x / form DOS Процессоры inte! в защищенном Х.

ml /с link segment para public "CODE" use assume start:

;

Подготовить сегментные регистры.

push PM_seg pop ds Проверить, не находимся ли мы уже test jz no_V ;

Сообщить и выйти.

mov push ' cs pop ds mov int mov int 21h Убедиться, что мы не под Windows.

no_V86:

mov int 2Fh test jz ;

Сообщить и выйти.

mov offset win_msg short ;

Сообщения об ошибках при старте.

db "Процессор в режиме V86 - нельзя переключиться в db "Программа запущена под Windows - нельзя перейти в кольцо ;

Итак, мы точно находимся в реальном режиме.

no_windows:

Очистить экран.

mov int Юл ;

Вычислить базы для всех дескрипторов сегментов данных.

mov mov word ptr mov byte ' shl mov word mov word ptr mov byte ptr mov byte ptr ;

Вычислить линейный адрес xor mov shl push eax add ptr Загрузить fword ptr gdtr ;

Вычислить линейные адреса сегментов TSS наших двух pop eax push eax add TSS_ mov word ptr shr mov byte ptr pop eax add set mov word ptr shr mov byte ptr ;

Открыть А20.

mov out ;

Запретить прерывания.

;

Запретить in al,70h or out ;

Переключиться в mov or al, mov ;

Загрузить CS.

db 66h db OEAh dd offset dw ;

Переключиться в реальный режим RM.

mov 2 Процессоры в защищенном режиме and ;

Сбросить очередь и загрузить CS.

db $+ dw Настроить сегментные регистры для реального режима.

mov mov mov mov mov bx,stack_l mov mov ;

Разрешить and al,07FH out 70h,al ;

Разрешить прерывания.

sti Завершить программу.

mov int 21h ends segment public "CODE" use ;

Таблица глобальных label byte db 8 dup(O) GDT_flatDS db OFFh, db GDT_32bitCS db GOT_32bitSS db 11001111b, ;

Сегмент TSS задачи О (32-битный свободный TSS).

db ;

Сегмент TSS задачи 1 (32-битный свободный TSS).

GDT_TSS1 db gdt_size = $-GDT dw. Размер dd ? Адрес ;

Используемые селекторы.

equ SEL_16bitCS equ SEL_32bitCS equ equ SEL_TSSO equ ' SEL_TSS1 equ 110000b задачами Сегмент будет инициализирован, как только мы выполним переключение из нашей основной задачи. Конечно, если бы мы собирались использовать ;

несколько уровней то нужно было бы инициализировать стеки.

do dup(O) Сегмент TSS_1. В него будет выполняться переключение, поэтому надо инициализировать все, что может TSSJ dd 0,0,0,0,0,0,0,0 Связь, стеки, CR dd offset ;

;

Регистры общего назначения.

dd (ESP и Сегментные регистры.

dd dd dd 0 ;

Адрес таблицы ввода вывода.

;

Точка входа в 32-битный режим.

Подготовить регистры.

mov mov mov mov mov Загрузить TSS задачи О в регистр mov ax теперь наша программа выполнила все требования к переходу в защищенный режим.

хог mov ;

- адрес начала экрана.

mov byte ptr Вывести символ AL на экран.

;

Дальний переход на TSS задачи 1..

db OEAh dd SEL_TSS add - адрес следующего ;

символа.

inc AL - код следующего cmp ;

Если это 80, jb task_0 ;

выйти из цикла.

Дальний переход на процедуру выхода в реальный db OEAh dd offset dw SEL 16bitCS Процессоры в защищенном Задача mov byte ds:[edi],al Вывести символ на экран.

inc Увеличить код символа.

add Увеличить адрес символа.

;

Переключиться на задачу 0.

db dd SEL_TSSO ;

Сюда будет приходить управление, когда задача 0 начнет выполнять переход на задачу 1 во всех случаях, кроме первого.

mov ;

Небольшая пауза, зависящая от скорости loop $ ;

task_ ends stack_seg segment para stack "STACK" db 100h dup(?) ;

Стек задачи stack_l = $-stack_start db 100h dup(?) ;

Стек задачи 1.

stack_12 = $-stack_start stack_seg ends end start Чтобы реализовать многозадачность в реальном времени на нашем примере, достаточно создать обработчик прерывания системного таймера IRQO в виде от дельной (третьей) задачи и поместить в ЮТ шлюз этой задачи. Текст обработчи ка для нашего примера мог быть крайне простым:

;

Это отдельная задача - не нужно сохранять регистры!

mov out 20h,al jmp task_ mov out jmp jmp task Но при вызове обработчика прерывания старая задача помечается как занятая в GDT и повторный JMP на нее приведет к ошибке. Вызов задачи обработчика прерывания, так же как и вызов задачи командой CALL, подразумевает, она завершится командой IRET. Именно команду IRET проще всего вызвать для пе редачи управления из такого обработчика - достаточно лишь подменить селек тор вызвавшей нас задачи в поле связи и выполнить IRET.

;

При инициализации DS должен быть установлен на mov out 20h,al mov word ptr iret mov Режим out word ptr Х Единственное дополнительное изменение, которое нужно внести, - инициали зировать дескриптор TSS задачи task_l как уже занятый, поскольку управление на него будет передаваться командой IRET, что, впрочем, не вызывает никаких проблем.

Помните, что во вложенных задачах команда IRET не означает конца програм мы - следующий вызов задачи всегда передает управление на очередную коман ду после IRET.

10.9. Режим виртуального Режим V86 - это исполняющаяся в защищенном режиме, в которой флаг VM регистра EFLAGS равен единице. Внутри задачи процессор ведет себя так, как если бы он находился в реальном режиме, за исключением того, что пре рывания и исключения передаются обработчикам защищенного режима вне ее (кроме случая, когда используется карта перенаправления прерываний).

Программы могут изменить флаг VM. Его допускается указать, только за писав образ EFLAGS с установленным VM при создании TSS новой задачи и за тем переключившись на нее. Кроме этой задачи для нормальной реализации V требуется монитор режима (VMM) - модуль, который выполняется с CPL = О и обрабатывает прерывания, исключения и обращения к портам ввода-вывода из задачи V86, осуществляя фактически эмуляцию всего компьютера.

Чтобы выполнять в системе сразу несколько применяется странич ная адресация. Каждая использует ровно один мегабайт линейного ад ресного пространства, который можно отобразить на любую область физического.

Процессор переключается в V86 в трех ситуациях:

при переключении в задачу, TSS которой содержит установленный флаг при выполнении команды IRET, если NT = 0 и копия EFLAGS в стеке жит установленный флаг VM;

при выполнении команды IRET, если NT = 1 и копия EFLAGS в TSS содер жит установленный флаг VM.

Прерывания в V Если происходит прерывание или исключение в режиме V86, процессор ана лизирует биты IOPL регистра флагов, бит VME регистра CR4 (Pentium и выше) и соответствующий бит из карты перенаправления прерываний данной задачи (только если VME 1).

Эта карта - 32-байтное поле, находящееся в регистре TSS данной задачи, на пер вый байт за концом которой указывает смещение в TSS по адресу из 256 бит этого поля соответствует одному номеру прерывания. Если он уста новлен в 1, прерывание должно подготавливаться обработчиком из IDT в щенном режиме, если он 0 - то 16-битным обработчиком из реального режима.

защищенном режиме Если 0, прерывание обрабатывается (через IDT) при условии, что IOPL 3, иначе вызывается исключение #GP.

Если бит = 1 и IOPL 3, обработка прерывания определяется битом из битовой карты перенаправления прерываний.

Если 1, IOPL < 3 и бит в битовой карте равен единице, вызывается обработчик из ШТ.

Если = 1, IOPL < 3 и бит в битовой карте равен нулю, происходит следу ющее:

если VIF = 0 или если VIF = но произошло исключение или NMI - вызы вается обработчик из реального режима;

если VIF 1 и произошло аппаратное прерывание - вызывается обработчик #GP из защищенного режима, который должен обработать прерывание, установить VIP в копии EFLAGS в стеке и вернуться в. если VIP = 1 и VIF = 0 из-за выполненной в V86 команды CLI - вызывается обработчик #GP из реального режима, который должен обнулить VIF и VIP в копии EFLAGS в стеке.

Бит VIF - это флаг для облегчения поддержки команд CLI и STI в задачах V86.

Если в регистре CR4 установлен бит команды CLI/STI изменяют значение именно этого флага, оставляя IF нетронутым для того, чтобы операционная сис тема могла обрабатывать прерывания и управлять другими задачами.

При вызове обработчика, находящегося в защищенном режиме, из реального режима в стек нулевого уровня привилегий помещаются GS, DS, ES, SS, EFLAGS, CS, EIP и код ошибки для некоторых исключений в этом порядке, а фла ги TF и IF обнуляются, если вызывается шлюз прерывания.

10.9.2. Ввод-вывод в V В режиме V86 текущий уровень CPL, всегда равен трем. В со ответствии с правилами защиты выполнение команд CLI, STI, PUSHF, POPF, INT и IRET приводит к исключению #GP, если IOPL < 3. Однако команды IN, OUT, INS, OUTS, чувствительные к IOPL в защищенном режиме, в V86 управ ляются битовой картой ввода-вывода, расположенной в TSS задачи. Если бит, соответствующий порту, установлен в 1, обращение к нему из при водит к исключению #GP;

если бит сброшен - команды работы с портами вво да-вывода выполняются.

не будем рассматривать пример программы, реализующей режим V86, из за его размеров. Практически все из того, что необходимо для (за щищенный режим, обработка прерываний, страничная адресация и переключение задач), мы уже обсудили.

на в среде UNIX Операционная система MS DOS, получившая дальнейшее развитие в виде Windows, долгое время была практически единственной ОС для персональных компьютеров на базе процессоров Intel. Но с течением времени мощность процес соров выросла настолько, что для них стало возможным работать под управлением операционных систем класса UNIX, использовавшихся обычно на более мощных компьютерах других компаний. В настоящее время существует свыше двадцати операционных систем для Intel, представляющих те или иные диалекты UNIX.

Мы рассмотрим самые популярные из них:

Linux бесплатно распространяемая операционная система, соединяющая в себе особенности двух основных типов UNIX-систем (System V и BSD) приблизительно в равной мере. В ней много отличий и отступлений от лю бых стандартов, принятых для UNIX, но они более эффективны;

FreeBSD - бесплатно распространяемая операционная система, представля ющая вариант BSD UNIX. Считается наиболее стабильной из UNIX-систем для Intel;

Solaris/x86 - коммерческая операционная система компании Sun Micro systems, представляющая вариант System V UNIX, изначально созданная для компьютеров Sun, существует в версии для Intel 80x86. Распространяется бесплатно с образовательными целями.

Несмотря на то что при программировании для UNIX обычно употребляется исключительно язык С, пользоваться ассемблером в этих системах можно, и очень просто. Программы в UNIX выполняются в защищенном режиме с лью памяти flat и могут вызывать любые функции из библиотеки или других библиотек точно так же, как это делают программы на С. Конечно, круг задач, для которых имеет смысл ассемблер в UNIX, ограничен. Если вы не за нимаетесь разработкой ядра операционной системы или, например, эмулятора DOS, практически все можно сделать и на С, но иногда нужно создать что-то осо бенное. Написать процедуру, выполняющую что-то как можно быстрее (напри мер, воспроизведение звука из файла в формате МРЗ), или программу, использу ющую память более эффективно (хотя это часто можно повторить на С), или программу, применяющую возможности нового процессора, поддержка которого еще не добавлена в компилятор, оказывается очень просто (если вы знаете ассем блер для в среде 11.1. Синтаксис AT&T Проблема в том, что ассемблер для UNIX кардинально отличается от того, что рассматривалось в этой книге до сих пор. В то время как основные ассемблеры для MS DOS и Windows используют синтаксис, предложенный компанией Intel, изобилующий неоднозначностями, часть которых решается за счет использова ния поясняющих операторов типа byte word ptr или dword ptr, а не ре шается вообще (все те случаи, когда приходится указывать код команды вруч ную), в UNIX с самого начала используется вариант универсального синтаксиса AT&T, синтаксис SysV/386, который специально создавался с целью устранения неоднозначностей в толковании команд. Вообще говоря, существует и ассемблер для использующий АТ&Т-синтаксис, - это gas, входящий в набор средств разработки DJGPP, а также ассемблер, использующий Intel-синтаксис и способный создавать объектные файлы в формате ELF, применяемом в большин стве UNIX-систем, - это бесплатно распространяемый в Internet ассемблер Мы будем рассматривать только ассемблеры, непосредственно входящие в состав операционных систем, то есть те, которые вызываются стандартной командой as.

77.7.7. Основные правила Итак, в ассемблере AT&T в качестве допустимых символов текста программы рассматриваются только латинские буквы, цифры и символы % (процент) $ (дол лар), * (звездочка) (запятая) и (подчеркивание). Помимо них суще ствуют символы начала комментария, отличающиеся для разных ассемблеров и для комментария размером в целую строку или правую часть строки. Любые другие символы, кроме кавычек, двоеточия, пробела и табуляции, если они не часть комментария или не заключены в кавычки, считаются ошибочными.

Если последовательность допустимых строки не начинается со спе циального символа или цифры и не заканчивается двоеточием - это команда про цессора:

// Остановить Когда последовательность допустимых символов начинается с символа % это название регистра процессора:

// Поместить в стек содержимое регистра ЕАХ.

%eax Если последовательность начинается с символа $ - это непосредственный опе ранд:

// Поместить в стек 0, число и адрес переменной pushl $ pushl $0x pushl В том случае, когда последовательность символов начинается с точки, - это директива ассемблера:

Синтаксис Если последовательность символов, с которой начинается строка, заканчива ется двоеточием - это метка (внутренняя переменная ассемблера, значение кото рой соответствует адресу в указанной точке):

eternal_loop: eternal_loop variable: Метки, состоящие из одной цифры от 0: до используются как локальные обращение к метке соответствует обращению к ближайшей из меток вперед по тексту программы;

обращение к метке соответствует обращению к ближай шей из меток 4: назад по тексту программы.

Одни и те же метки могут использоваться без ограничений и в качестве цели для команды перехода, и в качестве переменных.

Специальная (точка) всегда равна текущему адресу (аналогично $ в ас семблерах для DOS/Windows).

Если число начинается с * - это абсолютный адрес (для команд jmp и call), в противном случае - относительный.

Если метка начинается с символа * - выполняется косвенный переход.

11.1.2. Запись команд Названия команд, не принимающих операнды, совпадают с названиями, при нятыми в синтаксисе Intel:

пор К названиям команд, которые имеют операнды, добавляются суффиксы, отра жающие размер операндов:

слово;

а 1 - двойное слово;

q - учетверенное слово;

32-битное число с плавающей запятой;

a 1 - 64-битное число с плавающей запятой;

80-битное число с плавающей запятой.

// byte // ptr variable variable Команды, принимающие операнды разных размеров, требуют указания двух суффиксов, сначала суффикса источника, а затем приемника:

// movsbl Команды типов имеют в AT&T названия из четырех букв Ч С), размер источника, Т и размер приемника:

среде // cbtw // cwde // // Но многие ассемблеры понимают и принятые в Intel формы для этих четырех команд.

Дальние команды передачи управления call, ret) отличаются от ближних префиксом 1:

// call far 0007: // retf $ Если команда имеет несколько операндов, операнд-источник всегда записыва ется первым, а приемник - последним, то есть в точности наоборот по сравнению с Intel-синтаксисом:

// // У всех префиксов перед командой, для которой данный префикс предназна чен, есть имена, как у обычных команд. Имена префиксов замены сегмента - segcs, segds, segss, segfs, имена префиксов изменения разрядности адреса и операн да - 6 и 16:

segfs rep stosd Кроме того, префикс замены сегмента будет включен автоматически, если ис пользуется оператор : в контексте операнда:

movl 11.1.3. Адресация Регистровый операнд всегда начинается с символа // Непосредственный операнд всегда начинается с символа Операторы // variable Х.

Косвенная адресация использует немодифицированное имя переменной:

// push ptr variable variable Более сложные способы адресации удобнее рассматривать как варианты мак симально сложного способа - по базе и индексированием, и сдвигом:

// mov (наиболее общий случай) movl // lea leal // mov ptr [bp-2] movw -2(%ebp),%ax // mov ptr [edi*2] movl 11.2. Операторы ассемблера Ассемблеры для UNIX, как и для DOS, могут вычислять значения выражений в момент компиляции, например:

// Поместить в ЕАХ число 320*200.

movl %еах В этих выражениях встречаются следующие операторы.

или унарные, операторы - (минус) отрицательное число - (тильда) - логическое НЕ 77.2.2. Инфиксные, или бинарные, операторы Высшего приоритета:

- умножение;

/ - целочисленное деление;

% - остаток;

< или - сдвиг влево;

> или - сдвиг вправо.

Среднего приоритета:

- побитовое ИЛИ;

& - побитовое И;

- побитовое лисключающее ИЛИ;

! - побитовое (логическая импликация).

Низшего приоритета:

+ - сложение;

Ассемблер в среде 11.3. Директивы ассемблера Все директивы ассемблера в UNIX всегда начинаются с символа. (точка). Из за большого количества операционных систем и ассемблеров для них возникли многочисленные часто встречающиеся директивы. Рассмотрим наиболее полезные, Директивы определения данных Эти директивы эквивалентны директивам db, dd, df и т. п., применяющимся в ассемблерах для DOS/Windows. Основное отличие здесь состоит в чтобы дать имя переменной, значение которой определяется такой директивой;

в ассем блерах для UNIX обязательно надо ставить полноценную метку, заканчиваю щуюся двоеточием.

Байты:

Слова:

или или Двойные слова:

или Учетверенные слова переменные):

переменные 32-битные числа с плавающей запятой:

или 64-битные числа с плавающей запятой:

80-битные числа с плавающей запятой:

Строки байтов:

Строки байтов с автоматически добавляемым нулевым символом в конце:

или строка Блоки повторяющихся данных:

размер, значение или размер, Заполняет ' // памяти указанного // размера байтами // с заданным значением.

Директивы ассемблера повтор, размер, значение // Заполняет область памяти значениями // заданного размера (0-8 байт) указанное // число раз. По умолчанию размер // принимается равным а значение - 0.

Неинициализированные переменные:

символ, длина, Зарезервировать указанное число байтов // для локального символа в секции 77.3.2. Директивы управления символами Присвоение значений символам:

.equ символ, выражение // Присваивает символу значение выражения.

.equiv символ, выражение // То же, что и но выдает сообщение // об ошибке, если символ определен.

символ, выражение // То же, что и но можно повторять // несколько раз. Обычно, впрочем, удобнее // написать просто символ = выражение.

Управление внешними символами:

символ или символ // Делает символ видимым компоновщика, // а значит, и для других модулей // программы.

символ // Директива обычно игнорируется // все неопределенные символы считаются // внешними.

символ, длина, выравнивание // Директива эквивалентна но, если // символ с таким именем определен при // помощи в другом модуле, будет // использоваться внешний символ.

Описание отладочных символов:

символ // Блок описания отладочного символа.

Мы не коснемся описания отладочных символов, так как их форматы сильно различаются между разнообразными операционными системами и разными фор матами объектных файлов.

Директивы определения секций Текст программы делится на секции - кода, данных, неинициализированных данных, отладочных символов и т. д. Секции также могут делиться на подсекции, располагающиеся непосредственно друг за другом, но это редко используется.

подсекция Следующие команды будут ассемблироваться в секцию данных. Если подсек ция не указана, данные ассемблируются в нулевую подсекцию.

' Ассемблер в среде подсекция Следующие команды будут ассемблироваться в секцию кода.

имя, флаги, или "имя", флаги Общее определение новой секции:

флаги (для ELF):

- или #write - разрешена запись;

- х или - разрешено исполнение;

- а или #alloc - разрешено динамическое выделение памяти (.bss);

тип (для - @progbits - содержит данные;

- @nobits - не содержит данных (только занимает место).

11.3.4. Директивы управления разрядностью Следующие команды будут ассемблироваться как 16-битные.

Отменяет действие 16.

11.3.5. Директивы управления программным указателем выражение, выражение, выражение Выполняет выравнивание программного указателя до границы, отмеченной первым операндом. Второе выражение указывает, какими байтами заполнять про пускаемый (по умолчанию - ноль для секций данных и 90h для секций кода). Третье выражение задает максимальное число байтов, которые может про пустить эта директива.

В отдельных системах первое выражение - не число, кратным которому дол жен стать указатель, а число битов в указателе, которые должны стать нулевыми.

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

Директивы управления листингом Запретить листинг:

Разрешить листинг:

Конец страницы:

Размер страницы (60 строк, 200 столбцов по умолчанию):

строки, столбцы Заголовок листинга:

текст Подзаголовок:

текст 11.3.7. Директивы управления ассемблированием Включить текст другого файла в программу:

файл Ассемблировать блок, если выполняется условие или определен либо не опре делен символ:

выражение символ символ или. символ Выдать сообщение об ошибке:

Немедленно прекратить ассемблирование:

Блоки повторения Повторить блок программы указанное число раз:

число повторов.endr Повторить блок программы для всех указанных значений символа:

симол, Повторить блок программы столько раз, сколько байтов в строке, устанавли вая символ равным каждому байту по очереди:

.irpc символ, строка. endr Внутри блока повторения на символ можно ссылаться, начиная его с обратной косой черты (то есть как \символ). Например, такой блок Ассемблер в среде UNIX как и такой ассемблируется в:

movl movl movl 11.3.9. Макроопределения Начало макроопределения:

имя, аргументы Конец макроопределения:

Преждевременный выход из макроопределения:

Внутри макроопределения обращение к параметру выполняется аналогично блокам повторения, начиная его с обратной косой черты.

Хотя стандартные директивы и включают в себя такие вещи, как блоки повто рений и макроопределения, их реализация достаточно упрощена, и при програм мировании для UNIX на ассемблере часто применяют дополнительные препроцес соры. Долгое время было принято использовать С-препроцессор или М4, и многие ассемблеры даже могут вызывать их автоматически, но в рамках проекта GNU был создан специальный препроцессор для ассемблера - gasp. Он включает раз личные расширения вариантов условного ассемблирования, построения циклов, макроопределений, листингов, директив определения данных и т. д. Мы не будем заниматься реализацией таких сложных программ, которым может потребовать ся gasp, даже не воспользуемся и половиной перечисленных директив, но о суще ствовании этого препроцессора следует помнить.

11.4. Программирование с использованием Все программы для UNIX, на С, постоянно обращаются к различ ным функциям, находящимся в libc.so или других стандартных или нестандарт ных библиотеках. Программы и процедуры на ассемблере, естественно, могут де лать то же самое. Вызов библиотечной функции выполняется обычной командой call, а передача параметров осуществляется в соответствии с С-конвенцией: пара метры помещают в стек справа налево и очищают стек после вызова функции.

Единственная сложность здесь состоит в том, что к началу имени вызываемой функции в некоторых системах, например FreeBSD, приписывается символ под черкивания, в то время как в других (Linux и Solaris) имя не изменяется. Если имена в системе модифицируются, то имена процедур, написанных на ассембле ре, также должны быть изменены заранее.

с Посмотрим на примере программы, выводящей традиционное сообщение Hello world, как это делается.

// // Минимальная программа, выводящая сообщение "Hello world".

// Для компиляции в формат // // Компиляция:

// as -о helloelf.s // Компоновка:

// (пути к файлу могут отличаться на других системах) // Solaris с SunPro С // -о helloelf.o -lc // Solaris с GNU С // -s -o helloelf.o // -lc // Linux // -s -o // helloelf.o -lc // // или gcc -o helloelf.lnx helloelf.o // Код, находящийся в файлах передаст управление на процедуру main // после настройки всех параметров.

main // Поместить параметр (адрес строки message) в стек.

// Вызвать функцию puts (message).

call puts // Очистить стек от параметров.

%ebx // Завершить программу.

ret "Hello В случае с FreeBSD придется внести всего два изменения - добавить символ подчеркивания в начало имен функций puts и main и заменить директиву на так как версия ассемблера, обычно распространяемого с FreeBSD, не понимает.

// // Минимальная программа, выводящая сообщение "Hello world".

// Для компиляции в вариант формата COFF, используемый 2.2.

// Компиляция для FreeBSD:

// as -o // -s -о hellocof.bsd hellocof.o -lc Ассемблер в UNIX call %ebx ret. data "Hello Пользуясь этой техникой, можно создавать программы точно так же, как и на С, но выигрыш за счет того, что на ассемблере допускается соптимизировать програм му на несколько процентов лучше, чем это сделает компилятор с С (при максималь ной оптимизации), окажется небольшим по сравнению с потерей переносимости.

Кроме того, при написании любой сколько-нибудь значительной программы це ликом на ассемблере мы столкнемся с тем, что, как и в случае с Win32, нам при дется создавать собственные включаемые файлы с определениями констант и структур, взятых из включаемых файлов для С. А поскольку эти ассемблеры не умеют работать со структурами данных, необходимо описывать их средствами ис пользуемого препроцессора - срр или т4.

Лучшее применение ассемблера для UNIX (кроме собственно разработки ядра системы) все-таки остается за незначительными процедурами, требующими боль шой вычислительной мощности, - кодированием, архивированием, преобразова ниями типа Фурье, которые не очень сложны и при необходимости могут быть легко переписаны заново на ассемблере для другого процессора или на С.

11.5. Программирование без использования Может оказаться, что программа вынуждена многократно вызывать те или иные стандартные функции из libc в критическом участке, тормозящем выполне ние всей программы. В этом случае стоит обратить внимание на то, что многие функции libc на самом деле всего лишь более удобный для языка С интерфейс к системным вызовам, предоставляемым самим ядром операционной системы.

Такие операции, как ввод/вывод, вся работа с файловой системой, с процессами, с TCP/IP и т. п., могут выполняться путем передачи управления ядру операцион ной системы напрямую.

Чтобы осуществить системный вызов, надо передать его номер и параметры на точку входа ядра аналогично функции libc syscall(2). Номера системных вызо вов (находятся в файле и способ обращения к точке входа (дальний call по адресу 0007:00000000) стандартизированы SysV/386 ABI, но, например в Linux, используется другой механизм - прерывание следова тельно, получается, что обращение к ядру ОС напрямую делает программу при вязанной к конкретной системе. Часть указанных ограничений можно убрать, используя соответствующие но в общем случае выигрыш в скорости без оборачивается еще большей потерей переносимости, чем само применение ассем блера в UNIX.

Посмотрим, как реализуются системные вызовы в представленных примерах:

// hellolnx.s // Программа, выводящая сообщение "Hello world" на Linux без использования libc.

// Компиляция:

// as -o hellolnx.o hellolnx.s // -s -o hellolnx hellolnx.o _start // Системный вызов "write", параметры в Linux помещают слева направо, // в регистры %еах, %ecx, %edx, %esi, movl %ebx,%ebx incl %ebx // %ebx = 1 (идентификатор movl movl // Передача управления в ядро системы - прерывание с номером int $0x // Системный вызов й1 "exit" (%еах = 1, %ebx = 0).

xorl incl %eax xorl int $0x "Hello = Linux является уникальным случаем по отношению к системным вызовам. В бо лее традиционных UNIX-системах - FreeBSD и Solaris - системные вызовы реали зованы согласно общему стандарту и различие в программах заключает ся лишь в том, что ассемблер, поставляемый с FreeBSD, не поддерживает некоторые команды и директивы.

// // Программа, выводящая сообщение "Hello world" на FreeBSD без использования libc.

// Компиляция:

// as -o hellobsd.o // -s -o hellobsd hellobsd.o Ассемблер в среде. text _start // Системная функция 4 "write".

// В FreeBSD номер вызова помещают в а параметры - в стек // справа налево плюс одно двойное слово.

// Параметр 4 - длина буфера.

pushl // Параметр 3 - адрес буфера.

pushl $ // Параметр 2 - идентификатор устройства.

// 1 - номер функции в еах.

pushl %eax // В стек надо поместить любое двойное слово, но мы поместим номер вызова // для совместимости с Solaris и другими строгими операционными системами.

// - ассемблер для FreeBSD не поддерживает эту команду.

. byte О // Восстановить // Системный вызов 1 "exit".

pushl pushl // Icall. data message:

"Hello = И теперь то же самое в Solaris:

// // Программа, выводящая сообщение "Hello world" на Solaris/x86 без использования // // Компиляция:

// as -о hellosol.s // -s -o hellosol.o // _start Переносимая программа для // Комментарии - см.

.

pushl %eax pushl %eax pushl %eax Icall "Hello = Конечно, создавая данные мы нарушили спецификацию SysV/ ABI несколько раз, но лишь потому, что не обращались ни к каким разделяемым библиотекам, это прошло незамеченным. Требования к полноценной программе сильно отличаются в различных операционных системах, и все они выполнены с максимально возможной тщательностью в файлах которые мы подключа ли в примере с использованием библиотечных функций. Поэтому, если вы не зада етесь целью сделать программу абсолютно минимального размера, гораздо удобнее назвать вашу процедуру main (или добавляя и -1с при компоновке.

11.6. Переносимая программа для UNIX Как вы могли заметить, отличия между программами на ассемблере для раз ных UNIX-систем сводятся к разнообразным способам вызова системных функ ций. Кроме того, следует заметить, что номера этих функций могут тоже отличать ся. Рассмотрим на примере простой программы - аналога системной команды pwd, как эти различия можно учесть.

Мы начнем создавать программу pwd без использования системных библиотек.

В таком виде она может быть полезна как, например, часть мини-UNIX на одной дискете. Как мы позднее убедимся, размер нашей версии pwd станет меньше такой же программы на С (в 50-100 раз) без учета того, что любой программе на С до полнительно нужна библиотека занимающая сотни килобайт.

Команда pwd должна Всего лишь вывести на стандартный вывод полное имя текущего каталога. Для этого можно воспользоваться различными алгоритмами:

1. Системный вызов который присутствует в Linux 2.2 (номер 183) и FreeBSD 3.0 (номер 326). Этой функции передается адрес буфера и его раз мер, а она записывает в буфер полное имя текущего каталога. Данный способ самый эффективный, и мы в первую очередь будем использовать именно его.

Ассемблер среде 2. Специальный файл в Linux 2.2 является символической ссылкой на текущий каталог того процесса, который проверяет ее.

3. Некоторые интерпретаторы передают запускаемым программам значение те кущего каталога в переменной среды PWD. Такой способ - самый ненадежный, потому что под другим shell нашу программу нельзя будет запустить.

4. Классический алгоритм, в котором программа поэтапно исследует содержи мое вышележащего каталога (../, затем../ и т. д.) и находит запись, совпа дающую с предыдущим рассмотренным каталогом и т. д.). Такой ал горитм мы будем использовать, если в системе не поддерживаются ни системный вызов ни специальный файл /proc/self/cwd.

Поскольку имена большинства системных вызовов разнятся, разместим их в от дельном файле который будет включен в программу директивой // Способ обращения к системному вызову (установить // SYSCALL_linux в 1, если используется int $0x80, и // = 1, если используется = О = // Максимальная длина пути (из = // Стратегия для // 1, если используется системный вызов = // 1, если используется файл = // 1, если используется обычный (переносимый) алгоритм, = О // 1, если используется переменная среды = О // Номера используемых системных вызовов (из h):

// exit() - всегда SYSCALL_EXIT // - всегда 4.

// open() - всегда 5.

= // - всегда 6.

= // - 58 на FreeBSD, 85 на Linux.

= // readdir() - нет на FreeBSD, 89 на Linux.

= // getdents() - нет на FreeBSD, 141 на Linux.

= // - 196 на FreeBSD, нет на Linux.

Переносимая для // stat() 188 на FreeBSD, 106 на Linux.

SYSCALL_STAT = // - 190 на FreeBSD, 107 на Linux.

// fstat() - 189 на FreeBSD, на Linux.

// - 326 на FreeBSD 3.0, 183 на Linux 2.2, // нет на старых версиях.

= // Размеры используемых структур.

// Размер struct // 1024 на FreeBSD, 266 на Linux.

= // Смещение от начала структуры.

= О // Смещение от начала структуры:

// 4 на FreeBSD, 8 на Linux.

= // Смещение dirent.name от начала структуры:

// 8 на FreeBSD, 10 на Linux.

= // Размер структуры stat и смещения ее // dev, ino и = О, = Для всех пунктов этого файла можно написать сценарий с целью автоматичес кого конфигурирования, аналогичный GNU при использовании ко торого модификация вручную будет не нужна. Этот сценарий, а также другие про стые программы на ассемблере для UNIX доступны в Internet по адресу:

Теперь, когда все возможные различия между версиями системы предусмотрены, перейдем непосредственно к программе. Упрощая задачу, не станем обрабатывать со общения об ошибках, но код возврата в случае ошибки всегда будет ненулевым.

// Включение файла "config.i" // Начало программы.

_start // Переносимая (и сложная) стратегия для // В %ebp будет храниться указатель на первый символ части искомого пути, // определенной к настоящему моменту.

18 Assembler для DOS Ассемблер в среде UNIX // Она заполняется справа налево - от текущего каталога к корневому.

// Искомый путь инициализируется символом перевода строки.

movl // В будет храниться указатель на путь вида movl // инициализированный как "ДО".

// Выполнить чтобы определить и для корневого // (по ним мы позже установим, когда он будет movl pushl Ox9A SYSCALL movl movl int $0x // Сохранить dev и inode корневого movl movl movl // Главный цикл - перемещение по каталогам.

// Вызвать lstat() для текущего каталога типа // чтобы определить его inode и dev.

pushl $st_stat pushl movl pushl Ox9A addl Переносимая программа для movl int $0x // Сохранить и dev каталога, который сейчас будет сканироваться.

movl movl movl movl // Проверить, не совпадает ли этот каталог с корневым.

cmpl jne // Если совпадает - вписать последний символ на левом конце искомого пути // и вывести его на экран.

posix_write // Иначе // добавить к up_buffer, чтобы перейти к вышележащему каталогу.

%esi movb // Открыть данный каталог только для чтения $ $up_buffer movl pushl %eax Ox9A movl movl movl int $0x Ассемблер error_exit // Выполнить fstat над этим каталогом.

SYSCALL_unix movl pushl %eax movl movl movl int $0x testl // Если все в порядке, добавить для следующего каталога.

// Вложенный цикл: рассмотреть каждую запись в вышележащем Х// каталоге и сравнить ее inode и dev с текущей.

// Вызов readdir() легче использовать, чем getdents().

SYSCALL_unix pushl $ pushl $dirent pushl %edi movl $SYSCALL_READDIR,%eax pushl Х addl SYSCALL_linux movl $1,%edx movl movl movl int $0x программа для UNIX // В $ebx будет структура над мы в настоящий момент.

$dirent,%ebx %eax jne notfound // Если нет readdir(), но есть getdents и getdirentries, алгоритм усложняется, так // как они возвращают не одну структуру dirent, а столько, сколько поместится в буфер.

jz Х time_to_getdent %eax,%ebx // Проверить, выйдет ли %ebx за пределы буфера после добавления LEN.

xorl dirent_filled,%eax jge movw testl jnz skip_getdent // Если выходит - пора делать или getdirentries() // в от операционной SYSCALL_GETDENTS pushl pushl pushl movl pushl %eax Ox9A addl pushl $basep pushl $SIZE_DIRENT pushl pushl %edi movl pushl %eax Ox9A addl Ассемблер в SYSCALL movl movl movl int $0x movl notfound je movl $dirent,%ebx * // Скопировать в каталоге имя полученной записи // в конец строки./../, не смещая указатель в. %esi movl movl rep ' popl // Выполнить lstat() для этой записи, чтобы получить ее inode и dev pushl SYSCALL_unix pushl pushl movl %eax pushl addl movl movl movl int $0x popl testl readdir_cycle Переносимая для // Если они не совпадают с сохраненными и для // текущего - продолжить.

jne readdir_cycle movl ino,%eax cmpl jne readdir_cycle // Вернуть состояние соответствующее вышележащему каталогу.

movl // Добавить в создаваемый путь pwd (кроме случая, если это был самый первый каталог).

first je not_first %ebp movb $Ox2F,(%ebp) movb // Сдвинуть указатель в на байтов влево.

SYSCALL_READDIR movw xorl movl seek zero:

movb testb seek zero movl // Скопировать имя найденного каталога в pwd, не сдвигая указатель.

xorl pushl %esi pushl movl %ebp,%edi movl addl SYSCALL_READDIR movw movl rep Ассемблер в среде UNIX // Закрыть открытый pushl. byte Ox9A movl movl int $0x // Продолжить главный цикл, пока не будет достигнут корневой // Вывести на экран найденный путь.

movl $pt_buffer+1024,%edx Х movl pushl pushl pushl movl %eax pushl. byte Ox9A addl movl int $0x // Конец стратегии // распечатать значение переменной среды PWD (плохая Переносимая для %ebx movl // Теперь адрес списка переменных в // Сканирование переменных в поисках начало которой совпадет с $0,X%edi) jz movl movl repe jcxz found_variable xorl %ecx repne scasb env_scan_cycle // Теперь %edi - адрес значения переменной заканчивающийся нулем.

xorl decl %edx // Найти его длину loop_zero_scan incl %edx // и вывести на экран.

%edx %edi pushl $ movl pushl %eax. byte Ox9A movl movl movl int Ассемблер в среде UNIX // Стратегия - выводится имя каталога, на который // указывает символическая ссылка // Вызвать movl movl // Эта стратегия осуществима только в int $0x // Стратегия с использованием системного вызова.

// Вызвать SYSCALL_unix $MAX_PATH movl pushl. byte Ox9A f movl movl movl int $0x // В случае с FreeBSD надо дополнительно определить длину возвращенной строки.

decl movl repne movl // Вывод на экран для стратегий ргос и sys.

// Добавить символ новой строки в. конце.

Переносимая для | %eax // Вывести на экран unix $linux_buffer pushl $ Ox9A.

linux movl movl incl movl int $0x // Выход из программы без ошибок xorl %ebx,%ebx SYSCALL unix pushl %ebx movl pushl %eax Ox9A SYSCALL_linux movl int $0x // Выход из программы с ошибками.

Хpushl $ movl в среде %eax Ox9A %ebx int $0x // Область данных!

PWD_posix // Текущий каталог для stat().

.as.cii // Корневой каталог для stat().

.ascii // Флаг, нужный для того, чтобы не ставить перед первым элементом // Имя файла в для readlink().

// Переменная среды для стратегии =.

// Указатель для системного вызова basep:

// Буфер для Переносимая программа для " // Буфер для результата работы и readlink().

| // Буфер для вывода pwd.

// Буфер для сканируемого каталога ( // Различные // Буфер для записи из каталога | Для компиляции этой программы на любой системе достаточно двух команд:

as -о о s -о pwd Полученная версия pwd занимает:

Linux 2.2 - 428 байт (системная версия - 19 332 байта);

на 2.0 - 788 байт (системная версия - 18 440 байт);

а на FreeBSD 3.1 - 484 байта (системная версия - 51 916 байт);

на FreeBSD 2.2 - 8192 байта (системная версия - 45 056 байт).

Если на FreeBSD 2.2 установлена поддержка запуска ELF-программ, можно скомпилировать работающий на ней файл pwd длиной 940 байт, но в любом слу чае эти размеры впечатляют. Более того, для работы нашей версии pwd не требу ется никакая библиотека типа libc.so - это полностью самостоятельная статичес кая программа. Такие программы, написанные целиком на не только отличаются сверхмалыми размерами (в 20-100 раз меньше аналогов на но и работают быстрее, потому что обращаются напрямую к ядру системы.

Итак, прочитав эту книгу, вы познакомились с программированием на языке ас семблера во всей широте его проявлений - от создания простых программ и про цедур, вызываемых из приложений на других языках, до драйверов устройств и операционных систем. Теперь должно быть очевидно, что ассемблер не только не сдает свои позиции, но и не может их сдать - он неотъемлемо связан с компь ютером, и всюду, как только мы опускаемся с уровня абстракций языков высоко го уровня, рано или поздно встречаемся с ним. В то же время и абстракции, и сложные управляющие структуры, и структуры данных реализуются на языке ассемблера наиболее эффективно - не зря же Дональд Кнут, автор знаменитой книги Искусство программирования, использовал для иллюстрации перечис ленных структур и алгоритмов только ассемблер.

Ассемблер настолько многогранен, что нет никакой возможности описать в од ной книге все области программирования, в которых он может быть использован.

Методы защиты от копирования и противодействия отладчикам, строение раз личных файловых систем, программирование на уровне портов ввода-вывода та ких устройств, как IDE- или SCSI-диски, и многое другое осталось в стороне, и это правильно, потому что мир ассемблера не заканчивается вместе с этой кни гой, а только начинается.

1. Символы ASCII Номера строк соответствуют первой цифре в шестнадцатеричном коде симво ла, номера столбцов - второй, так код большой латинской буквы А - (см. рис. 18).

* о й в * d Ч Г * Л В т г т з.

X & ( ) S.

V 0 1 2 3 4 5 6 7 8 9 < > & А В С D Е F G н I J К L N Ч Р R S Т X V Z [ ] а Ъ с d е f i k 1 о g j г s t V U X z i Р q У Рис. 18. Таблица символов ASCII Приложение 2. Управляющие символы ASCII Таблица 23. Управляющие символы ASCII Код Имя Ctrl-код Назначение 0 NUL "@ Пусто (конец строки) 1 Начало заголовка 2 STX Начало текста 3 EOT Конец текста 4 Конец передачи 6 Подтверждение 7 Звонок 8 BS Шаг назад 9 НТ Горизонтальная табуляция ОА LF Перевод строки 0В "К Вертикальная табуляция ОС FF Перевод страницы OD CR Возврат каретки ОЕ SO Выдвинуть OF SI Сдвинуть р 10 Оставить канал данных 11 Управление 12 DC2 Управление 13 Управление 14 DC4 Т Управление 15 NAK Отрицательное подтверждение 16 SYN Синхронизация 17 ETB Конец блока передачи 18 CAN 19 EM Конец носителя 1А SUB Замена 1В ESC Escape 1C FS Разделитель файлов "\ 1D GS Разделитель групп 1Е RS Разделитель записей 1F US Разделитель полей 20 Пробел 7F DEL Удаление Таблицы 3. Кодировки второй половины ASCII Кодировка по умолчанию для первых компьютеров - этот набор символов хра нится в постоянной памяти и используется BIOS (см. рис. 19) О 1 А В D Л V Л Л ё a a a a е ё е i' 1 1 А А Л Л Ё Ж о 6 0 и О Ф У i / a о и а 1 о п N i J J - = 1 1 JL L - Ч = Т IF J Т Т Г Х Х а В г я Z о т Ф (Э 8 s п ХФ о п - Х V [ J Х Рис. 19. Кодировка IBM cp Кодировка ср866 используется DOS-приложениями как основная кодировка и компьютерной сетью Fidonet как транспортная кодировка (см. рис. 20).

О 1 В С D Е F А Б В г Е 3 И К Л м Н О П Ж Л Р С Т У Ф X Ш ъ ь Э Ю Я - Щ а б в г е ж 3 и Й к Л м н о п А J J - i 1 JL L X Т + IF J Х Т Т [Г i Г + Х с т X ч ъ ы ь э я ц щ Р У Ф ХI о Х № п Ё ё е е I "i Х Рис. 20. Кодировка IBM cp Приложение Кодировка используется как транспортная в Internet и как основная в большинстве бесплатно распространяемых операционных систем (см. рис.

О 1 9 А В С D E F L J - Ч Г Т Х Х 0 Х V I J Г Х ХХ J 1 Ik ё = If =1 L J JL L - = Ё = й Г Т Т Г ю а б е г X и к Л н о ц А м Ф п я с Т ж в ь 3 ш э ч ъ Щ Р У Ю А Б Е Ф Г X И К Л М Н О - А Р П Я С Т У Ж ь Ы 3 Ш Э Ч Ъ Щ Рис. 21. Кодировка Кодировка 8859-5 используется как основная в большинстве коммерчес ких UNIX-совместимых операционных систем (см. рис. 22).

О 1 9 А В С D Е F D D D п П D П D D П П D п D П П П D П п D D D D D D П D D П D п Ё г е I I Ъ К - У S ц J А Б В г Е Ж 3 И к Л М Н О п А С т У Ф X Ч Ш ъ ы ь Э ю я - Щ а б в г е ж 3 и к Л м н о п А с т X ч ш ъ ы ь э ю я Щ Р У Ф № ё г е s 1 i' № к ц Ъ з У Рис. 22. Кодировка ISO 8859- Таблицы символов Кодировка используется как основная в графических для Microsoft Windows (см. рис. 23).

О 1 8 В С D Е Г г < К t 3 Х Ч Ч р > № к ц а - о У Ё й I У J з о Х ё № е S s I А Б в г Е Ж 3 И Л м н О П Д У Р С т Ф X Ч Ш Ъ ь э Ю Я - Щ а 6 в г е ж 3 и к л м н о п А с т X ч ш ъ ь э ю я ц Щ Р У Ф Рис. 23. Кодировка Приложение 4. Коды символов расширенного ASCII Таблица 24. Расширенные Клавиша Код Клавиша Код Клавиша Код Клавиша Код Клавиша Код F1 3Bh 13h 87h Alt-Tab AIM 17h F2 3Ch 88h Ctrl-Tab 94h F3 3Dh Alt- F4 3Eh AIM 26h F5 3Fh 83h 97h Ctrl-Right F6 40h A2h 75 h F7 41h 2Dh Alt-PgUp Ctrl-Home F8 42h 1Sh Alt-PgDn Ctrl-PgDn 76h F9 43h 87h Ctrl-PgUp F10 Alt-\ 88h Ctrl-F F11 85h 33h Ctrl-F F12 86h 34h Ctrl-F3 9Bh 68h 35h 69h OEh Ctrl-F 6Ah 03h 63h Alt-K* 37h OFh Alt-K 6Ch 27h Ins 52h 65 h 4Eh 6Dh 28h Del 53h Ctrl-F 6Eh 29h SysRq 95h 6Fh Down 50h 96h 70h Left 4Bh 8Eh 71h 4Dh 90h 57h Up 48h Ctrl-K8 8Dh 8Ch End 8Fh 32h 59h Home 47h 2 91h 31h 5Ah PgDn S1h 92h 18h PgUp 21h Ctrl-K. 93 h 19h 5Ch 5Dh Префикс К соответствует клавишам на цифровой клавиатуре.

Таблицы 5. клавиатуры Таблица 25.

Клавиша Код Клавиша Код Клавиша Код Клавиша Код Esc Enter К* Ins 1 ! Ctrl ' Alt Del 53h 2 @ 03h A SP SysRq S Caps Macro 4$ 05h D 20h F1 F 5% F F2 58h 6 G F3 3Dh H F4 3Eh 8* J 24h F5 5Ch К 25h F6 5Dh 9( L F7 41h 0) -_ OCh ;

: F17 64h,..

= + F9 43h 65h BS 29h F10 F19 66h Tab 2Ah F Q 2Bh Scroll F21 68h \ l W 11h Z 2Ch Home F Е X - 48h F23 6Ah R 13h с 3Eh F24 6Bh Т 14h V 4Ah EraseEOF Y в Copy/Play N 31h K5 4Ch I 17h 32h Хо 4Dh Delta 73h, < 0 K+ 74h. > р 19h End Clear 35h Т [{ /?

PgDn 51h ]} ' Префикс К соответствует клавишам на цифровой клавиатуре.

Приложение Таблица 26. Служебные Код Функция Функция Буфер клавиатуры переполнен FAh ACK AAh Самотестирование закончено FCh Ошибка самотестирования Префикс для серых клавиш Ошибка самотестирования E1h Префикс для клавиш без кода отпускания FEh RESEND FOh Префикс отпускания клавиши FFh Ошибка клавиатуры EEh Эхо Приложение 2. Команды Intel 80x В этом приложении приведены скорости выполнения всех команд процессоров Intel от 8086 до Pentium II и машинные коды, которые им соответствуют.

1. Общая информация о кодах команд 1.1. Общий формат команды процессора Intel Команда содержать до шести полей:

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

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

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

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

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

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

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

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

биты - индексный регистр;

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

5. Смещение - 0, или 4 байта.

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

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

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

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

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

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

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

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

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

000 001 - CL/CX/ECX/ST(1)/MM1/XMM 010 - DL/DX/EDX/ST(2)/MM2/XMM 100 101 - CH/BP/EBP/ST(5)/MM5/XMM 110 - DH/SI/ESI/ST(6)/MM6/XMM 111 - BH/DI/EDI/ST(7)/MM7/XMM Запись будет означать reg.

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

000 - ES 001 - CS ОН 100 101 - GS Поле определяет условие для команд Jcc, CMOVcc, SETcc, FCMOVcc.

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

0000 - О - NO ООН 0100 - E/Z 0101 1001 - NS 1010 - Р/РЕ Запись типа 4сс будет означать 1.3. Значения поля ModRM Поле R/O (биты 5-3) содержит либо дополнительные три бита кода команды, либо код операнда, который может быть только регистром. Будем обозначать вто рой случай а в первом записывать используемые биты.

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

Команды Х Х MOD если используется регистровая адресация и R/M содержит код регистра reg MOD если используется адресация без смещения ([ВХ + SI] или MOD если используется адресация с 8-битным смещением (vari able[BX + Q MOD = 10, если используется адресация с 16- или 32-битным смещением Значение поля R/M различно в 16- и 32-битных режимах.

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

000 - [ВХ + SI] 001 - [ВХ + DI] + DI] 100 - [SI] 101 - [DI] - [BP] (кроме MOD = 00 - в этом случае после ModR/M располагается 16-битное смещение, то есть используется прямая адресация) R/M в режиме:

000 - [ЕАХ] 001 - [ЕСХ] 010 - [EDX] 011 - [ЕВХ] 100 - используется SIB 101 - [ЕВР] (кроме MOD = 00 - в этом случае используется SIB, после кото рого располагается 32-битное [ESI] 111 1.4. Значения поля SIB Значение поля S:

00 - не Используется 01 - умножение на 10 - умножение на - умножение на Значения полей I и В:

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

В регистр базы, не умножается) 000 - ЕАХ 001 - ЕСХ 011 - ЕВХ Приложение - для I - индекса нет для В - ESP 101 - для I - ЕВР для В - ЕВР, только если MOD = 01 или 10;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- АН, AL, BH, DH, DL, CH, CL;

а - АХ, СХ, DX, ВР, SP, SI, DI;

Команды 80x г32 - ЕАХ, ЕСХ, EDX, EBP, EDI;

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

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

Q mm - регистр ММХ;

а - регистр SSE;

- регистр ST(0);

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

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

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

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

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

VM - режим V86;

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

Q CG - шлюз вызова;

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

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

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

Q - переход во вложенную задачу.

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

Q 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: TS = 280.

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

LOCK OF2h: REPNE/REPNZ OF3h: REP/REPE/REPZ 2Eh: CS:

DS:

26h: ES:

FS:

GS:

66h: OS AS Приложение 4. Команды процессоров Intel 8088 - Pentium III Таблица 27. Команды 80286 Команда Код 8087 80186 80486 P5 P 80287 37 8 8 3 4 3 1m AAD D5 ib 60 15 14 19 14 10 NP 3m 83 19 16 17 15 18 NP 4m MS 3F 8 7 3 4 3 3 NP 1m ADC 14w 4 4 3 2 1 1 PU 2m 1 PU 2m ADC r,im im 4 4 3 2 ADC m,im im 23+ea 16 7 7 3 4m 1 PU 2m ADC r,r 3 3 2 2 ADC m,r 24+ea 10 7 7 3 4m ADC r,m 10 7 6 2 3m ADD 04w im 4 4 3 2 1 1 UV 1m ADD r,im im 4 4 3 2 1 1 UV 1m ADD m,im im 23+ea 16 7 7 3 4m ADD r,r OOdw /r 3 3 2 2 1 1 UV 1m ADD m,r OOdw /r 24+ea 10 7 3 4m ADD r,m OOdw /r 13+ea 10 7 6 2 2m AND im 4 4 3 2 1 1 UV 1m AND /4 im 4 4 3 2 1 1 UV 1m AND im 23+ea 16 7 7 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 4m AND r,m 20dw /r 13+ea 10 7 6 2 2m ARPL r,r 10 20 9 7 NP С ARPL m,r 21 9 С.

BOUND 35 13 10 7 8 NP С BSFr16,r16 OF BC /r 10+3n 6..42 6..34 NP 2m BSF r32,r32 OF BC /r 10+3n 6..42 NP 2m OF BC /r 10+3n NP 3m BSF r32,m32 OF BC /r 10+3n 6..43 NP 3m OF BD /r 10+3n 7..39 NP 2m BSR r32,r32 OF BD /r 10+3n 7..71 NP BSR 10+3n 3m BSR r32,m32 OF BD /r 10+3n 7..72 NP 3m BSWAP r32 1 1 NP 2m OF A3 /r 3 3 4 NP 1m ВТ m,r OF A3 /r 12 8 9 NP С ВТ r,i8 OF BA /4 ib 3 3 1m ВТ OF BA /4 ib 6 2m OF BB /r 6 6 1m BTC m,r OF BB /r 13 13 | 13 NP С BTC OF BA /7 ib 6 6 7 NP 1m Команды Таблица 27. Команды (продолжение) 80286 Команда Код 8087 80186 80486 P5 P 80287 ВТС OF BA /7 ib 8 8 8 NP 4m BTR OF B3 /r 6 6 7 NP 1m BTR OF B3 /r 13 13 NP С BTR OF BA /6 6 7 NP 1m BTR OF BA /6 ib 8 8 8 NP 4m BTS OF AB /r 6 6 1m BTS OF AB /r 13 13 13 NP С BTS OF BA /5 ib 6 6 7 NP 1m BTS т, OF BA /5 ib 8 8 8 NP 4m CALL near im E8 im 23 7 7 3 1 PV 4m CALL near r 20 13 7 7 5 С CALL near т 29+ea 19 11 10 5 2 NP С CALL far im 9A im 36 23 13 17 18 С CALL far im 26 34 20 NP С CALL im (CG) 41 52 35 22 NP С CALL 82 86 69 44 NP С (CG/in) (TS) 177 TS 37+TS NP С CALL im (TG) 177 TS 27+TS 22+TS NP С CALL far т 53+ea 38 16 22 17 С (RM) CALL far т. 29 38 20 С (PM) CALL т CG 44 56 35 22 NP С CALL т CG/in 83 90 69 44 NP С CALL т TS TS 37+TS 21+TS NP CALL т TG TS 37+TS 22+TS NP С CBW 98 2 2 2 3 3 3 NP 1т CDQ 99 2 2 NP 1т CLC F8 2 2 2 2 2 1т CLD FC 2 2 2 2 4т -- FA 2 2 3 3 5 С CLTS OF 06 2 5 7 10 NP С CMC F5 2 2 2 2 2 1т CMOVcc r,r OF 4cc 2т CMOVcc r,m OF 4cc /r Зт CMP 3Cw im 4 4 3 2 1 1 UV 1т CMP 80sw /7 4 4 3 2 1 1 UV 1т CMP m,im im 10 6 5 2 2т Приложение Таблица 27. Команды 80286 Команда Код 8087 80186 80486 P5 P 80287 CMP r,r 38dw /r 3 3 2 2 1 1 1m 38dw /r 10 7 5 2 2m CMP /r 10 6 6 2 2m A6 30 22 8 10 8 5 NP С REP* CMPSB F2/3 A6 9+30n 5+22n 5+9n 5+9n 7+7n 9+4n NP С A7 30 22 8 10 8 С CMPSD REP* F2/3 A7 9+30n 5+9n 5+9n 7+7n 9+4n NP С CMPSW/D CMPXCHG r,r OF BOw /r 6 5NP С CMPXCHG m,r OF BOw /r С CMPXCHG8B 10 NP С m 14 13 NP С CWD 99 5 4 2 2 1т CWDE 98 3 3 1т DAA 27 4 4 3 4 2 3 NP 1т DAS 2F 4 4 3 4 2 1т DEC 48r 3 3 2 2 1 1 UV 1т 3 3 2 2 1 1 UV 1т 23+ea 15 7 6 3 4т 80..90 29 14 14 16 17 NP 38 22 22 24 25 NP 4т r32 38 40 41 NP 4т 86..96+ea 35 17 17 16 17 NP 4т 44 25 25 24 25 NP 4т DIV /6 41 40 41 NP 4т EMMS OF 77 NP С ENTER И 6,0 C8 iw ib 15 11 10 14 NP С ENTER И 6,1 C8 iw ib 25 15 12 17 15 NP С ENTER C8 iw ib 12+4m 15+4m 15+2n NP С F2XM1 310..630 NP С FABS 22 3 1 FX 1т FADD 120 3/1 FX 2т FADD m64 125 3/1 FX 2т FADD 100 100 3/1 FX 1т FADD 100 100 8..20 3/1 FX 1т FADDP 105 105 8..20 3/1 FX 1т FBLD m80 290..310+ea 103 NP С Команды 80x Таблица 27. Команды 80286 Команда Код 80186 80486 P5 P 80287 520..540+ea 520..540 NP С FCHS 6 1 FX 3m FCLEX 9B DB E2 2..8 11 7 3m FCMOVB 2m 2m 2m 2m 2m 2m 2m 2m 26 4 4/1 FX 2m m64 65..75+ea 65..75 31 4 4/1 FX 2m FCOM si 40..50 24 4 4/1 FX 1m m32 60..70+ea 60..70 26 4 4/1 FX 2m 31 4. 4/1 FX 2m FCOMP si D8 D8r 26 4 4/1 FX 1m 26 5 4/1 FX 1m DB FOr 1m 1m FCOS 257..354 С FDECSTP 22 3 1 NP 1m m32 215..225 89 39 FX 2m m64 94 73 39 FX 2m FDIV 193..203 193..203 73 39 FX 1m FDIV 88..91 73 39 1m 197..207 ' 91 73 39 FX 1m m32 216..226 89 73 39 FX 2m 94 73 39 FX 2m FDIVR 204 88..91 73 39 FX 1m FDIVR DC FOr 194..204 88..91 73 39 FX 1m FDIVRP 91 73 39 FX 1m 9B DB E1 2..8 FNOP 9B DB EO FNOP FFREE si 18 3 1 NP 1m Приложение Таблица 27. Команды (продолжение) 80286 Команда Код 8087 80186 80486 P5 P FIADD 20..35 7/4 NP С FIADD т64 DE/0 19..32 7/4 NP С FICOM 8/4 NP с т32 8/4 NP с 88 8/4 NP с т32 8/4 NP с 42 с FIDIV т32 127 42 NP с FIDIVR т16 DA Я 42 NP с FIDIVR 42 NP DF/0 3/1 NP 4т FILD 3/1 NP 4т FILD 60..68+ea 3/1 NP 4т 7/4 NP С 7/4 NP С FINCSTP D9 F7 21 3 1 NP 1т 9B DB E3 2..8 33 17 16 NP С 80..90+ea 29..34 4т FIST 79..93 6 NP 4т DF/3 6 NP. 4т m32 79..93 4т m64 105 28..34 4т 20..35 7/4 NP С 19..32 7/4 NP С 20..35 7/4 С FISUBR 7/4 С FLD m32 20 4 1 FX 1т FLD m64 25 3 1 FX FLD m80 53..65+ea 53..65 44 3 3 NP 4т FLD si 14 4 1 FX 1т FLD1 D9 E8 24 4 2т FLDL2T 16..22 40 8 5/3 NP 2т FLDL2E 40 8 5/3 NP 2т 16..22 40 5/3 NP 2т FLDLG2 41 8 5/3 NP 2т FLDLN2 17..23 41 8 5/3 NP 2т FLDZ 20 4 1т 19 FLDENV т 14 71 44 37 NP С FLDENV m 71 34 NP С (PM) Команды! 80x Таблица 27. Команды (продолжение) 80286 Команда Код 8087 80186 80486 P5 P 80287 m32 11 3/1 FX 2m т64 14 3/1 FX 2m 16 3/1 FX 1m 16 3/1 FX 1m 148 16 3/1 FX 1m 2..8 11 7 9/9 NP 3m FNDISI FNOP EO 2..8 FNOP FNINIT 2..8 33 17 12 NP С FNOP 12 3 1 NP 1m FNSAVE т 197..207 154 NP С FNSAVE т 143 С FNSETPM 2..8 FNOP 15 40..50 NP С 15 3 Зт FSTSW AX 9B DF EO 13 3 Зт FPATAN D9 F3 314..487 218..303 С 155 С D9F5 167 20..70 NP С FPTAN NP С FRNDINT 16..50 NP С FRSTOR т 308 131 NP С (RM) FRSTOR т 308 70 NP С (PM) FSAVE т /6 154 NP С (RM) FSAVE т (PM) 9B DD /6 143 С 32..38 20..31 NP С FSETPM 9B DB E4 2..8 FNOP D9 FE 122..771 257..354 С С FSINCOS 70 NP 1т FSQRT 44 7 2т FST m FST m64 45 8 2т FST si 15..22 11 3 1 NP 1т I Assembler для DOS Приложение Таблица 27. Команды (продолжение) 80286 Команда Код 8087 80186 80486 P5 P 80287 FSTP 86..92+ea 44 7 2m FSTP 45 8 2m FSTP т80 53 6 С FSTP si 12 3 1 NP 1m 9B /7 15 3 2 NP 3m FSTENV т 9B D9 /6 40..БО NP С 15 3 3m FSTSW AX 9B DF EO 13 3 3m FSUB m32 24..32 3/1 FX 2m FSUB 125 3/1 FX 2m FSUB 100 100 3/1 FX 1m FSUB 100 100 3/1 1m FSUBP 105 105 3/1 FX 1m FSUBR m32 120 24..32 3/1 FX 2m FSUBR m64 28..36 3/1 FX 2m FSUBR 100 100 26..37 3/1 FX 1m FSUBR 100 100 26..37 3/1 FX 1m FSUBRP 105 105 3/1 FX 1m 38..48 28 4 4/1 FX 1m 24 4 4/1 FX 1m si FUCOMP si 26 4 4/1 FX 1m 26 5 4/1 FX 2m 1m FUCOMIP 1m 9B 4 3 6 1..3 2m 30..38 8 21 NP 1m 18 4 1 PV 1m FXRSTOR т OF AE /1 С FXTRACT 13 NP С FXSAVE т OF AE /0 С NP С FYL2XP1 1000 1000 NP С HLT F4 2 2 5 С r8 17 19 19 22 NP 53..61 25 27 27 30 NP 4т IDIV r32 43 43 46 NP 4т IDIV 20 22 20 22 NP 4т 28 30 28 30 NP 4т 80x Таблица 27. Команды 80286 Команда Код 8087 80486 P5 P 80287 IDIV т32 46 44 46 NP 4m 80..98 13 11 NP 154 34..37 21 NP 3m r32 9..38 13..42 10 NP 3m 32..34 16 11 NP 2m 24 12..25 NP 4m 13..42 10 NP 4m 6B /r ib 22 21 10 NP 1m IMUL 69 /r 29 21 10 NP 1m IMUL 69 /r im 9..38 13..42 10 NP 1m r32,r32,i 6B /r ib 25 24 10 NP 2m IMUL 69 /r im 32 24 13..26 10 NP 2m r16,m16,i IMUL 69 /r im 10 NP 2m OF AF /r 13.18 10 NP 1m IMUL r32,r32 OF AF /r 9..38 10 NP 1m OF AF /r 12..25 10 NP 2m OF AF /r 12..41 10 NP 2m m IN ac,i 14 10 5 12 14 С (RM) IN ac,i E4w 6 9 С IN ac,i E4w ib 26 29 21 NP С (CPL>IOPL) IN E4w ib 26 27 19 NP С (V86) IN ECw 12 8 5 13 14 С (RM) IN ECw 7 8 С ECw 27 28 21 NP С (CPL>IOPL) IN ECw 27 27 19 NP С (V86) 3 3 2 2 1 1 UV 1т INC 6/32 40r 3 3 2 2 1 1 UV 1т INC т 15 7 6 INS* (RM) 6Cw 14 5 15 17 9 NP С 27. Команды (продолжение) 80286 Команда Код 8087 80186 80486 P5 P 80287 INS* 6Cw 9 10 С INS* 29 32 24 NP С (CPL>IOPL) INS* (V86) 6Cw 29 30 22 NP с 71 47 23 37 30 16 NP 3m INT CD ib 40 59 44 31 NP С INT i8 (PM/in) 78 99 71 48 NP С INT (V86) 78 119 82 60 NP С INT (TG) TS 37+TS 23+TS NP С INT3 CC 72 45 23 33 26 16 NP С INT3 (PM) CC 40 59 44 30 NP С INT3 (PM/in) CC 78 99 71 47 NP INT3 (V86) CC 78 119 82 59 NP С INT3 (TG) CC TS 37+TS 22+TS NP С INTO (OF=0) CE 4 4 3 3 3 С INTO (RM) CE 73 48 24 35 28 13 NP С INTO (PM) CE 59 46 30 NP С INTO (PM/in) CE 99 73 47 NP С INTO (V86) CE 118 84 59 NP С INTO (TG) CE TS 29+TS 22+TS NP С OF 08 4 15 NP С INVLPG OF 01 12 25 NP с CF 44 28 17 22 15 с (RM) IRET/IRETD CF 31 38 15 с (PM) IRET/IRETD CF 55 82 36 27 NP с (PM/out) CF 169 TS 32+TS с (PM/NT) Jcc 4 4 3 3 1 PV 1т (не вып.) Jcc 16 13 7 7 3 1 PV 1т Jcc OF 80c ib 3 1 1 PV 1т (не вып.) Jcc im (вып.) OF 80c ib 3 1 1 PV 1т JCXZ i 6 5 4 5 5 2т (не вып.) JCXZ i8 (вып.) 18 16 8 9 8 2т JMP near i8 15 13 7 1 PV 1т JMP near "E9 ib 15 13 7 7 3 1 PV 1т i 16/ Команды 80x Таблица 27. Команды 80286 Команда Код 8087 80186 80486 P5 P 80287 near г 11 11 7 7 5 2m near 17 11 10 5 2 NP 2m JMP far im 15 13 11 12 17 С (RM) JMP far im 27 19 23 NP С JMP far im 38 45 32 18 NP С (CG) JMP far im 175 TS 42+TS С (TS) JMP far im EA im 180 TS 43+TS 20+TS NP С (TG) JMP far m 24+ea 26 15 12 13 С (RM) JMP far m 31 18 23 NP с (PM) JMP far m 41 49 31 18 NP с (CG) JMP far m 178 5+TS с (TS) JMP far m 183 5+TS 42+TS 20+TS NP с (TG) 9F 4 2 2 2 3 1т OF 02 /r 14 15 11 8 NP С OF 02 /r 16 16 11 С r,m (RM) 24+ea 18 7 7 6 С r,m (PM) 22 12 С 2+ea 6 3 2 1 UV 1т LEAVE C9 8 5 4 LES r,m (RM) 24+ea 18 7 7 6 С LES r,m (PM) 22 12 С r,m (RM) OF B4 /r 7 6 С LFS r,m (PM) 22 12 С OF 01 /2 11 11 11 С LGS r,m (RM) OF B5 /r 7 6 4 NP С LGS r,m (PM) OF B5 /r 22 12 NP С OF 01 /3 12 11 11 6 NP L OF 00 /2 17 20 11 9 NP С OF 00 /2 19 24 11 С OF 01 /6 3 10 L LMSW m OF 01 /6 6 13 13 С LOCK FO 2 2 0 0 1 1 NP С Приложение Таблица 27. Команды (продолжение) 80286 Команда Код 8087 80186 80486 P5 P 80287 ACw 16 10 5 5 2m LODSD LOOP 5 5 4 11 6 4m (не вып.) LOOP (вып.) 17 15 8 11 7 4m LOOPE E1 ib 6 5 4 11 6 4m (не вып.) (вып.) E1 ib 18 16 8 11 9 4m LOOPNE 5 5 4 11 6 4m (не вып.) LOOPNE i 19 16 8 11 9 4m (вып.) 20 или LSL r,r OF 03 /r 14 10 С 21 или LSL r,m OF 03 /r 16 10 С LSS OF B2 /r 7 6 С LSS B2 /r 22 12 С OF 00 /3 17 23 20 10 NP С OF 00 /3 19 27 20 10 NP С MOV r,r 88dw /r 2 2 2 2 1 1.UV 1т MOV AOdw 14 9 3 2 1 1 UV 2т MOV /r 9 3 2 1 1 UV 2т MOV ac,m AOdw im 14 8 5 4 1 1 UV 1т MOV r,m 88dw /r 12+ea 12 5 4 1 1 UV MOV C6w /0 im 3 2 1 1 UV 2т MOV r8,i8 4 3..4 2 2 1 1 UV 1т MOV 4 3..4 2 2 1 1 UV 1т r16/32,i16/ MOV 2 2 2 2 3 NP 4т MOV sr,r (PM) 17 18 9 NP 4т MOV sr,m 12+ea 9 5 5 3 NP 4т MOV sr,m (PM) 19 19 9 4т MOV r,sr 2 2 2 MOV m,sr 11 3 2 1 NP 1т MOV OF 22 /r 10 16 22 NP С MOV CR2,r OF 22 /r 4 4 10 NP С Команды Таблица 27. Команды 80286 Команда Код 8087 80186 80486 P5 P 80287 MOV CR3,r OF 22 /r 5 4 21 NP С MOV CR4,r OF 22 /r 14 NP С MOV OF 20 /r 6 4 4NP с MOV DRO-3,r OF 23 /r 22 11 NP с MOV DR4-5,r OF 23 /r 12 NP с MOV DR6-7,r OF 23 /r 16 11 11 NP с MOV r,DRO-3 OF 21 /r 22 10 с MOV r,DR4-5 OF 21 /r 12 NP с MOV r,DR6-7 OF 21 /r 22 10 NP с MOV TR6,r OF 26 /6 12 MOV TR7,r OF 26 /7 12 MOV TR3,r OF 26 /3 MOV r,TR6 OF 24 /6 12 MOV r,TR7 OF 24 /7 12 MOV r,TR3 OF 24 /3 MOVD OF 6E /r PU 1т MOVD r32,mm OF 6E /r 1т MOVD OF 6E /r PU 2т OF 7F /r PU 2т MOVQ OF 6F /r PU 1т OF *F /r PU 1т MOVS* A4w 5 7 7 4 С MOVSX OF BEw /r 3 3 3 NP 1т MOVSX r,m OF BEw /r 6 3 1т MOVZX r,r OF B6w /r 3 1т О MOVZX OF B6w /r 6 1т 13 11 NP 1т F6w /4 21 11 NP MUL r32 10 NP 76..83+ea 16 11 NP 2т 24 11 NP 4т 12..41 10 NP 4т MUL 3 3 2 2 1 1 NP 1т NEG 24+ea 13 7 6 3 3 NP 4т NOP 90 3 3 3 3 1 1 UV 1т Приложение Таблица 27. Команды (продолжение) 80286 Команда Код 8087 80186 80486 P5 P 80287 NOT r 3 3 2 2 1 1 NP 1m 24+ea 13 7 6 3 3 NP 4m OR 4 4 3 2 1 1 UV 1m OR r,im 80sw /1 4 4 3 2 1 1 UV 1m OR m,im im 23+ea 16 7 7 3 4m /r 3 3 2 2 1 1 UV 1m OR m,r /r 24+ea 10 7 7. 3 3 UV 4m OR 08dw /r 10 7 6 2. 2m OUT i8,ac 14 9 3 16 12 NP С (RM) OUT i8,ac 4 11 С OUT i8,ac 24 31 26 NP С IOPL) OUT i8,ac 24 29 24 NP с (V86) OUT EEw 12 7 3 16 с (RM) OUT EEw 5 10 с OUT EEw 25 30 26 NP с (CPL>IOPL) OUT EEw 25 29 24 NP с (V86) OUTS* (RM) 6Ew 14 5 14 17 13 NP с OUTS* 6Ew 8 10 - 10 NP с OUTS* 6Ew 28 32 27 NP с (CPL>IOPL) OUTS* (V86) 6Ew 28 30 25 NP с OF 63 /r 1т PACKSSWB OF 63 /r 2т PACKSSDW OF 6B /r UV NP1 1т PACKSSDW OF 6B /r PU NP1 2т PACKUSWB OF 67 /r 1т PACKUSWB OF 67 /r PU NP1 2т Команды Intel Таблица 27. Команды 80286 Код 8087 80186 80486 P5 P 80287 PADDB OF FC /r UV 1m PADDB OF FC /r PU 2m PADDW OF FD /r UV 1m PADDW OF FD /r PU 2m PADDD OF FE /r UV 1m PADDD OF FE /r PU 2m OF EC /r UV 1m PADDSB OF EC /r PU 2m PADDSW OF ED /r UV 1m PADDSW OF ED /r PU 2m PADDUSB OF DC /r UV 1m PADDUSB OF DC /r PU 2m PADDUSW OF DD /r UV 1m PADDUSW OF DD /r PU 2m PAND OF DB /r UV 1m PAND OF DB /r PU 2m PANDN OF DF /r UV 1m PANDN OF DF /r PU 2m UV 1m OF 74 /r PCMPEQB OF 74 /r PU 2m PCM PEQW UV 1m OF 75 /r Таблица 27. Команды (продолжение) 80286 Команда Код 8087 80186 80486 P5 P 80287 OF 75 /r PU 2m OF 76 /r uv 1m PCMPEQD OF 75 /r PU 2m OF 64 /r uv 1m PCMPGTB OF 64 /r PU 2m OF 65 /r uv 1m PCMPGTW OF 65 /r PU 2m OF 66 /r uv PCMPGTD OF 66 /r PU 2m PMADDWD OF F5 /r 1m PMADDWD OF F5 /r PU 2m PMULHW OF E5 /r 1m PMULHW OF E5 /r 2m 1m PMULLW OF D5 /r PU NP2 2m 58r 12 10 5 4 1 1 UV 2m 8F/0 25+ea 20 5 5 6 С POP DS (RM) 1F 12 8 5 7 3 С POP DS (PM) 20 21 9 NP С POP ES (RM) 7 12 8 5 7 3 3 NP С POP ES (PM) 7 20 21 9 С POP SS (RM) 17 12 8 5 7 3 3 NP С POP SS (PM) 17 20 21 9 С POP FS (RM) 12 8 5 3 NP С POP FS (PM) 21 9 с POP GS (RM) ' 12 8 5 7 3 с POP GS (PM) 21 9 с Команды 80x Таблица 27. Команды (продолжение) 80286 Команда Код 8087 80186 80486 P5 P 80287 POPA/POPAD 61 51 19 24 9 С POPF/POPFD 9D 12 8 5 5 9 С POPF/POPFD 9D 5 6 14 NP с POR OF EB /r UV 1m, OF EB /r PU 2m OF F1 /r UV NP1 1m PSLLW OF F1 /r 1m PSLLW OF 71 /6 ib 2m PSLLD OF F2 /r 1m PSLLD OF F2 /r 1m PSLLD mm,i8 OF 72 /6 ib 2m PSLLQ OF F3 /r 1m PSLLQ OF F3 /r 1m PSLLQ OF 73 /6 ib 2m PSRAW OF E1 /r PSRAW OF E1 /r 1m PSRAW OF 71 /4 ib 2m PSRAD OF E2 /r 1m PSRAD OF E2 /r 1m PSRAD OF 72 /4 ib 2m PSRLW OF D1 /r 1m PSRLW OF D1 /r PU NP1 1m PSRLW 2m OF PSRLD 1m OF /r PSRLD 1m OF D2 /r Таблица 27. Команды 80286 Команда Код 80186 80486 P5 P 80287 OF 72 /2 ib NP1 2m OF D3 /r 1m PSRLQ OF D3 /r PU NP1 1m PSRLQ OF 73 /2 ib UV 2m OF F8 /r UV 1m PSUBB OF F8 /r PU 2m PSUBW OF F9 /r UV 1m PSUBW OF F9 /r PU 2m PSUBD OF FA /r UV 1m PSUBD OF FA /r PU 2m PSUBSB OF E8 /r UV 1m PSUBSB OF E8 /r PU 2m PSUBSW OF E9 /r UV 1m PSUBSW OF E9 /r PU 2m PSUBUSB OF D8 /r UV 1m PSUBUSB PU 2m PSUBUSW OF D9 /r UV PSUBUSW OF D9 /r PU 2m PUNPCKHBW OF 68 /r 1m PUNPCKHBW OF 68 /r 2m PUNPCKHWD OF 69 /r 1m Х Команды 80x Таблица 27. (продолжение) Команда Код 8087 80186 80486 P5 P 80287 PUNPCKHWD OF 69 /r PU NP1 2m OF 6A /r 1m PUNPCKHDQ OF 6A /r PU NP1 2m OF 60 /r PUNPCKLBW OF 60 /r PU NP1 2m OF 61 /r 1m OF 61 /r PU NP1 2m PUNPCKLDQ OF 62 /r 1m PUNPCKLDQ OF 62 /r PU NP1 2m 50r 15 10 3 2 1 1 UV 3m PUSH т 24+ea 16 5 5 4 4m PUSH 3 2 1 1 NP 3m PUSH 68 3 2 1 1 NP 3m PUSH CS OE 14 9 3 2 3 1 NP 4m PUSH DS 1E 14 9 3 2 3 1 NP 4m PUSH ES 6 14 9 3 3 1 NP 4m PUSH SS 16 14 9 3 2 3 1 NP 4m PUSH FS OF АО 2 3 1 NP 4m л PUSH GS 3 1 NP 4m PUSHA/ 60 36 17 18 11 С PUSHAD PUSHF/ 9C 14 9 3.4 4 С PUSHFD PUSHF/ 9C 3 4 3 NP С PXOR OF EF /r UV 1m PXOR OF EF /r PU 2m Х 2 2 2 9 3 1 PU 2m 23+ea 15 7 10 4 4m RCL r,CL 8+4n 5+n 5+n 9 8..30 С Приложение Таблица 27. Команды (продолжение) 80286 Команда Код 8087 80486 P5 P 80287 RCL 17+n 8+n 10 9..31 С RCL r,i8 COw /2 ib 5+n 5+n 9 С RCL COw /2 ib 17+n 8+n 10 9..31 с 2 2 2 9 3 1 PU 2m 23+ea 15 7 10 4 4m RCR r,CL 8+4n 5+n 5+n 9 NP С RCR 28+ea+4n 17+n 8+n 10 9..31 С RCR r,i8 COw /3 ib 5+n 5+n 9 8..30 NP С RCR COw /3 ib 17+n 8+n 10 с OF 32 NP с RDPMC OF 33 с RDTSC OF 31 NP с C3 20 16 10 5 4т 24 18 11 10 5 С RETN 34 22 15 18 13 4т RETF (RM) 25 32 18 NP С RETF (PM/out) CB 55 62 33 23 NP С 33 25 15 18 14. С RETF i16 (PM) iw 25 32 17 NP С RETF i 55 68 33 23 NP С (PM/out) 2 2 2 3 3 1 PU 1т 23+ea 15 7 7 4 4т r,CL 8+4n 5+n 5+n 3 3 1т 28+ea+4n 17+n 8+n 7 4 4т ROL r,i8 COw /0 ib 5+n 5+n 3 2 1 PU 1т ROL m,i8 COw /0 ib 17+n 8+n 7 4 4т 2 2 2 3 3 1 PU 1т 23+ea 15 7 7 4 4т ROR 8+4n 5+n 3 3 1т ROR 17+n 8+n 7 4 4т ROR r,i8 COw /1 ib 5+n 5+n 3 2 1 PU 1т ROR m,i8 COw /1 ib 17+n 8+n 7 4 3 PU 4т RSM 83 NP С я SAHF 9E 3 2 3 2 1т 2 2 2 3 3 1 PU 1т 23+ea 15 7 7 4т SAL r,CL 8+4n 5+n 3 3 1т SAL 28+ea+4n 17+n 8+n 7 4 4т SAL r,i8 COw /4 ib 5+n 5+n 3 2 1 PU 1т Команды 80x Таблица 27. Команды (продолжение) 80286 Команда Код 8087 80186 80486 P5 P 80287 SAL m, COw /4 ib 7 4 4m 7 SALC D6 ?

3 3 2 2 2 3 3 1 1m SAR 23+ea 15 7 7 4 4m SAR r.CL 8+4n 5+n 5+n 3 3 1m SAR m,CL 17+n 8+n 7 4 4m SAR r,i8 COw ib 5+n 5+n 3 2 1 PU 1m SAR COw /7 ib 17+n 8+n 7 4 4m SBB 1 Cw 4 4 3 2 1 1 PU 2m SBB im 4 4 3 2 1 1 PU 2m SBB im 23+ea 16 7 7 3 4m SBB r,r 3 3 2 2 1 1 PU 2m SBB 24+ea 10 7 7 3 4m SBB 10 7 6 2 3m SCASB/ SCASW/ AEw 18 15 7 7 6 3m SCASD REP* SCAS* F2/3 AEw 5+8n 5+8n 7+5n 8+5n NP С SETcc r 4 4 1 NP 1m (вып.) SETcc r 4 3 3m (не SETcc m 5 3 1 NP 1m (вып.) SETcc 5 3m (не вып.) OF 01 /0 11 9 10 4m 2 2 2 3 3 1 PU 1m SHL 23+ea 15 7 4 4m SHL r,CL 8+4n 5+n 5+n 3 3 1m 28+ea+4n 17+n 8+n 7 4 4m SHL r,i8 COw /4 ib 5+n 5+n 3 2 1 PU 1m COw /4 ib 17+n 8+n 7 4 4m 2 2 2 3 3 1 PU 1m 23+ea 15 7. 7 4 3 PU 4m SHR r,CL 8+4n 5+n 5+n 3 3 1m 28+ea+4n 17+n 8+n 7 4 4m SHR r,i8 COw /5 ib 5+n 5+n 3 2 1 PU 1m SHR COw /5 ib 17+n 8+n 7 4 4m SHLD 3 2 2m SHLD r,r,CL 3 3 2m Приложение Таблица 27. Команды (продолжение) 80286 Команда 80186 80486 P5 P 80287 7 3 4 NP 4m m,r,CL 7 4 5 NP 4m SHRD OF AC 3 2m SHRD r,r,CL OF AD 3 3 2m SHRD m,r,im OF AC 7 3 4m OF AD 7 4 4m OF 01 /1 12 9 10 С OF 00 /0 2 2 2 2 NP 4m OF 00 /0 3 2 3 2 NP С OF 01 /4 2 2 2 4m OF 01 /4 3 3 3 С о STC F9 2 2 2 2 1m STD FD 2 2 2 2 2 4m FB 2 2 2 3 5 С STOSB/ STOSW/ AAw 11 10 3 4 5 3m STOSD REP STOS* 9+14n 6+9n 4+3n 5+5n 7+4n С OF 00 /1 2 2 2 Х 4m OF 00 /1 3 2 3 С SUB 2Cw 4 4 3 2 1 1 UV 1m SUB r,im im 4 4 3 2 1 1 UV 1m SUB im 23+ea 16 7 7 3 4m SUB r,r. /r 3 3 2 2 1 1 UV 1m /r 24+ea 10 7 7 3 4m SUB r,m 28dw /r 10 7 6 2 2m SYSENTER OF 34 С SYSEXIT OF 35 С TEST A8w im 4 4 3 2 1 1 UV 1m TEST r,im F6w /4 im 5 4 3 2 1 1 UV Im TEST F6w /4 im 10 6 5 2 2 UV 2m TEST r,r 3 3 2 1 1 UV 1m TEST m,r 13+ea 10 6 5 2 2m 13+ea 10 6 5 2 2 UV 2m UD2 OF OB С VERR OF 00 /4 14 10 11 С OF 00 /4 16 11 OF 00 /4 14 15 11 с OF 00 /4 16 16 с WAIT 4 6 3 6 1..3 2m Команды 80x Таблица 27. Команды (окончание) 80286 Команда Код 8087 80186 80486 P5 P OF 09 5 2000+ NP С OF 30 NP с XADD COw /r 3 4m XADD OF COw /r 4 С XCHG ac,r / 90r 3 3 3 3 3 3m XCHG r,r 4 4 3 3 3m XCHG r,m / /r 17 5 5 5 С D7 11 11 5 5 4 2m XOR 34w 4 4 3 2 1 1m XOR 80sw /6 im 4 4 3 2 1 1 UV 1m XOR m,im im 23+ea 16 7 7 3 4m XOR r,r 30dw /r 3 3 2 2 1 1 UV 1m XOR m,r 30dw /r 24+ea 10 7 7 3 4m XOR 30dw /r 10 7 6 2 2m Таблица 28. Коды команд расширения SSE Команда Код OF 28 /r OF 29 /r OF /r OF MOVHLPS OF MOVHPS | F3 OF /r ADDPS OF 58 /r ADDSS F3 OF 58 /r SUBPS OF 5C /r SUBSS F3 OF 5C /r OF 59 /r F3 OF 59 /r xmm,xmm/m32 F3 OF 5E /r Приложение Таблица 28. Коды команд расширения (окончание) Команда Код OF 52 /r RSQRTPS RSQRTSS F3 OF 52 /r SQRTPS OF 51 /r SQRTSS F3 OF 51 /r RCPPS xmm,xmm/m128 OF 53 /r RCPSS F3 OF 53 /r OF 5F /r F3 OF 5F /r MAXPS OF 5F /r MAXSS F3 OF 5F /r OF 5D /r F3 OF 5D /r CMPPS OF C2 /r i CMPSS F3 OF C2 /r OF 2F /r UCOMISS xmm,xmm/m32 OF 2E /r OF 2A /r F3 OF 2A /r OF 2D /r F3 OF 2D /r OF 2C /r ANDPS OF 54 /r ANDNPS OF 55 /r ORPS OF 56 /r Application Binary Interface Интерфейс для приложений на низком уровне 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 Assembler для DOS, Windows и DPMI DOS Protected Mode Interface Интерфейс для защищенного режима DOS DSP Digital Signal Processor Процессор для оцифрованного звука в звуковых картах DTA Disk Transfer Area Область передачи дисковых данных (в DOS) ELF Executable and Linking Format Формат исполняемых и компонуемых файлов EMS Expanded Спецификация доступа к дополнительной памяти EPB 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 Глобальная таблица дескрипторов Human Computer Interface Интерфейс между пользователем и программой HMA High Memory Area Верхняя область памяти (64 Кб после первого мегабайта) IBM International Business Machines Название компании Initialization Control Word Управляющее слово инициализации IDE Integrated Drive Electronics Один из интерфейсов для жестких дисков IDT Interrupt Descriptor Table Таблица дескрипторов обработчиков прерываний IER Interrupt Enable Register Регистр разрешения прерываний IOCTL Input/Output Control Управление вводом-выводом IOPL Input/Output Privilege Level Уровень привилегий IRQ Interrupt Request Запрос на прерывание (от внешнего ISP Interrupt Sharing Protocol Протокол разделения прерываний LCR Line Control Register Регистр управления линией LDT Local Descriptor Table Таблица локальных дескрипторов LE Linear Executable Линейный исполняемый формат Long File Name Длинное имя файла LSR Line Status Register Регистр состояния линии сокращения MASM Macro Ассемблер компании Microsoft MCR Modem Control Register Регистр управления модемом MMX Multimedia Extension Расширение для работы с мультимедийными приложениями MSR Modem State Register Регистр состояния модема MSR Machine Specific Register Машинно-специфичный регистр NE New Executable Новый исполняемый формат NPX Numerical Processor Extension Расширение для работы с числами с плавающей запятой OCW Operation Control Word Управляющее слово (для контроллера прерываний) PE Portable Executable Переносимый исполняемый формат POST Power On Self Test Самотестирование при включении 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 Один из интерфейсов для жестких дисков SUN Stanford University Networks Название компании SVGA SuperVGA Любой видеоадаптер, способный на режимы, большие 13h TASM Turbo Assembler Ассемблер компании Borland THR Transmitter Register Регистр хранения передатчика TSR Terminate and Stay Resident Завершиться и остаться резидентным TSS Task State Сегмент состояния задачи MB Upper Memory Block Блок верхней памяти (между границами 640 Кб и 1 Мб) VBE VESA BIOS Extension Спецификация VESA для расширения BIOS Virtual Control Program Interface Один из интерфейсов к защищенному режиму для DOS VESA Video Electronics Standard Ассоциация по стандартизации видео в электронике Association Assembler для Windows и UNIX VGA Video Graphics Array Основной тип видеоадаптеров VxD Virtual X Device Виртуальное устройство Х (общее название виртуальных драйверов в Windows 95) Watcom Assembler Ассемблер компании Watcom XMS Extended Memory Specification Спецификация доступа к расширенной памяти Глоссарий А запись (activation record) - область стека, заполняемая при вы зове процедуры.

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

Ассемблер Ч компилятор с языка ассемблера.

Б Байт (byte) - тип данных, имеющий размер 8 бит;

минимальная адресуемая еди ница памяти.

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

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

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

д Двойное (double - тип данных, имеющий размер 32 бита.

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

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

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

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

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

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

I] для DCS, Windows и UNIX Исключение (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) - минимальный элемент растрового изображения.

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

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

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

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

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

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

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

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

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

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

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

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

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

Т Таблица переходов - массив адресов процедур для косвенного пере хода на процедуру с известным номером.

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

А Адресация Байт Байты состояния клавиатуры косвенная Бит с масштабированием Блоки непосредственная информации по базе параметров PSP с индексированием параметров запускаемого файла со сдвигом Блоки повторений по смещению UNIX полная форма Буфер клавиатуры прямая расширение при помощи драйвера регистровая записи В дисплей Ввод стековый кадр из стандартного устройства ввода Алгоритмы с клавиатуры вывода на экран с помощью мыши числа Видеопамять генераторов случайных чисел в SVGA-режимах генерации пламени в графических режимах неупакованного BCD в ASCII в текстовом режиме преобразования Видеорежимы цифры в ASCII-код SVGA шестнадцатеричного числа VGA в десятичное Виртуальная память рисования Виртуальные прерывания (в V86) круга Вложенные процедуры прямой линии Время выполнения микроопераций сортировки Вывод Ассемблер в стандартное устройство вывода директивы на экран макроопределения в VGA-режимах метки текстовом режиме модели памяти Вычисления операторы с плавающей запятой преимущества и недостатки с повышенной точностью процедуры с фиксированной запятой псевдокоманды сегменты структура программ Генераторы случайных чисел условное ассемблирование вычитаниями Атрибут символа конгруэнтные Алфавитный указатель (в Windows ELF Дата и время DOS) Дескрипторы РЕ Windows 95/NT) сегмента данных или кода SYS (в DOS) Джойстик VxD (в Windows 95) Диалоги Динамик К Динамические библиотеки Кластер Директивы ассемблера Кодировки в Коды команд Командные параметры Директории Драйверы VxD 457 блочные AAD символьные ААМ AAS ADC Завершение программы ADD Задача ADDPS Защита памяти ADDSS Защита страниц AND Защищенный режим ANDNPS адресация ANDPS модель памяти ARPL селекторы средствами DPMI 394 BOUND средствами VCPI 391 Звук BSR без программирования DMA BSWAP с программированием DMA ВТ платы BTC BTR И BTS Идентификация процессора CALL Инициализация контроллера прерываний CBW Интерфейс DPMI вызов прерываний 397 CLC обработчики прерываний 398 CLD операции над дескрипторами передача управления между CLTS режимами CMC управление памятью CMOVcc VCPI CMP Исключения CMPPS FPU CMPS CMPSS в реальном режиме CMPXCHG код ошибки CMPXVHG8B список и функции Исполняемые файлы ID COMISS DOS) 128 для DOS, Windows и CWD 32 FNSAVE CWDE 32 FNSTCW DAA 38 FNSTENV FNSTSW DAS FPATAN DEC FPREM FPREM1 FPTAN FRNDINT EMMS FRSTOR ENTER FSAVE F2XM1 FSCALE FABS FADDP FSINCOS FSQRT FBSTP FST FSTCW FCLEX FSTENV FCMOVcc FSTP FCOM FSTSW FSUB FCOMIP FSUBP FCOMP FSUBR FCOMPP FSUBRP FCOS FST FDECSTP FUCOM FUCOMIP FUCOMP FDIVRP FUCOMPP FFREE FXCH FICOMP FXRSTOR FXSAVE FYL2X FINCSTP FIST IN INC FISUBR INS INT FLD* INT3 FLDCW INTO FLDENV FMUL INVLPG FMULP FNCLEX Jcc FNINIT JCXZ FNOP JECXZ Алфавитный указатель 47 OR LAHF 58 ORPS 484 OUT LDMXCSR 103 OUTS LDS 59 PACK* LEA 34 PADD* LEAVE 53 PAND LES 59 PANDN LFS 59 PAVGB LGDT 482 PAVGW LGS 59 PCMP* 483 PEXTRW LLDT 482 PINSRW LMSW 483 LOCK LODS 56 LOOP 49 PMINSW LOOPE 50 LOOPNE 50 LOOPNZ 50 PMUL* LOOPZ 50 LSL 485 POP LSS 59 POR LTR 482 POPA POPF MAXPS 96 PREFETCH* MAXSS 96 PSADBW 97 PSLL* 97 PSRA* MOLPS 95 PSRL* MOLSS 95 PSUB* MOV 28, MOVAPS 93 PUSH MOVD 83 PUSHF MOVHLPS MOVHPS 93 PXOR MOVLHPS 93 RCL RCPPS MOVLPS 94 RCPSS RCR MOVNTPS MOVNTQ MOVQ MOVS 54 RDTSC REP MOVSS REPE REPNE MOVUPS REPNZ REPZ MUL RET RETF RETN NOP ROR NOT Assembler для DOS, Windows и RSM RSQRTPS 96 драйверы для DOS SAHF графического приложения SAL с SALC консольного приложения SAR с использованием расширителей DOS SBB Конвейеры исполнения команд SCAS Конвенции передачи параметров SETcc С-конвенция SGDT SHL смешанные SHLD Конечные автоматы SHR Консольные приложения SHRD Контроллер SHUFPS DMA SHUFW прерываний 482 Л Линейный кадровый буфер (LFB) Линия А20 Логические операции STC м STD Макроопределения STOS 56 Микрооперации 483 Младший байт SUB 35 Младший бит SUBPS 94 Многозадачность SUBSS DOS SYSENTER Модели памяти SYSEXIT Модемы TEST Мышь н UD2 Насыщение UNPCKHPS Нереальный режим UNPCKLPS Нитевая многозадачность VERR VERW 485 О WAIT Обратная польская нотация WBINVD Окружение DOS Операнды XADD Операторы XCHG в АТ&Т-ассемблерах Операционные системы XOR DOS XORPS Linux, FreeBSD, Solaris идентификация процессора Windows расширение 3D Оптимизация Компиляция программ в высокоуровневая в СОМ-файл на среднем уровне в DLL 452 низкоуровневая в 539 циклов Алфавитный указатель Организация Префиксы задержек LOCK памяти REP модели памяти REPE порядок байтов 16 REPNE REPNZ сегменты REPZ стек другие префиксы Отладочные регистры Привилегированные команды п Процедуры Палитра VGA Процессоры Память Pro и Pentium II Pentium и Pentium MMX выделение Псевдокоманды определения данных определение максимального блока UNIX освобождение Р Передача параметров Расширения страничной адресации в блоке параметров Расширенные ASCII-коды в глобальных переменных Расширители DOS в потоке кода Реальный режим в регистрах Регистры в стеке CRx в языках высокого уровня DRx отложенным вычислением MSR по возвращаемому значению общего назначения по значению данных по имени FPU по результату по ссылке сегментные Переключение слова состояния FPU банков слова управления FPU задач управления памятью Переменные среды флаги CPU Повторная X BIOS Режимы процессора в DOS Полурезидентные программы V86 Порты защищенный нереальный VGA-контроллер CRT 320 реальный VGA-синхронизатор 324 Резидентные программы клавиатура 305 выгрузка из памяти параллельный без PSP прерывание последовательный пассивные и активные Предсказание переходов повторная входимость Прерывания полурезидентные программы DPMI спецификация AMIS в защищенном режиме инициализация контроллера С обработчики прерываний Сегмент состояния задачи от внешних устройств Сегментная адресация разрешение и запрещение в защищенном режиме Префикс программного сегмента (PSP) Сегменты для DOS, Windows и Сектор Секции Управление задачами Селекторы Управляющие регистры Символы ASCII Управляющие символы ASCII Система счисления Уровень вложенности двоичная Условные переходы Устройства Системные видеоадаптеры VGA джойстик UNIX динамик Win32 запись в устройство Системный таймер звуковые платы на уровне BIOS клавиатура на уровне портов ввода-вывода контроллеры Скорость выполнения команд 570 DMA Слово прерываний Сообщения (в Windows) 422.

Pages:     | 1 |   ...   | 6 | 7 | 8 |    Книги, научные публикации