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

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

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

stack_start db 100h dup(?) stack_l = $-stack_start ;

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

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

task_3: ;

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

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

task_3: ;

При инициализации DS должен быть установлен на PM_seg.

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

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

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

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

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

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

U при переключении в задачу, TSS которой содержит установленный флаг VM;

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

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

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

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

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

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

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

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

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

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

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

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

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

При вызове обработчика, находящегося в защищенном режиме, из реального режима в стек нулевого уровня привилегий помещаются GS, FS, 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, обращение к нему из У86-задачи при водит к исключению #GP;

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

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

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

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

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

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

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

Несмотря на то что при программировании для UNIX обычно употребляется исключительно язык С, пользоваться ассемблером в этих системах можно, и даже очень просто. Программы в UNIX выполняются в защищенном режиме с моде лью памяти flat и могут вызывать любые функции из библиотеки libc или других библиотек точно так же, как это делают программы на С. Конечно, круг задач, для которых имеет смысл.использовать ассемблер в UNIX, ограничен. Если вы не за нимаетесь разработкой ядра операционной системы или, например, эмулятора DOS, практически все можно сделать и на С, но иногда нужно создать что-то осо бенное. Написать процедуру, выполняющую что-то как можно быстрее (напри мер, воспроизведение звука из файла в формате МРЗ), или программу, использу ющую память более эффективно (хотя это часто можно повторить на С), или программу, применяющую возможности нового процессора, поддержка которого еще не добавлена в компилятор, оказывается очень просто (если вы знаете ассем блер для UNIX).

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

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

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

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

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

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

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

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

Синтаксис AT&T 'Х;

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

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

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

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

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

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

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

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

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

Qb-байт;

Qw- слово;

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

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

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

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

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

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

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

Ассемблер в среде UNIX // cbw cbtw // cwde cwtl // cwd cwtd // cdq cltd Но многие ассемблеры понимают и принятые в Intel формы для этих четырех команд.

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

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

// mov ax,bx movw %bx,%ax // imul eax,ecx, imull $16,%есх,%еах У всех префиксов перед командой, для которой данный префикс предназна чен, есть имена, как у обычных команд. Имена префиксов замены сегмента - segcs, segds, segss, segfs, seggs;

имена префиксов изменения разрядности адреса и операн да - addrl 6 и data 16:

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

movl %fs:variable,%eax 11.1.3. Адресация Регистровый операнд всегда начинается с символа %:

// xor edx,edx xorl %eax,%eax Непосредственный операнд всегда начинается с символа $:

Операторы ассемблера // mov edx,offset variable Х movl $variable,%edx.

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

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

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

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

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

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

- - умножение;

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

% - остаток;

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

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

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

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

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

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

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

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

+ - сложение;

вычитание.

,'Х';

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

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

Байты:

.byte выражение...

Слова:

.word выражение... или.hword выражение... или.short выражение...

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

.int выражение... или.long выражение...

Учетверенные слова (8-байтные переменные):

.quad в ы р а ж е н и е...

16-байтные переменные (окта-слова):

.octa выражение...

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

. f l o a t ч и с л о... или.single ч и с л о...

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

.double ч и с л о,..

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

.tfloat число...

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

.ascii строка...

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

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

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

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

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

.Icomm символ, длина, выравнивание// Зарезервировать указанное число байтов // для локального символа в секции. bss.

77.3.2. Директивы управления символами Присвоение значений символам:

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

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

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

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

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

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

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

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

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

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

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

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

ЁИЭИНЯШЙ;

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

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

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

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

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

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

Q тип (для ELF):

- @progbits - содержит данные;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

.if выражение.ifdef символ.ifndef символ или. ifnotdef символ.else.endif Выдать сообщение об ошибке:

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

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

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

.irp симол, значение...

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

.irpc символ, строка. endr Внутри блока повторения на символ можно ссылаться, начиная его с обратной косой черты (то есть как \символ). Например, такой блок.irp param,1,2, movl %st(0),%st(\param).endr I Ассемблер в среде UNIX как и такой.irpc param, movl %st(0),%st(\param).end г ассемблируется в:

movl %st(0),%st(1) movl %st(0),%st(2) movl %st(0),%st(3) 11.3.9. Макроопределения Начало макроопределения:

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

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

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

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

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

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

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

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

// Для компиляции в формат ELF.

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

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

// (пути к файлу crtl.o могут отличаться на других системах) // Solaris с SunPro С // Id --s -о helloelf.sol helloelf.o /opt/SUNWspro/SC4.2/lib/crt1.o -lc // Solaris с GNU С // Id -s -o helloelf.gso helloelf.o // /opt/gnu/lib/gcc-lib/i586-cubbi-solaris2.5.1/2.7.2.3.f.1/crt1.o -lc // Linux // Id -s -m elf_i386 -o helloelf.lnx /usr/lib/crtl.o /usr/lib/crti.o // -L/usr/Hb/gcc-lib/i586-cubbi-linuxlibd/2.7.2 helloelf.o -lc -Igcc // /usr/lib/crtn.o // или gcc -o helloelf.lnx helloelf.o.text // Код, находящийся в файлах crt*.o, передаст управление на процедуру main // после настройки всех параметров.

.globl main main:

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

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

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

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

ret.data message:

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

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

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

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

// as -o hellocof.o hellocof.s // Id -s -о hellocof.bsd /usr/lib/crtO.o hellocof.o -lc И'^ Ассемблер в среде UNIX.text.globl _main _main:

pushl Smessage call _puts popl %ebx ret. data message:

.ascii "Hello world\0" Пользуясь этой техникой, можно создавать программы точно так же, как и на С, но выигрыш за счет того, что на ассемблере допускается соптимизировать програм му на несколько процентов лучше, чем это сделает компилятор с С (при максималь ной оптимизации), окажется небольшим по сравнению с потерей переносимости.

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

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

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

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

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

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

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

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

// as -o hellolnx.o hellolnx.s // Id -s -o hellolnx hellolnx.o.text.globl _start _start:

// Системный вызов S4 "write", параметры в Linux помещают слева направо, // в регистры %еах, %ebx, %ecx, %edx, %esi, %edi.

movl $4,%eax xorl %ebx,%ebx incl %ebx // %ebx = 1 (идентификатор stdout) movl $message,%ecx movl $message_l,%edx // Передача управления в ядро системы - прерывание с номером 80п.

int $0x // Системный вызов й1 "exit" (%еах = 1, %ebx = 0).

xorl %eax,%eax incl %eax xorl %ebx,%ebx int $0x hit.data message:

.string "Hello world\012" message_l =.-message Linux является уникальным случаем по отношению к системным вызовам. В бо лее традиционных UNIX-системах - FreeBSD и Solaris - системные вызовы реали зованы согласно общему стандарту SysV/386, и различие в программах заключает ся лишь в том, что ассемблер, поставляемый с FreeBSD, не поддерживает некоторые команды и директивы.

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

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

// as -o hellobsd.o hellobsd.s // Id -s -o hellobsd hellobsd.o Ассемблер в среде UNIX. text.globl _start _start:

// Системная функция 4 "write".

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

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

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

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

movl $4,%eax // Параметр 1 - номер функции в еах.

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

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

. byte ОхЭа.long О.word // Восстановить стек.

addl $16,%esp // Системный вызов 1 "exit".

xorl %eax,%eax pushl %eax %eax incl pushl %eax // Icall $7,:{.byte Ox9A.long.word hit. data message:

.ascii "Hello world\0l2" message_l =. -message И теперь то же самое в Solaris:

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

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

// as -о hellosol.o hellosol.s // Id -s -o hellosol hellosol.o //.text.globl _start Переносимая программа для UNIX _start:

// Комментарии - см. hellobsd.s.

pushl $message_l pushl $message.

movl $4,%eax %eax pushl $7,$ Icall addl $16,%esp xorl %eax,%eax %'eax pushl %eax incl %eax pushl Icall $7,$ hit.data message:

.string "Hello world\012" message_l =. -message Конечно, создавая данные программы, мы нарушили спецификацию SysV/ ABI несколько раз, но лишь потому, что не обращались ни к каким разделяемым библиотекам, это прошло незамеченным. Требования к полноценной программе сильно отличаются в различных операционных системах, и все они выполнены с максимально возможной тщательностью в файлах crt*.о, которые мы подключа ли в примере с использованием библиотечных функций. Поэтому, если вы не зада етесь целью сделать программу абсолютно минимального размера, гораздо удобнее назвать вашу процедуру main (или _main), добавляя crt*.о и -1с при компоновке.

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

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

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

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

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

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

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

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

Поскольку имена большинства системных вызовов разнятся, разместим их в от дельном файле config.i, который будет включен в программу директивой.include:

// Способ обращения к системному вызову (установить // SYSCALL_linux в 1, если используется int $0x80, и // SYSCALL_unix = 1, если используется Icall $7,$0).

SYSCALL_linux = О SYSCALL_unix = // Максимальная длина пути (из limits.h).

МАХ_РАТН = // Стратегия для pwd:

// 1, если используется системный вызов getcwd(), PWD_sys = // 1, если используется файл /proc/self/cwd, PWD_p.roc = // 1, если используется обычный (переносимый) алгоритм, PWD_posix = О // 1, если используется переменная среды PWD.

PWD_env = О // Номера используемых системных вызовов (из sys/syscalls. h):

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

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

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

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

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

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

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

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

SYSCALL_GETDIRENTRIES = Переносимая программа для UNIX // stat() - 188 на FreeBSD, 106 на Linux.

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

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

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

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

// Размер struct dirent:

// 1024 на FreeBSD, 266 на Linux.

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

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

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

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

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

DIRENT_NAME = // Размер структуры stat и смещения ее элементов:

// dev, ino и nlink.

SIZE_STAT = ST_OEV = О ST_INO = 4, ST_NLINK = Для всех пунктов этого файла можно написать сценарий с целью автоматичес кого конфигурирования, аналогичный GNU autoconfigure, при использовании ко торого модификация вручную будет не нужна. Этот сценарий, а также другие про стые программы на ассемблере для UNIX доступны в Internet по адресу: www.Iionking.org/-cubbi/serious/asmix.html.

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

// Включение файла config.i.

.include "config.i" // Начало программы.

.globl _start _start:

.if PWD_posix // Переносимая (и сложная) стратегия для pwd.

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

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

movl $pt_buffer+1024-l,%ebp // Искомый путь инициализируется символом перевода строки.

movl SOxOA,(%ebp) // В %esi будет храниться указатель на путь вида "../../", movl $up_buffer,%esi // инициализированный как "ДО".

movw $Ox002E,up_buffer // Выполнить stat("/"), чтобы определить inode и dev для корневого каталога // (по ним мы позже установим, когда он будет достигнут),.if SYSCALL_unix pushl $st_stat pusnl $root_path movl $SYSCALL_STAT,%eax pushl %eax.byte Ox9A.long.word addl $12,%esp..endif.if SYSCALL linux movl $st_stat,%ecx movl $root_path,%ebx movl $SYSCALL_STAT,%eax int $0x.endif test! %eax,%eax jnz error_exit // Сохранить dev и inode корневого каталога,.movl st_stat+St_DEV,%eax movl %eax,root_dev movl st_stat+ST_INO,%eax movl %eax,root_ino // Главный цикл - перемещение по каталогам.

main_posix_cycle:

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

.if SYSCALL_unix pushl $st_stat pushl $up_buffer movl $SYSCALL_LSTAT,%eax pushl %eax.byte Ox9A.long.word addl $12,%esp.endif Переносимая программа для UNIX.if SYSCALL_linux movl $st_stat,%ecx movl $up_buffer,%ebx movl $SYSCALL_LSTAT,%eax int $0x.endif testl %eax,%eax jnz error_exit // Сохранить inode и dev каталога, который сейчас будет сканироваться.

movl st_stat+ST_DEV,%eax movl %eax,dev movl st_stat+ST_INO,%ebx movl %ebx,ino // Проверить, не совпадает ли этот каталог с корневым.

cmpl %eax,root_dev jne posix_not_finished cmpl %ebx,root_ino jne posix_not.finished // Если совпадает - вписать последний символ "/" на левом конце искомого пути decl %ebp movb $Ox2F,(%ebp) // и вывести его на экран.

jmp posix_write // Иначе posix_not_finished:

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

movw $Ох2Е2Е,(%esi) incl %esi.incl %esi movb $0,(%esi) // Открыть данный каталог только для чтения (0_RDONLY).

.if SYSCALL_unix pushl $ pushl $up_buffer movl $SYSCALL_OPEN,%eax pushl %eax.byte Ox9A.long.word addl $12,%esp ^.endif.if SYSCALLJLinux movl $0,%ecx movl $up_buffer,%ebx movl $SYSCALL_OPEN,%eax int $0x.endif Ассемблер в среде UNiX testl %eax,%eax error_exit movl' %eax,%edi // Выполнить fstat над этим каталогом.

.if SYSCALL_unix pushl $st_stat pushl %eax movl $SYSCALL_FSTAT,%eax pushl %eax. byte ОхЭА.long.word addl $12,%esp. endif.if SYSCALL_linux movl $st_stat,%ecx movl %eax,%ebx movl $SYSCALL_FSTAT,%eax int $0x.endif testl %eax,%eax jnz error_exit // Если все в порядке, добавить "/" для следующего каталога.

movb $Ox2F, (%esi) incl %esi // Вложенный цикл: рассмотреть каждую запись в вышележащем Х// каталоге и сравнить ее inode и dev с текущей.

xorl %ebx,%ebx readdir_cycle:

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

.if SYSCALL_READDIR.if SYSCALL_unix pushl $ pushl $dirent pushl %edi movl $SYSCALL_READDIR,%eax pushl %eax. byte ОхЭА.long.word Х addl $16,%esp.endif.if SYSCALL_linux movl $1,%edx movl $dirent,%ecx movl %edi,%ebx movl $SYSCALL_READDIR,%eax int $0x.endif Переносимая программа для UNIX // В $ebx будет структура dirent, над которой мы 'работаем в настоящий момент.

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

testl %ebx,%ebx jz Х time_to_getdent xorl %eax,%eax movw DIRENT_LEN(%ebx),%ax addl %eax,%ebx // Проверить, выйдет ли %ebx за пределы буфера после добавления LEN.

xorl %еах,%еах DIRENT_LEN(%ebx),%ax movw dirent_filled,%eax cmpl jge time_to_getdent DIRENT_LEN(%ebx),%ax movw testl %еах,%еах jnz skip_getdent time_to_getdent:

// Если выходит - пора делать getdentsO или getdirentries() // в зависимости от операционной системы,.if SYSCALL_unix.if SYSCALL_GETDENTS $SIZE_DIRENT pushl pushl Sdirent pushl %edi $SYSCALL_GETDENTS,%eax movl %eax pushl.byte Ox9A.long.word addl $16,%esp.else pushl $basep pushl $SIZE_DIRENT pushl Sdirent pushl %edi movl $SYSCALL_GETDIRENTRIES,%eax pushl %eax.byte Ox9A.long.word addl $20,%esp.endif.endif Ассемблер в среде UNiX.if SYSCALL linux movl $SIZE_DIRENT,%edx movl $dirent,%ecx movl %edi,%ebx movl $SYSCALL_GETDENTS, %eax int $0x.endif movl %eax,dirent_filled testl %eax,%eax notfound je $dirent,%ebx movl skip_getdent:

.endif * // Скопировать в сканируемом каталоге имя полученной записи // в конец строки../../, не смещая указатель в %esi.

xorl %есх,%есх. pushl %esi %edi pushl movl %esi,%edi movl %ebx,%esi addl $DIRENT_NAME,%esi movw DIRENT_LEN(%ebx),%cx %ecx incl rep movsb %edi popl %esi ' popl // Выполнить lstat() для этой записи, чтобы получить ее inode и dev %ebx pushl.if SYSCALL_unix pushl $st_stat pushl $up_buffer movl $SYSCALL_LSTAT, %eax %eax pushl.byte Ox9A.long.word addl $12,%esp.endif.if SYSCALL_linux movl $st_stat,%ecx movl $up_buffer,%ebx movl $SYSCALL_LSTAT,%eax int $0x. endif %ebx popl testl %eax,%eax jnz readdir_cycle Переносимая программа для UNIX // Если они не совпадают с сохраненными inode и dev для // текущего сканируемого,каталога - продолжить.

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

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

cmpb $1, first je not_first decl %ebp movb $Ox2F,(%ebp) not_first:

movb $0,first // Сдвинуть указатель в %ebp на namlen байтов влево.

xorl %edx,%edx.if SYSCALL_READDIR movw DIRENT_LEN(%ebx),%dx.else pushl %esi xorl %ecx,%ecx movl %ebx,%esi addl $DIRENT_NAME,%esi seek zero:

%ecx incl (%esi,%ecx,l),%al movb testb seek zero jnz movl %ecx,%edx popl %esi.endif subl %edx,%ebp // Скопировать имя найденного каталога в pwd, не сдвигая указатель.

%ecx,%ecx xorl pushl %esi pushl %edi movl %ebp,%edi movl %ebx,%esi addl $DIRENT_NAME,%esi.if SYSCALL_READDIR movw DIRENT_LEN(%ebx),%CX.else movl %edx,%ecx.endif rep Ассемблер в среде UNIX movsb popl %edi popl %esi // Закрыть открытый каталог,.if SYSCALL_unix %edi pushl movl $SYSCALL_CLOSE,%eax %eax pushl. byte Ox9A.long.word $8,%esp addl.endif.if SYSCALL_linux movl %edi,%ebx movl $SYSCALL_CLOSE,%eax int $0x.endif // Продолжить главный цикл, пока не будет достигнут корневой каталог, jmp main_posix_cycle notfound:

jmp error_exit posix_write:

// Вывести на экран найденный путь.

movl $pt_buffer+1024,%edx Х subl %ebp,%edx movl %ebp,%ecx xorl %ebx,%ebx %ebx incl.if SYSCALL_unix %edx pushl %ecx pushl %ebx pushl movl $SYSCALL_WRITE, %eax %eax pushl. byte Ox9A.long.word addl $16,%esp.endif.if SYSCALL_linux movl $SYSCALL_WRITE,%eax int $0x.endif.endif // Конец стратегии PWD_posix.

// Просто распечатать значение переменной среды PWD (плохая стратегия),.if PWD_env eld Переносимая программа для UNIX %ebx popl movl 4(%esp,%ebx,4),%edi // Теперь адрес списка переменных в %edi.

xorl %еах,%еах // Сканирование переменных в поисках той, начало которой совпадет с env_name.

env_scan_cycle:

$0,X%edi) cmpl jz error_exit movl $env_name,%esi $env_name_l,%ecx movl repe cmpsb jcxz found_variable %ecx,%ecx xorl %ecx decl repne scasb jmp env_scan_cycle // Теперь %edi - адрес значения переменной PWD, заканчивающийся нулем.

found_variable:

%edx,%edx xorl %edx decl // Найти его длину loop_zero_scan:

%edx incl $0,(%edi,%edx,1) cmpb jne loop_zero_scan $OxOA,(%edi,%edx,1) movb %edx incl // и вывести на экран.

.if SYSCALLjjnix %edx pushl %edi pushl $ pushl $SYSCALL_WRITE,%eax movl %eax pushl Ox9A. byte.long.word $16,%esp addl.endif.if SYSCALL_linux %edi,%ecx movl movl $1,%ebx $SYSCALL_WRITE,%eax movl int.endif.endif Ассемблер в среде UNIX // Стратегия ргос - выводится имя каталога, на который // указывает символическая ссылка /proc/self/cwd.

.if PWD_proc // Вызвать readlink("/proc/self/cwd").

movl $255,%edx movl $linux_buffer,%ecx movl $linux_pwd,%ebx movl $SYSCALL_READLINK,%eax // Эта стратегия осуществима только в Linux, int $0x.endif // Стратегия с использованием системного вызова.

.if PWD_sys // Вызвать getcwd().

.if SYSCALL_unix pushl $MAX_PATH pushl $linux_buffer movl $SYSCALL_GETCWD,%eax %eax pushl. byte Ox9A.long f.word addl $12,%esp.endif.if SYSCALL_linux movl $MAX_PATH,%ecx movl $linux_buffer,%ebx movl $SYSCALL_GETCWD,%eax $0x int.endif testl %eax,%eax error_exit js decl %eax // В случае с FreeBSD надо дополнительно определить длину возвращенной строки.

.if SYSCALL.unix xorl %eax,%eax xorl %ecx,%ecx %ecx decl movl $linux_buffer,%edi repne scasb subl $linux_buffer,%edi movl %edi,%eax %eax incl.endif.endif // Вывод на экран для стратегий ргос и sys.

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

Переносимая программа для UNIX.if PWD_proc | PWD_sys $OxOA, linux_buf fer(%eax) movb %eax incl // Вывести на экран linux Дbuffer.

.if SYSCALL_ unix %eax pushl $linux_buffer pushl pushl $ movl $SYSCALL_WRITE,%eax %eax pushl. byte Ox9A,.long.word addl $16,%esp.endif.if SYSCALL_ linux %eax,%edx movl xorl %ebx,%ebx $linux_buf f er, %ecx movl %ebx incl $SYSCALL_WRITE,%eax movl int $0x.endif.endif // Выход из программы без ошибок exit(O)-.

exit:

xorl %ebx,%ebx.if SYSCALL unix pushl %ebx movl $SYSCALL_EXIT,%eax pushl %eax.byte Ox9A.long.word.endif.if SYSCALL_linux movl $SYSCALL_EXIT,%eax int $0x.endif // Выход из программы с ошибками.

.if ~(-PWD_proc) exit_errno:

exit_ENOENT:

error_exit:

.if SYSCALL_unix.

Хpushl $ $SYSCALL_EXIT,%eax movl Ассемблер в среде UNIX %eax pushl.byte Ox9A.long.word.endif.if SYSCALL_linux xorl %ebx,%ebx %ebx incl movl $SYSCALL_EXIT,%eax $0x int.endif.endif // Область данных!

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

pwd_path:

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

root_path:

.ascii "/\000" // Флаг, нужный для того, чтобы не ставить "/" перед первым элементом пути, first:

.byte.endif // Имя файла в /ргос для readlink().

.if PWD_proc linux_pwd:

.ascii "/proc/self/cwd\000".endif // Переменная среды для стратегии PWD.

.if PWD_env env_name:

.ascii "PWD=" env_name_l =. -env_name.

.endif // Указатель для системного вызова getdirentries().

.if SYSCALL_GETDIRENTRIES basep:

.long.endif.bss // Буфер для stat().

.if PWD_posix.Icomm st_stat,SIZE_STAT.endif Переносимая программа для UNiX " ^Й // Буфер для результата работы getcwd() и readlink().

.if PWD_proc | PWD_sys.Icomm linux_buffer,MAX_PATH.endif.if PWD_posix // Буфер для вывода pwd.

.Icomm pt_buffer, // Буфер для сканируемого каталога (../../).

.Icomm up_buffer,.endif // Различные переменные,.if PWD_posix.Icomm root_dev,.Icomm dev,.Icomm root_ino,.Icomm ino,.Icomm bpt, // Буфер для записи из каталога (dirent).

.Icomm dirent, SIZEJHRENT.if SYSCALL_GETDENTS | SYSCALL_GETDIRENTRIES.Icomm dirent_filled,.endif.endif N Для компиляции этой программы на любой системе достаточно двух команд:

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

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

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

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

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

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

но и работают быстрее, потому что обращаются напрямую к ядру системы.

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

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

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

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

0 1 2 3 4 5 67 8 9 A B C D E F в * В В ** в * Г о й d Ч Л т 1 - г т л- л.

< !!. з 41 л 1_ ^ () S t и + - / &j ж.

X j = 5 67 ^ < > 4 8 0 1 2 3 : V н м & FG I J А В С D Е К L N и ] иU л.

R Ч Q Р S Т X V Z [ fg л.

i h Ъ k а с m п е d 1 о j q > ц i. i г s " t z Р У U X V U Рис. 18. Таблица символов ASCII Приложение 2. Управляющие символы ASCII Таблица 23. Управляющие символы ASCII Назначение Ctrl-код Имя Код Пусто (конец строки) "@ NUL Начало заголовка Л ЗОН А Начало текста STX "В Конец текста Л EOT С Конец передачи "D 4 ENQ Подтверждение Я Р АСК Звонок Я BEL С Шаг назад Я Н 8 BS Горизонтальная табуляция я !

НТ Перевод строки LF ОА "J Вертикальная табуляция VT "К 0В Перевод страницы FF "L ОС Возврат каретки CR _j Я М OD Выдвинуть Я Ы SO ОЕ Сдвинуть Л OF SI Оставить канал данных р OLE Управление устройством- DC1/XON 11 'Q Управление устройством- Я П 12 DC Управление устройством- DC3/XOFF "S Управление устройством- Т 14 DC я и Отрицательное подтверждение NAK Синхронизация "V SYN Конец блока передачи "W ETB я х Отмена CAN Конец носителя Я У EM Замена SUB "Z 1А "[ Escape 1В ESC "\ Разделитель файлов 1C FS "] Разделитель групп 1D GS Разделитель записей 1Е RS л л Разделитель полей 1F US Пробел 20 SP Удаление 7F DEL л ?

Таблицы символов ь.Щ 3. Кодировки второй половины ASCII Кодировка по умолчанию для первых компьютеров - этот набор символов хра нится в постоянной памяти и используется BIOS (см. рис. 19) О 1 А В D АА *, С е i' Л и a a 9е a ё ё a Л V Л ч, i и \ Ё зе Ж о иУ / 6 О Pts Л Л V Ф U a о f оипN г -т а л г~ i i У / = J J -= XvXv 1 т!

- J] И j_ = - Ik IF JL IF = 1Г JL L _L Т -Ч тг Х 1Х J JL IL 1= F IT ТТ Х Г а В г я Z о м- т Ф (Э Q 8 п Фs J =+><[ ХV о - п -г- r**j Х Рис. 19. Кодировка IBM cp Кодировка ср866 используется DOS-приложениями как основная кодировка и компьютерной сетью Fidonet как транспортная кодировка (см. рис. 20).

В С D Е F О гЛ и м АБВ ЕЖ3И КЛ НОП УФ Щъ ы ь Э ЮЯ X ЦЧШ РСТ бвг мноп е ж к а и А Й Л j =J Н - 11 1 J J V.V.V.

И i + > IF LL JIF ХЛ7/Л 1- 1!= = JL.L LX Jk 1г Ч:

Т 1Г F [Г i + I IL JL Х 1= ТТ Х Г Х цчш РстУ щъ ы ь э юя ФX Ёё ее Х V №п о У ХУ I "i Х Рис. 20. Кодировка IBM cp Приложение Кодировка КО18-Г используется как транспортная в Internet и как основная в большинстве бесплатно распространяемых операционных систем (см. рис. 21).

9 А В С D E F О J J_ L - Т ГП Ч Х Х V ХХ Г <> Ш SS I J ~ Х Х 1 1L JJ If =1 Fё Ik = J = = т!

IT J.

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

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

О 1 В С D Е \ и а т> 1Ъ К JL %0 Лэ < г Г S t 3 ъ р тм л> > № к h ц ее ХЧ Ч с 3 ^ J з й Q л Чi - о I а Г ii УУ Ё I о г м- If Х ё № е ) S s мн вг АБ Д ЕЖ 3ИИ К Л ОП тУ ьэ Ф X - Ч ШЩ Ъ Ы РС ЮЯ 6в мноп г е иик а ж А ц шЩъ ы ь э юя т ч с У ФX Р Рис. 23. Кодировка ср Приложение 4. Коды символов расширенного ASCII Таблица 24. Расширенные ASCII-коды' Клавиша Клавиша Клавиша Код Клавиша Код Клавиша Код Код Код 87h Alt-Tab Shift-F Alt-R 13h A5h AIM 17h F1 3Bh 88h Ctrl-Tab Alt-J Alt-S Shift-F12 94h 24h IFh 3Ch F 81h Alt- К Alt- Del Alt-T Alt-0 A3h 25h 14h F3 3Dh 82h Alt-L Alt- End 26h Alt- U 16h AIM 9Fh 3Eh F 83h KAIt-2 Alt- Home Alt-V Ctrl-Right 2Fh 97h 74h 3Fh F 84h Alt- Ins 75 h Alt-W Alt- 11h A2h 40h F6 _CtrNEnd, 85h Alt-PgUp Ctrl-Home Alt-X Alt- 2Dh 99h 77h 41h F 86h Alt-PgDn Ctrl-PgDn Alt-Y Alt- 1Sh A1h 76h F8 42h Alt- Enter Ctrl-PgUp Alt- Alt-Z Kh 2Ch 87h 84h 43h F Ctrl-F1 Alt- Up Alt-\ Alt- 7 5Eh 98h 2Bh 88h F10 44h Alt- Down Ctrl-F Alt- 8 5Fh AOh Alt-, 89h F11 85h 33h Ctrl-F3 Alt- Left Alt-. Alt- 9 8Ah 60h 9Bh 86h 34h F Ctrl-F4 Alt- Right AltC Alt-Fl 61h Alt-/ 8Bh 9Dh 68h 35h Ctrl-F5 Alt-K/ Alt-BS Alt-= 62h AII-F2 8Ch A4h 69h OEh Alt-K* Ctrl-F Alt-[ AII-F3 NUL 03h 63h 37h 6Ah 1Ah Ctrl-F7 Alt-K- ' ХAlt-] Shift- Tab Alt-F4 OFh 64h 6Bh IBh 4Ah 65 h Ctrl-F Alt-;

Alt-K+ Alt-FS 6Ch 27h Ins 52h 4Eh Alt-Kenter Ctrl-F9 66h Alt-' Alt-F6 28h 53h A6h 6Dh Del SysRq Ctrl-FlO Alt-1 Ctrl-K/ 72h 67h Alt-F7 6Eh 29h 95h Ctrl-FII Ctrl-K* Down Alt-F8 50h 89h 96h 6Fh 54h Shift-F Ctrl-F Left Ctrl-K Shift- F Alt-F9 55h 4Bh 8Ah 8Eh 70h Ctrl-K-f Shift-F3 Right Alt- A 4Dh Alt-FlO 71h 56h lEh 90h Up Ctrl-K AH-F11 Shift- F4 Alt- В 48h 30h 8Bh 57h 8Dh End Alt- С Shift- F5 Ctrl-K Alt-F12 4Fh 2Eh 8Ch 58h 8Fh Alt-M Shift- F6 Home Alt-D Ctrl- К 32h 59h 47h 20h 91h Alt-N Shift-F7 PgDn Alt-E Ctrl-KO 31h 5Ah 12h 92h S1h Alt-0 Shift- F8 PgUp Alt-F Ctrl-K.

18h 93 h 5Bh 49h 21h Alt-P Shift-F9 Ctrl- Left Alt-G 19h 5Ch 73h 22h Alt- Esc Shift-FlO Alt-Q Alt-H 5Dh Olh 10h 23h Префикс К соответствует клавишам на цифровой клавиатуре.

Таблицы символов 5. Скан-коды клавиатуры Таблица 25. Скан-коды Клавиша Клавиша Клавиша Код Код Код Клавиша Код 01Ь Enter 1Ch 52h Esc К* 37h Ins 1! 53h Ctrl 02h 1Dh ' Alt 38П Del 2@ 1Eh 54h 03h A 39h SysRq SP 04h 1Fh 56h Caps Macro S 3Ah 3# 05h D 20h F1 3Bh F11 57h 4$ 21h 06h F F2 3Ch F12 58h 5% 22h 07h 3Dh PA1 5Ah 6" G F F13/LWin 08h 23h F4 3Eh 5Bh 7& H FU/RWin 09h !J 24h 3Fh 5Ch F 8* 25h 5Dh F15/Menu OAh F6 40h К 9( 26h F OBh 41h 63h L F 0) 27h OCh 42h F17 64h F ;

:

-_,..

=+ 28h 43h ODh F9 F18 65h 29h 66h OEh F10 44h F BS 2Ah Num OFh 45h F20 67h Lshift Tab Scroll 2Bh 46h F21 68h Q 10h \l 2Ch W 11h 47h F22 69h Home Z 2Dh 48h 6Ah Е 12h - F X с PgUp 3Eh 49h F R 13h 6Bh EraseEOF Т 2Fh K- 4Ah 6Dh V 14h в 30h Copy/Play Y 15h 4Bh 6Fh и CrSel N 31h 4Ch 72h 16h K I 4Dh 73h Delta 17h M 32h Хо,< 33h 4Eh ExSel K+ 74h 18h р.> Clear 34h 4Fh End 76h 19h [{ Т 35h 50h 1Ah /?

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

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

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

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

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 - коэффициент масштабирования;

биты 5-3:1 - индексный регистр;

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

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

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

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

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

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

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

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

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

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

Запись lOdw будет означать, что код команды - OOOlOOdw.

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

000 - AL/AX/EAX/ST(0)/MMO/XMMO 001 - CL/CX/ECX/ST(1)/MM1/XMM 010 - DL/DX/EDX/ST(2)/MM2/XMM 011 - BL/BX/EBX/ST(3)/MM3/XMM 100 - AH/SP/ESP/ST(4)/MM4/XMM 101 - CH/BP/EBP/ST(5)/MM5/XMM 110 - DH/SI/ESI/ST(6)/MM6/XMM 111 - BH/DI/EDI/ST(7)/MM7/XMM Запись С8г будет означать 11001 reg.

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

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

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

- 0000 - О 0001 - NO 0010-C/B/NAE ООН -NC/NB/AE 0100 - E/Z 0101 - NE/NZ 0110-BE/NA 0111-NBE/A 1000-S 1001 - NS 1010 - Р/РЕ 1011 -NP/PO 1100- L/NGE 1101-NL/GE 1110-LE/NG 1111-LNE/G Запись типа 4сс будет означать OlOOcond.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Q г8 - АН, AL, BH, BL, DH, DL, CH, CL;

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

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

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

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

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

а xmm - регистр SSE;

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

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

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

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

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

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

О VM - режим V86;

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

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

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

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

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

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

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

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

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

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

Q 80286: TS = 280.

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

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

36h: SS:

3Eh: DS:

26h: ES:

64h: FS:

65h: GS:

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

ARPL m,r 35 10 7 8 NP 62 /r 13 С BOUND r,m 6..34 NP 6.. 10+3n OF BC /r 2m BSFr16,r 6.. 42 2m 10+3n OF BC /r 6..42 NP BSF r32,r OF BC /r 6.. 43 6.. 35 NP 10+3n 3m BSFr16,m 10+3n OF BC /r 6..43 6..43 NP 3m BSF r32,m OF BD /r 6..103 2m 10+3n 7..39 NP BSRr16,r OF BD /r 7.. 104 7..71 NP Г2пГ 10+3n BSR r32,r 6.. BSR r16,m16 OFBD/r 10+3n 7..40NP 3m OF BD /r 7.. BSR r32,m32 10+3n 7..72 NP 3m OFCSr 1 NP 2m BSWAP r OF A3 /r BTr.r 3 3 4 NP 1m OF A3 /r ВТ m,r 12 9 NP 8 С OF BA /4 ib ВТ r,i8 3 3 4NP 1m ВТ m,i8 OF BA /4 ib 4NP 2m ETC r,r OF BB /r 6 6 7NP 1m OF BB /r BTC m,r 13 13 | 13 NP С BTC r,i8 OF BA /7 ib 6 7 NP 6 1m Команды Intel 80x Таблица 27. Команды (продолжение) 80286 Команда 8087 Код P 80486 P 80287 4m ВТС m, i8 OF BA /7 ib 8 8 8 NP BTR г,г OF B3 /r 7 NP 1m 6 BTR т, г OF B3 /r 13 13 13 NP С BTR г, 18 OF BA /6 ib 7 NP 1m 6 BTR т, 18 OF BA /6 ib 8 8 8 NP 4m BTS г, г OF AB /r 6 6 7NP 1m OF AB /r 13 13 NP BTS т, г 13 С 7 NP 1m BTS г, 18 OF BA /5 ib 6 8 8 NP 4m BTS т, 18 OF BA /5 ib CALL near im E8 im 7 7 1 PV 4m 23 CALL near r FF/2 13 7 5 2NP С CALL near т 29+ea FF/2 19 10 5 2 NP С CALL far im 9A im 36 23 13 4NP С (RM) CALL far im 9Aim 26 4..13 NP С (PM) 41 CALL im (CG) 9Aim 22 NP С CALL im 9Aim 82 44 NP 86 С (CG/in).CALLim (TS) 9Aim 21+TS NP TS _j 37+TS С CALL im (TG) 9Aim 27+TS 22+TS NP TS С CALL far т 16 53+ea FF/3 38 17 4NP С (RM) _, CALL far т 5..14NP. FF/3 29 38 20 С (PM) 44 CALL т CG FF/3 35 22 NP С 83 CALL т CG/in FF/3 69 44 NP С CALL т TS TS 37+TS 21+TS NP FF/3 С CALL т TG 37+TS 22+TS NP FF/3 TS С 2 2 3 3 NP CBW 98 2 3 1т 2 2 NP 99 1т CDQ 2 2 2 2 2NP 1т CLC F 2 2 2 2 2NP 2 4т CLD FC 7NP С 2 3 3 CLI -- FA 2 5 7 10 NP С OF CLTS 2NP 2 2 2 2 1т CMC F 2т OF 4cc /r CMOVcc r,r Зт OF 4cc /r CMOVcc r,m 1 1 UV 1т 4 3 3Cw im CMP ac.im 3 1 1 UV 1т 4 80sw /7 im CMP r.im 2UV 2т 6 5 80sw /7 im 14+ea CMP m,im Приложение Таблица 27. Команды (продолжение) 80286 Код P5 P Команда 8087 80186 80287 2 1 1 UV CMP r,r 3 2 1m 38dw /r 7 5 2 2UV 2m CMPm.r 38dw /r 13+ea CMP r,rn 6 2 2UV 2m 38dw /r 10 10+ea 30 10 5 NP 22 8 8 С A CMPSB 9+30n 5+22n 5+9n 5+9n 7+7n 9+4n NP F2/3 A6 С REP* CMPSB CMPSW/ 30 22 10 5NP A7 8 8 С CMPSD REP* 5+9n 9+4n NP 9+30n 5+22n 5+9n 7+7n F2/3 A7 С CMPSW/D 5NP OF BOw /r 6 С CMPXCHG r,r 6NP OF BOw /r 7.. 10 С CMPXCHG m,r CMPXCHG8B 10 NP С OFC7/ m 14 13 NP С CPUID OFA 5 2NP 4 2 2 3 1т CWD 3NP 1т 98 3 CWDE 4 4 4 2 3 NP 27 3 1т DAA 2F 4 2 3NP 4 3 1т DAS 48r 3 3 2 2 1 UV 1т DEC П6/ FEw/1 2 1 1 UV 3 3 2 1т DECr FEw/1 15 7 3 SUV 4т 23+ea DECm 29 14 17 NP Зт 80..90 DIVr8 F6w/ 24 25 NP 4т 144.. 162 38 22 DIVM6 F6w/ 38 41 NP 4т DIV r32 F6w/ 17 17 NP 4т 86..96+ea 35 F6w/ DIVmS 44 24 25 NP 25 25 4т 150..168+ea DIVm16 F6w/ F6w /6 DIV m32 40 41 NP 4т OF 77 NP С EMMS 15 10 14 11 NP C8 iw ib С ENTER И 6, C8 iw ib 25 15 12 15 NP ENTER И 6,1 С 15+4m 22+1 6m (m=n-1) 12+4m 17+Зп 15+2n NP C8 iw ib ENTER 116,18 С 310.. F2XM1 310..630 211..476 140.. 279 13..57 NP D9FO С 10.. D9E1 10.. FABS 22 3 1 FX 1т FADD m32 D8/0 90.. 120 24.. 90..120+ea 8..20 3/1 FX 2т FADD m64 DC/0 95.. 125 29.. 95..125+ea 8..20 3/1 FX 2т DSCOr 70.. 100 70.. 100 23.. FADD sO.si 8..20 3/1 FX 1т FADD si.sO DCCOr 70.. 100 70.. 100 23.. 34 8..20 3/1 FX 1т FADDP si.sO DECOr 75.. 105 75.. 105 23..31 8..20 3/1 FX 1т DF/ FBLD m80 290..310+ea 290..310 266..27S 70.. 103 48.. 58 NP С Команды intel 80x Таблица 27. Команды (продолжение) 80286 P Команда Код 80186 80486 P 80287 FBSTP m80 148.. 154 NP С 520..540+ea 520..540 512..534 172.. DF/ FCHS D9EO 10.. 17 10.. 17 1 FX 3m 24.. 25 9B DB E2 FCLEX 2..S 2..8 11 9NP 3m FCMOVB sO.si DACOr 2m FCMOVE sO.si DACSr 2m FCMOVBE DADOr 2m sO.si DAD8r FVMOVU sO.si 2m FCMOVNB DBCOr 2m sO.si FCMOVNE DBCSr 2m sO.si FCMOVNBE DSDOr 2m sO.si FCMOVNU DBDSr 2m sO.si D8/2 60..70 4/1 FX 2m FCOM m32 60..70+ea 26 4 4/1 FX 2m FCOM m64 65..75+ea DC /2 65..75 DSDOr 24 1m FCOM si 40.. 40.. 50 4 4/1 FX 4 4/1 FX 2m FCOMP m32 60..70+ea 60.. D8/3 FCOMP m64 6S.. DC/3 31 4. 4/1 FX 2m 65..75+ea 42.. FCOMP si 42..S D8 D8r 26 4 4/1 FX 1m 45.. 55 26 4/1 FX 1m FCOMPP DED9 45..5S DB FOr FCOMI sO.si 1m DFFOr 1m FCOMIP so.si D9FF 123.. 772 257..354 18..124NP FCOS С FDECSTP 6.. 12 6.. 12 22 1 NP 1m D9F6 2m FDIV m32 215..225 89 73 39 FX 215..225+ea D8/ FDIV m64 220..230+ea 39 FX 2m DC /6 220..230 39 FX 1m D8FOr FDIV sO.Si 193..203 193..203 88.. DCF8r 39 FX 1m FDIV si.sO 88.. 193.. 203 193.. 203 DEF8r 197.. 207 39 FX 1m 197..207 ' 91 FDIVP si.sO FDIVR m32 89 39 FX 2m 216..226+ea 216.. D8/7 94 39 FX 2m FDIVR m64 221..231+ea DC /7 221.. 39 FX 1m 194.. 204 D8F8r 88.. 194.. FDIVR sO.si 39 FX 1m 194..204 88..91 DC FOr 194.. FDIVR si.sO 39 FX 1m 91 DEFOr 198.. FDIVRP si.sO 198.. FNOP 9B DB E1 2.. FDISI FENI FNOP 9B DB EO 2.. 1 NP 1m 9..16 18 DDCOr 9'.. FFREE si Приложение Таблица 27. Команды (продолжение) 80286 P5 P 80186 Код Команда 80287 ^ 7/4 NP 102..137 71..85 С 20.. DA/ FIADD гл32 102..137+ea 7/4 NP С 108..143 S7..72 19.. DE/0 108..143+ea FIADD т с 8/4 NP DE/2 72..86 71..75 16.. 72..86+ea FICOM т с 8/4 NP DA /2 78..91 56..63 15.. FICOM т32 78..91+ea с 71..75 8/4 NP DE/3 74.. 88 16.. 74..88+ea FICOMPm с 15.. 17 8/4 NP DA/3 80.. 93 56.. FICOMP т32 80..93+ea с 42 NP 224.. 238 136..140 85.. DA / FIDIVm16 224..238+ea с 230.. 243 120.. DE/6 84.. 86 42 NP FIDIV т32 230..243+ea с 225.. 239 135..141 85.. 89 42 NP DA Я 225..239+ea FIDIVR т uJL.

231..245 121..128 84.. 86 42 NP DE/ FIDIVR т32 231..245+ea 46.. 54 13.. 16 3/1 NP 4т DF/0 61.. 46..54+ea FILDm 9..12 4т 52.. 60 45.. 52 3/1 NP 52..60+ea DB/ FILD т 3/1 NP 4т DF/5 60..68 10.. FILD т64 60..68+ea 5Б.. 23..27 7/4 NP С DA/1 124.. 138 76..S 124..138+ea FIMULm 22.. 24 7/4 NP DE/1 130.. 144 61..82 С FIMULm32 130..144+ea 6.. 12 21 1т FINCSTP D9 F7 6.. 12 3 1 NP 33 17 16 NP С 9B DB E3 2..8 2.. FINIT 29.. DF/2 80.. 90 82..95 6NP 4т 80..90+ea FISTm 82.. 92 28..34 6 NP 4т DB/ FIST m32 82..92+ea 79.. 29.. 34 6 NP. 4т 82..Э DF/ FISTPm16 82..92+ea 82..Э 84.. 94 28.. 34 6NP 4т 84..94+ea 79.. DB/ FISTP m 94.. 105 80.. 97 4т 28.. DF/7 6NP FISTP m64 94..105+ea DE/4 102.. 137 71..85 7/4 NP С 102..137+ea 20.. FlSUBm DA /4 7/4 NP С 108..143+ea 108..143 57..S2 19.. FISUB m 102..137 71..85П 7/4 NP DE/5 С FISUBRm16 102..137+ea 20.. DA /5 108..143 57.. 82 19.. 32 7/4 NP С 108..143+ea FISUBR m 38..56 20 4 1 FX 1т 38..56+ea FLD m32 D9/ 40.. 60 25 1т FLD m64 DD/0 3 1 FX 40..60+ea 44 3 3 NP 4т 53..65+ea 53.. FLD m80 DB/ 17.. 22 D9COr 17.. 22 4 1 FX 1т FLD si FLD1 15.. 21 24 4 2т D9 E8 15..21 2NP FLDL2T 16.. 22 40 8 5/3 NP 2т D9E9 16.. 15.. 21 15.. FLDL2E D9EA 40 8 5/3 NP 2т 16.. FLDPI D9EB 16..22 40 8 5/3 NP 2т FLDLG2 18.. 24 18.. D9EC 41 2т 8 5/3 NP L FLDLN2 D9ED 17.. 23 17..23 8 5/3 NP 2т 11..17 11.. FLDZ 20 4 2NP 1т D9EE D9/5 7.. 14 19 4 7NP FLDCWm16 7..14+ea Зт D9/ FLDENV т 14 35..45+ea 35.. 45 71 44 37 NP С FLDENV m D9/4 71 34 32.. 33 NP С (PM) Команды! Intel 80x Таблица 27. Команды (продолжение) 80286 Команда P Код P 80186 80287 2m FMUL m32 110..125 27..35 110..125+ea D8/1 3/1 FX 2m FMUL т64 154..168+ea DC/1 154.. 168 32.. 57 14 3/1 FX 1m 29.. FMULsO.si D8C8r 90.. 145 16 3/1 FX 90..145+ea 1m DCC8r 2Э.. 90..145 16 3/1 FX FMULsi.sO 90..T45+ea 1m 29.. DECSr 94.. 148 16 3/1 FX FMULP si.sO 94..148+ea 3m 11 9/9 NP DBE2 2..8 2.. 8 FNCLEX DBE1 2.. FNDISI FNOP DB EO FNENI 2..8 FNOP С 12 NP FNINIT 2..8 2.. 8 33 DBE 1m 10.. 16 12 1 NP FNOP D9DO 10..16 FNSAVE т С 197..207 375.. DD/6 154 127..151 NP 197..207+ea (RM) FNSAVE т С 124NP DD/6 375..376 (PM) DBE4 2.. FNSETPM FNOP Зт D9/7 12.. 18 15 2NP 12..18 FNSTCWm С D9/6 103.. 104 S6..67 48..50 NP FNSTENVm16 40..50+ea 40.. Зт 9BDD/7 12.. 18 15 2NP FSTSWm16 12.. 18 Зт 9B DF EO 13 2NP FSTSW AX 10.. 16 С D9 F3 250.. 800 314..487 218..303 19..134NP 250.. FPATAN С 16..64NP 15.. 190 15.. 190 74.. 155 70.. FPREM D9F С 72.. 95.. FPREM1 ' D9F5 20..70 NP С FPTAN 30.. 540 191..497 200.. 273 17.. 173 NP D9F2 30.. С 16..50 21.. FRNDINT 66.. 80 9.. 20 NP D9FC 16.. FRSTOR т С DD/4 197.. 207 308 131 75..95 NP 197..207+ea (RM) FRSTOR т С DD/4 308 120 70 NP (PM) FSAVE т С 197.. 207 375.. 376 154 127.. 151 NP 197..207+ea 9B DO / (RM) С 375.. 376 143 124NP FSAVE т (PM) 9B DD / С 30.. 67.. D9FD 32.. 32.. FSCALE 20..31 NP FNOP 9B DB E4 2.. FSETPM С 122..771 257..354 16..126NP D9 FE FSIN С 194.. 809 292.. 365 17..137NP D9FB FSINCOS 1т 83..87 70 NP 180.. 186 122.. D9FA 180.. FSQRT 2т 44 7 2NP 84.. D9/2 84..90+ea FST m 2т 2NP 96..104 45 DD/2 96..104+ea FST m 1т 11 1 NP 15..22 DDDOr 15.. FST si I Assembler для DOS Приложение Таблица 27. Команды (продолжение) 80286 P 8087 80186 Код P Команда 80287 44 86..Э2 2NP 2m FSTP т32 D9/3 86..92+ea 2NP DD/3 98..106 45 8 2m FSTP m64 98..106+ea 3NP DB/7 53 6 С 52..S FSTP т80 52..58+ea 17.. 24 17.. 24 12 1 NP 1m DDD8r FSTP si 15 2 NP 9B 09 /7 12.. 18 12..18 3 3m FSTCWm 56.. 103.. 104 48..50 NP FSTENV т 40..БО 9B D9 /6 С 40..50+ea 12.. 18 15 2NP 9BDD/7 12.. 18 3 3m FSTSWm 2NP 9B DF EO 10.. 16 13 3 3m FSTSW AX D8/4 90..120 24..32 8.. 20 3/1 FX 2m 90..120+ea FSUB m DC /4 95.. 125 3/1 FX 2m 95..125+ea 28..36 8.. FSUB m 70.. 100 70.. 100 26.. 37 8.. 20 3/1 FX 1m FSUB sO.si DSEOr DCE8r 70.. 100 70.. 100 3/1 FX 1m FSUB si.sO LJ6..37 8.. 75.. 105 26.. DEE8r 75.. 105 8.. 20 3/1 FX 1m FSUBP si.sO D8/5 90.. 120 2m 24..32 8.. 20 3/1 FX FSUBR m32 90..120+ea 95.. DC /5 8.. 20 3/1 FX 2m FSUBR m64 95..125+ea 28.. D8E8r 26.. 70.. 100 70.. 100 8.. 20 3/1 FX 1m FSUBR sO.si DCEOr 70.. 100 70.. 100 8.. 20 3/1 FX 1m 26.. FSUBR si.sO 75.. 105 26.. DEEOr 75.. 105 8.. 20 3/1 FX 1m FSUBRP si.sO D9E4 38..48 28 4/1 FX 1m 38.. FTST 24 4 4/1 FX 1m DDEOr FUCOM si 26 4 4/1 FX DDESr 1m FUCOMP si 26 5 4/1 FX 2m FUCOMPP DAE DBE8r 1m FUCOMI sO.si FUCOMIP DFE8r 1m sO.si 9B FWAIT 6 1..3 2m 1..3NP 12.. 23 12.. 23 8 21 NP FXAM D9E5 30..38 1m D9C8r 10.. 15 10.. 15 18 FXCHsi 1 PV 1m OF AE /1 С FXRSTOR т D9F FXTRACT 27..5S 27..5S 79.. 76 16.. 20 13 NP С OF AE / FXSAVE т С D9F1 900.. 11 00 900.. 11 00 120.. 538 196..329 22.. 111 NP FYL2X С 700.. 1000 700.. 1000 257.. 547 171..326 22.. 103 NP FYL2XP1 D9F9 С HLT F4 2 2 5 4NP С 101.. IDIV r8 F6w/7 44.. 52 17 19 19 22 NP Зт F6w/7 165.. 184 IDIVr16 53..61 25 27 30 NP 4т F6w/ IDIV r32 43 43 46 NP 4т F6w/ IDIV m8 107..118+ea 50..58 20 22 20 22 NP 4т IDIVm16 F6w/7 5Э..67 171..190+ea 30 28 30 NP 4т Команды Intel 80x Таблица 27. Команды (продолжение) 80286 Команда Код P 80186 80486 P 80287 IDIV т32 F6w/7 46 NP 46 44 4m IMULrS F6w/5 1m 80..98 9.. 14 11 NP 25.. 28 13 13.. 128.. 154 3m IMULM6 F6w/5 34..37 11 NP 21 9..22 13.. 3m IMUL r32 F6w/5 10 NP 13.. 9.. 2m 86..104+ea IMULmS F6w/5 11 NP 32..34 16 12.. 17 13.. 4m IMULm16 F6w/5 24 11 NP 134..160+ea 40.. 43 13.. 12.. IMULr32 F6w/5 4m 12..41 10 NP 13.. 6B /r ib IMULr,r,i8 1m 22 21 9..14 10 NP 13.. IMUL 69 /r im 1m 29 21 9..22 10 NP 13.. П6,г16,П IMUL 69 /r im 1m 10 NP 9..38 13.. r32,r32,i 6B /r ib 2m IMULr,r,i8 25 12..17 10 NP 13.. IMUL 69 /r im 2m 32 24 10 NP 12..25 13.. r16,m16,i IMUL 69 /r im 2m 12..41 10 NP 13.. r32,m32,i IMULr16, OF AF /r 1m Э..22 10 NP 13. П OF AF /r 1m IMUL r32,r32 13.. 42 10 NP 9.. IMULM6, OF AF /r 2m 10 NP 12..25 13.. m IMULr32, OF AF /r 2m 13..42 10 NP 12.. m IN ac,i E4wib С 14 14 7NP 10 5 (RM) IN ac,i E4w ib С 4NP 6 (CPLIOPL) IN ac.iS E4w ib С 26 19 NP (V86) IN ac.DX ECw С 14 7NP 12 8 5 (RM) IN ac.DX ECw С 7 8 4NP (CPUSIOPL) IN ac.DX ECw С 27 28 21 NP (CPL>IOPL) IN ac.DX С ECw 19 NP (V86) 1т INCr FEw/0 1 UV 2 3 1т 40r INC П 6/32 2 2 1 UV 4т FEw/0 INC т 7 6 SUV 23+ea С 6Cw 17 9 NP INS* (RM) 14 5 Приложение 2' Таблица 27. Команды (продолжение) 80286 Команда Код 8087 80186 P5 P INS* 6Cw 9 10 6NP С (CPUIOPL) INS* 6Cw 29 32 24 NP С (CPL>IOPL) с 6Cw 29 30 22 NP INS* (V86) 3m 47 23 INTi8(RM) CDib 71 30 16 NP С INT 18 (PM) 40 CD ib 31 NP С INT i8 (PM/in) 78 99 CDib 48 NP С INT 18 (V86) 78 119 82 60 NP CDib С 167 TS INT 18 (TG) CDib 37+TS 23+TS NP С CC 45 23 72 26 16 NP INT3 (RM) С 40 59 CC 30 NP INT3 (PM) С 78 INT3 (PM/in) CC 71 47 NP С CC 78 119 59 NP INT3 (V86) С 167 TS 37+TS 22+TS NP CC INT3 (TG) С CE 4 4NP INTO (OF=0) 3 3 С CE 48 24 35 28 13 NP INTO (RM) С CE 59 30 NP INTO (PM) С INTO (PM/in) CE 99 73 47 NP С CE 118 59 NP INTO (V86) С 29+TS CE TS INTO (TG) 22+TS NP С INVD OF 08 4 15 NP с INVLPG m OF 01 /7 12 25 NP IRET/IRETD с CF 44 28 17 7NP 22 (RM) IRET/IRETD с 10..19NP CF 31 38 (PM) IRET/IRETD с CF 82 27 NP 55 (PM/out) RET/IRETD с CF 32+TS 169 TS 10+TS (PM/NT) Jcc 1т 70cib 4 3 3 1 1 PV (не вып.) 1т Jcc 18 (вып.) 70cib 16 7 7 3 1 PV Jcc im 1т OF 80c ib 3 1 1 PV (не вып.) 1т OF 80c ib Jcc im (вып.) 3 1 PV JCXZ i 2т E3ib 6 5 4 5 5NP (не вып.) 2т JCXZ i8 (вып.) E3ib 18 16 8 9 6NP 7 1т JMP near i8 EBib 15 13 7 3 1 PV JMP near 1т "E9 ib 15 13 7 7 3 1 PV i 16/ Команды Intel 80x Таблица 27. Команды (продолжение).

80286 Команда Код 80186 80486 P5 P 80287 2m 11 JMP near г FF/4 7 7 5 2NP 11 2m 18+ea FF/4 JMP near m 10 5 2 NP JMP far im 11 17 С EAim 13 12 3NP (RM) JMP far im С EAim 27 19 23 NP (PM) JMP far im С EAim 38 45 32 18 NP (CG) JMP far im С 19+TSNP EAim 42+TS 175 TS (TS) JMP far im С 20+TS NP EA im TS 43+TS (TG) JMP far m С 24+ea 26 15 12 4NP FF/5 (RM) JMP far m с 31 23 NP FF/5 (PM) JMP far m с 41 FF/5 31 18 NP (CG) JMP far m с 5+TS 41+TS 19+TSNP FF/ (TS) JMP far m с 5+TS 42+TS 20+TS NP FF/5 (TG) 1т 9F 4 2 _, 2 2 2NP LAHF С LARr.r 14 11 8 NP OF 02 /r С OF 02 /r 11 8NP LARr.m 16 С 7 LDS r,m (RM) C5/r 18 4NP 24+ea С 4..13NP IDS r,m (PM) C5/r 1т 8D/r 6 3 2 1..2 1 UV LEAr.m 2+ea Зт LEAVE C9 8 5 3NP 7 7 С C4/r 4NP 24+ea LES r,m (RM) 18 С 4..13NP LES r,m (PM) C4/r 22 7 С 4NP OF B4 /r LFS r,m (RM) С 4..13NP OFB4/r 22 LFS r,m (PM) С 11 11 11 6NP OF 01 / LGDTm С 7 4 NP LGS r,m (RM) OF B5 /r С 22 4.. 13 NP LGS r,m (PM) OF B5 /r 11 11 6 NP LIDTm OF 01 /3 LС С 11 9 NP LLDTr 17 OF 00 /2 Х С 24 9NP LLDTm OF 00 / 8NP 3 10 LMSWr OF 01 /6 Lc С 8NP 6 LMSW m OF 01 / С 1 1 NP 2 2 0 LOCK FO Приложение Таблица 27. Команды (продолжение) 80286 P Код P 8087 Команда LODSB/ ACw 2NP 2m 16 10 5 5 LODSW/ LODSD LOOP 4 11 5NP 4m 5 5 E2ib (не вып.) 17 11 6NP 7 4m 15 LOOP 18 (вып.) E2ib LOOPE 5 4 6 7NP 4m E1 ib (не вып.) 18 16 8 9 8NP 4m E1 ib LOOPE 18 (вып.) LOOPNE 4 6 7NP 4m 5 EOib (не вып.) LOOPNE i 11 4m 19 16 8 9 8NP EOib (вып.) 20 или 14 8NP 10 С OF 03 /r LSL r,r 21 или 8NP 16 10 С LSL r,m OF 03 /r 7 6 4NP С LSS r,m (RM) OF B2 /r 22 OF B2 /r 8..17NP С LSS r,m (PM) 17 23 LTRr С OF 00 /3 10 NP 19 20 С OF 00 /3 10 NP LTRm 2 2 2 1т MOV r,r 88dw /r 1.UV 14 9 3 2т AOdw im MOV m.ac 1 UV 9 2 1 2т MOV m,r 1 UV 88dw /r 13+ea 4 14 8 5 1т MOV ac,m AOdw im 1 UV 12 5 1т MOV r,m 1 UV 88dw /r 12+ea 3 C6w /0 im 2т MOV m,im 12.. 14+ea 1 UV 4 2 2 1т 3.. MOV r8,i8 BOrib 1 UV MOV 2 2 3..4 1т BSrib 1 UV r16/32,i16/ 2 2 MOV sr.r 8E/r 3 4т 2.. 11 NP 17 MOV sr,r (PM) 8E/r 4т 2.. 11 NP 9 5 MOV sr,m 12+ea 3 4т SE/r 3..12 NP MOV sr,m (PM) 19 19 8E/r 4т 3..12NP BC/r 2 MOV r,sr 2 2 3 Згп 1-NP MOV m,sr 3 8C/r 13+ea 3' 1т 1 NP MOV CRO.r OF 22 /r 16 С 22 NP OF 22 /r MOV CR2,r 4 10 NP С Команды Intel 80x Таблица 27. Команды (продолжение) 80286 P Команда 8087 P 80186 Код 80287 OF 22 /r 21 NP MOV CR3,r 5 С OF 22 /r С 14 NP MOV CR4,r с OF 20 /r MOV r.CRx 4 4NP с OF 23 /r 11 NP MOV DRO-3,r 22 с OF 23 /r 12 NP MOV DR4-5,r с OF 23 /r 11 NP MOV DR6-7,r с OF 21 /r 22 2NP MOV r,DRO-3 с OF 21 /r 12 NP MOV r,DR4- с OF 21 /r 11 NP MOV r,DR6-7 22 OF 26 / MOV TR6,r 12 OF 26 / MOV TR7,r 12 OF 26 / MOV TR3,r OF 24 /6 12 MOV r,TR OF 24 / MOV r,TR7 12 OF 24 / MOV r,TR3 MOVD 1т OF 6E /r PU mm,rm 1т OF 6E /r MOVD r32,mm PU MOVD 2т OF 6E /r PU m32,mm MOVQ 2т OF 7F /r PU m64,mm MOVQ > OF 6F /r 1т PU mm,m MOVQ 1т OF *F /r PU mm, mm С 7 A4w 18 5 4 4NP MOVS* 1т OF BEw /r 3 NP MOVSX r.r 1т OF BEw /r 6 3NP MOVSX r,m 1т OF B6w /r 3 3NP MOVZX r,r 6 1т OF B6w /r 3NP MOVZX r,m О 9..14 1т 70.. 77 13..15 11 NP F6w/4 26..2S MULr Зт 35..37 9..22 13..26 11 NP F6w /4 118.. 133 MULr Зт 13.. 9..33 10 NP MUL r32 F6w/ 2т 12.. 17 13.. 18 11 NP 32.. F6w/4 76..83+ea MULmS 4т 13..26 11 NP 12.. 124..139+ea 41..43 F6w/ MULm 4т 13..42 10 NP 12.. MUL m32 F6w/ 1т 1 NP 2 NEGr F6w/ 4т 3 NP 7 NEG m 24+ea F6w/ 1т 1 UV 3 90 NOP Приложение Таблица 27. Команды (продолжение) P P 8087 Команда Код 1 1m 1 NP 3 F6w/ NOT r 4m 3 3 NP 7 F6w/2 24+ea NOTm 1 1m 2 1 UV 4 4 OR ac.im OCwim 1 1m 4 2 1 UV 80sw /1 im 4 OR r,im 4m 3UV 7 16 80sw/1 im 23+ea OR m,im 1 1m 2 2 1 UV 08dw /r ORr.r 4m 7 7. 3 UV 08dw /r 24+ea OR m,r 2m 2. 2UV 7 13+ea 08dw /r OR r,m OUT i8,ac 16 12 NP С 14 3 E6wib (RM) OUT i8,ac 11 9NP 4 С E6wib (CPL7IOPL) OUT i8,ac 26 NP 24 С E6wib (CPL5 IOPL) OUT i8,ac с 24 24 NP E6wib (V86) OUT DX.ax с 11 16 12NP EEw 12 7 (RM) OUT DX.ac с 10 9NP EEw (CPUIOPL) OUT DX.ac с 26 NP EEw (CPL>IOPL) OUT DX.ac с 29 24 NP EEw (V86) с 14 13 NP 6Ew OUTS* (RM) OUTS* 10 - с 10 NP 6Ew (CPKIOPL) OUTS* с 27 NP 28 6Ew (CPL>IOPL) с 6Ew 28 25 NP OUTS* (V86) PACKSSWB 1т UVNP OF 63 /r mm, mm PACKSSWB 2т PUNP OF 63 /r mm,m PACKSSDW OF 6B /r 1т UV NP mm, mm PACKSSDW OF 6B /r 2т PU NP mm,m PACKUSWB 1т OF 67 /r UVNP mm, mm PACKUSWB OF 67 /r 2т PU NP mm,m Команды Intel 80x Таблица 27. Команды (продолжение) 80286 P Код Команда 8087 P 80186 80287 PADDB 1m OF FC /r UV mm, mm PADDB OF FC /r PU 2m mm,m PADDW OF FD /r UV 1m mm, mm PADDW OF FD /r PU 2m mm,m PADDD OF FE /r UV 1m mm, mm PADDD OF FE /r 2m PU mm,m PADDSB OF EC /r UV 1m mm, mm PADDSB 2m OF EC /r PU mm,m PADDSW OF ED /r UV 1m mm, mm PADDSW 2m OF ED /r PU mm,m PADDUSB UV 1m OF DC /r mm, mm PADDUSB 2m OF DC /r PU mnri,m PADDUSW UV 1m OF DD /r mm, mm PADDUSW PU 2m OF DD /r mm,m PAND UV 1m OF DB /r mm, mm PAND PU 2m OF DB /r mm,m PANDN UV 1m OF DF /r mm, mm PANDN 2m PU OF DF /r mm,m PCMPEQB UV 1m OF 74 /r mm, mm PCMPEQB 2m PU OF 74 /r mm,m PCM PEQW UV 1m OF 75 /r mm, mm Приложение Таблица 27. Команды (продолжение) 80286 P5 P 8087 Код Команда 80287 PCMPEQW OF 75 /r PU 2m mm,m PCMPEQD uv 1m OF 76 /r mm, mm PCMPEQD 2m OF 75 /r PU mm,m PCMPGTB uv OF 64 /r 1m mm, mm PCMPGTB OF 64 /r 2m PU mm,m PCMPGTW uv OF 65 /r 1m mm, mm PCMPGTW OF 65 /r PU 2m mm,m PCMPGTD uv OF 66 /r,1m mm, mm PCMPGTD OF 66 /r PU 2m mm,m PMADDWD OF F5 /r 1m UVNP mm, mm PMADDWD OF F5 /r PU NP2 2m mm,m PMULHW OF E5 /r 1m UVNP mm, mm PMULHW OF E5 /r 2m PUNP mm,m PMULLW 1m OF.D5/r UVNP mm, mm PMULLW OF D5 /r PU NP2 2m mm,m 58r 12 10 POPr 5 4 1 UV 2m 8F/0 20 2NP POPm 25+ea 5 5 6 С POP DS (RM) 1F 8 5 7 3NP 3 С POP DS (PM) IF 20 21 3..12 NP 9 С POP ES (RM) 12 8 5 3 NP С POP ES (PM) 20 21 9 3..12NP С POP SS (RM) 17 12 8 5 7 3 NP 3 С POP SS (PM) 20 21 9 С 8..17NP _LIl OFA1 POP FS (RM) 8 5 3 NP С ~T с POP FS (PM) OFA1 21 3..12NP с POP GS (RM) ' OFA9 8 5 7 3 3NP с OFA POP GS (PM) 21 9. 3..12NP Команды.Intel 80x Таблица 27. Команды (продолжение) 80286 Код P Команда 8087 P 80186 5NP POPA/POPAD 61 51 24 9 С POPF/POPFD 9D 4NP 12 8 5 5 9 С (RM) POPF/POPFD с 9D 6 14 NP (РМ) 1m POR mm, mm UV OF EB /r POP, 2m OF EB /r PU mm,m PSLLW 1m OF F1 /r UV NP mm, mm PSLLW 1m OF F1 /r PUNP mm,m PSLLW 2m OF 71 /6 ib UVNP mm,i PSLLD 1m OF F2 /r UVNP mm, mm PSLLD 1m OF F2 /r PUNP mm,m 2m UVNP OF 72 /6 ib PSLLD mm,i PSLLQ 1m UVNP OF F3 /r mm, mm PSLLQ 1m OF F3 /r PUNP mm,m 2m UVNP OF 73 /6 ib PSLLQ mm, PSRAW 1m OF E1 /r UVNP mm, mm PSRAW 1m PUNP OF E1 /r mm,m PSRAW 2m UVNP OF 71 /4 ib mm, PSRAD 1m OF E2 /r UVNP mm, mm PSRAD 1m OF E2 /r PUNP mm,m PSRAD 2m UVNP OF 72 /4 ib mm,J PSRLW 1m UVNP OF D1 /r mm, mm PSRLW 1m PU NP OF D1 /r mm,m PSRLW 2m UVNP OF 71 /2ib mm,i PSRLD 1m UVNP OF 02 /r mm, mm PSRLD 1m PUNP OF D2 /r mm,m Приложение Таблица 27. Команды (продолжение) 80286 P 80486 P 8087 Команда Код 80287 PSRLD UV NP1 2m OF 72 /2 ib mm, PSRLQ 1m UVNP OF D3 /r mm, mm PSRLQ 1m PU NP OF D3 /r mm,m PSRLQ 2m UV NP OF 73 /2 ib mm, PSUBB 1m UV OF F8 /r mm, mm PSUBB 2m PU OF F8 /r mm,m PSUBW UV 1m OF F9 /r mm, mm.

PSUBW 2m OF F9 /r PU mm,m PSUBD 1m UV OF FA /r mm, mm PSUBD 2m OF FA /r PU mm,m PSUBSB 1m UV OF E8 /r mm, mm PSUBSB 2m OF E8 /r PU mm,m PSUBSW 1m OF E9 /r UV mm, mm PSUBSW 2m OF E9 /r PU mm,m PSUBUSB 1m OF D8 /r UV mm, mm PSUBUSB 2m OFD8/r PU mm,m PSUBUSW OF D9 /r UV 1m mm, mm PSUBUSW OF D9 /r 2m PU mm,m PUNPCKHBW OF 68 /r 1m UVNP mm, mm PUNPCKHBW 2m OF 68 /r PUNP mm,m PUNPCKHWD OF 69 /r 1m UVNP mm, mm Х Команды Intel 80x Таблица 27. Команды (продолжение) 80286 Код Команда 8087 80186 P P 80287 PUNPCKHWD OF 69 /r PU NP1 2m mm,m PUNPCKHDQ OF 6A /r UVNP1 1m mm, mm PUNPCKHDQ OF 6A /r PU NP1 2m mrn,m PUNPCKLBW OF 60 /r UVNP1 im mm, mm PUNPCKLBW OF 60 /r PU NP1 2m mm,m PUNPCKLWD OF 61 /r 1m UVNP mm, mm PUNPCKLWD OF 61 /r PU NP1 2m mm,m PUNPCKLDQ OF 62 /r 1m UVNP mm, mm PUNPCKLDQ OF 62 /r PU NP1 2m mm,m 50r 10 PUSHr 1 1 UV 3m 16 PUSH т 24+ea FF/6 4 2NP 4m PUSH 18 6Aib 1 3m 1 NP PUSH 116/32 68 im 1 1 NP 3m OE 14 9 PUSH CS 1 NP 4m 1E 14 9 PUSH DS 4m 3 1 NP 14 6 PUSH ES 3 1 NP 4m 14 16 9 PUSH SS 3 1 NP 4m PUSH FS OF АО 4m 3 1 NP л PUSH GS OFA8 3 1 NP 4m PUSHA/ 36 17 С 60 18 5NP PUSHAD PUSHF/ С 14 9 9C 4 9NP. PUSHFD (RM) PUSHF/ С 9C 4 3 3 NP PUSHFD (PM) PXOR 1m OF EF /r UV mm, mm PXOR 2m OF EF /r PU mm,m 2m DOw/2 Х RCLr,1 3 1 PU 4m 15 DOw/2 23+ea RCLm,1 4 3PU С 5+n 5+n D2w/2 8+4n RCL r,CL 7..24NP 8.. Приложение Таблица 27. Команды (продолжение) 80286 P5 P Код 80186 Команда 80287 С 17+n 9..26NP 8+n 10 9.. RCL m,CL 28+ea+4n~ D2w/ С 5+n 9 8..30 8..25NP 5+n COw /2 ib RCL r,i с 17+n 8+n 9..31 10..27NP COw /2 ib RCL m, 2m 1 PU 2 2 2 9 RCRr,1 DOw/ 4m 7 4 3PU 23+ea RCRm,1 DOw/ С 9 7.. 24 NP 5+n 5+n 8.. RCR r,CL 8+4n D2w/ С 17+n 8+n 9..31 9..26NP RCR m,CL 28+ea+4n D2w/ С 5+n 5+n 9 8..30 8.. 25 NP COw /3 ib RCR r,i с 9.. 17+n 8+n 10 10..27NP COw /3 ib RCR m,i с 20.. 24 NP OF RDMSR с OF RDPMC с 20.. 24 NP OF RDTSC 4т 11 2NP 20 10 C3 RETN С 11 3NP 24 18 C2iw RETN 4т 34 4NP 22 15 18 CB RETF (RM) С 25 18 4.. 13 NP CB RETF (PM) С 23 NP 55 62 CB RETF (PM/out) С 4NP.

25 15 18 CAiw RETFi16(RM) С 25 32 4.. 13 NP CA iw RETF i16 (PM) RETF i С 68 23 NP 55 CAiw (PM/out) 1т 2 2 2 3 1 PU ROLr,1 DOw/ 4т 7 7 4 3PU DOw/0 23+ea ROLm, 1т 4NP 5+n 5+n 3 ROL r,CL 8+4n D2w/ 4т 4NP 17+n 8+n 7 ROL m.CL 28+ea+4n D2w/ 1т 5+n COw /0 ib 5+n 3 1 PU ROL r,i 4т COw /0 ib 17+n 8+n 4 3PU ROL m,i 1т 2 DOw/1 2 3 3 1 PU RORr, 4т 7 DOw/1 15 4 3PU 23+ea RORm, 1т 5+n 5+n 3 4NP D2w/1 8+4n ROR r,CL 4т D2w/1 17+n 8+n 4 4NP ROR m,CL 28+ea+4n 1т 5+n ROR r,i8 COw /1 ib 5+n 3 2 1 PU 4т 7 COw /1 ib 17+n 8+n ROR m,i8 3 PU С RSM 83 NP OFAA я 1т 9E 3 3 2NP 2 SAHF 1т 2 2 2 3 SALr,1 DOw/4 1 PU 7 4т 15 7 3PU SALm,1 DOw/4 23+ea 1т SAL r,CL 5+n 5+n D2w/4 3 4NP 8+4n SAL m,CL 17+n 7 4т 8+n D2w/4 28+ea+4n 4NP 1т SAL r,i8 COw /4 ib 5+n 5+n 3 2 1 PU Команды Intel 80x Таблица 27. Команды (продолжение) P Код Команда 80186 80486 P 80287 4m SAL m, 18 8+n COw /4 ib 17+n 7 4 3PU 7 ?

D6 3 3 3NP SALC DOw/7 2 2 2 3 1 PU 1m SARr,1 DOw/ SAR m,1 7 7 4 4m 23+ea 15 3PU D2w/7 8+4n SAR r.CL 5+n 5+n 4NP 1m 3 SAR m,CL 17+n 8+n 7 4 4m D2w/7 28+ea+4n 4NP 5+n 5+n SAR r,i8 COw /7 ib 3 2 1 PU 1m 17+n 8+n SAR m,i8 COw /7 ib 4 3PU 4m 1 Cw im 4 4 2 1 2m SBB ac.im 3 1 PU SBB r,im 4 4 3 2 1 1 PU 2m 80sw /3 im SBB m,im 16 7 3 3PU 4m 80sw /3 im 23+ea SBB r,r 3 3 2 2 1 1 PU 2m 18dw/r 7 18clw/r SBB m,r 10 3 3PU 4m 24+ea 18dw/r SBB r,m 10 6 2 2PU 3m 13+ea SCASB/ 3m AEw 7 4NP SCASW/ 18 15 SCASD С 9+1 5n 5+15n 5+8n 5+8n 7+5n 8+5n NP F2/3 AEw REP* SCAS* SETcc r 1m 4 1 NP OF9cc (вып.) SETcc r 3m 3NP 4 OF9cc (не вып.) SETcc m 1m 1 NP OF9cc 5 (вып.) SETcc m 3m 4 3NP OF9cc (не вып.) 4m 11 4NP OF 01 /0 9 SGDTm 1m 2 2 2 3 SHLr,1 DOw/4 1 PU 7 15 3PU 4m DOw/4 23+ea SHL m,1 - 4NP 5+n 5+n 3 3 1m D2w/4 8+4n SHL r,CL 17+n 8+n 7 4 4NP 4m SHLm.CL D2w/4 28+ea+4n COw /4 ib 5+n 5+n 2 1 PU 1m SHL r,i8 8+n COw /4 ib 17+n 7 3PU 4m SHLm.iS 2 2 3 3 1 PU 1m SHRi-,1 DOw/ :

. 7 7 4m 3 PU 23+ea SHF!m,1 DOw/ 3 4NP 1m 5+n 5+n 8+4n SHR r,CL D2w/ 4 4m 17+n 8+n 7 4NP 28+ea+4n SHRm.CL D2w/ 5+n 1 PU 1m 5+n 3 SHR r,i8 COw /5 ib 7 4 3PU 4m 17+n 8+n COw /5 ib SHR m,i 4NP 2m 3 SHLD r,r,im OFA 4NP 2m 3 SHLD r,r,CL OFA Приложение Таблица 27. Команды (продолжение) 80286 P5 P 8087 Код Команда 80287 4 NP 4m OFA SHLD m,r,im 5 NP 4m SHLD m,r,CL OFA5 ? 4NP 2m SHRD r,r,im OF AC OF AD 4NP 2m SHRD r,r,CL 4NP 4m SHRD m,r,im OF AC OF AD 5NP 4m SHRDm.r.CL 7 4NP OF 01 /1 С SIDTm 12 9 2 NP 4m OF 00 / SLDTr16 2 2 2 NP OF 00 /0 С SLDTm16 3 2 4NP OF 01 /4 4m SMSWr16 2 2 4NP OF 01 /4 С SMSWm16 3 3 F9 2NP 1m STC 2 2 о 2NP FD 2 2 4m STD 2 FB 2 7NP STI 5 С 2 2 STOSB/ AAw 11 5 3NP 3m STOSW/ 10 3 STOSD 9+14n С FSAAw 6+9n 4+3n 5+5n 7+4n 3+nNP REP STOS* Х 2NP 2 4m OF 00 / STRr16 3 2NP С OF 00 / STRm16 3 2Cw im 4 1 UV 1m SUB ac,im 4 4 1 UV 1m 80sw /5 im SUB r,im 4 SUV 80sw /5 im 23+ea SUB m,im 3 4m 7 28dw /r SUB r,r. 3 1 1 UV 1m 3 SUV 28dw /r 24+ea 10 3 4m SUBm.r 28dw /r 13+ea SUB r,m 2 2UV 2m 10 7 OF SYSENTER С OF SYSEXIT С 4 A8w im 1 UV 1m TEST ac.im 4 3 F6w /4 im 5 TEST r,im 1 UV Im 4 3 L F6w /4 im с 11+ea 2 2 UV TEST m,im 2m 10 3 TEST r,r 84w/r 1 UV 1m 3 TEST m,r 84w/r 2 2UV 13+ea 2m 10 TESTr.m ' 84w/r 2 UV 13+ea 5 2 2m 10 UD2 OF OB С OF 00 / VERR П6 10 11 7NP С VERRm16 OF 00 /4 11 11 7NP L-2_ с OF 00 / VERWr16 15 11 7NP с OF 00 / VERWm16 16 7NP WAIT 9B 6 1..3 1..3NP 4 2m 6 Команды Intel 80x Таблица 27. Команды (окончание) Команда 8087 80186 Код P5 P 80287 WBINVD OF 09 2000+ NP 5 С с 30..45 NP WRMSR OF XADD г,г.OF COw /r 3NP 3 4m XADD m,r OF COw /r 4NP С XCHG ac,r / 90r 2NP 3m 3 3 3 3 г,ас 86w/r 4 4 3NP 3m XCHG r,r 3 3 XCHG r,m / 86w /r 25+ea 5 5 5 3NP С m,r 11 XLAT D7 11 5 5 4NP 2m 1 1 UV XOR ac.im 34w im 4 4 2 1m 1 UV 4 80sw /6 im XOR r,im 4 2 1m 7 3UV 4m 80sw /6 im 23+ea XOR m,im 16 7 1 1 UV 1m 30dw /r 3 2 XOR r,r 30dw /r 7 3 SUV 4m 24+ea XOR m,r 7 6 2 2UV 2m 30dw /r 13+ea XOR r,m Таблица 28. Коды команд расширения SSE Команда Код OF 28 /r MOVAPS xmm,xmm/m OF 29 /r MOVAPS xmm/m128,xmm OF10/r MOVUPS xmm,xmm/m OF 1 1 /r MOVUPS xmm,xmm/m OF12/r MOVLPS xmm,m OF 13 /r MOVLPS m64.xmm OF12/r MOVHLPS xmm.xmm OF 16 /r MOVHPS xmm,m OF16/r MOVLHPS xmm.xmm | OF17/r MOVHPS m64,xmm F30F10/r MOVSS xmm,xmm/m F3 OF 1 1 /r MOVSS xmm/m32,xmm OF 58 /r ADDPS xmm,xmm/m F3 OF 58 /r ADDSS xmm,xmm/m OF 5C /r SUBPS xmm,xmm/m F3 OF 5C /r SUBSS xmm,xmm/m OF 59 /r MULPS xmm,xmm/m F3 OF 59 /r MULSS xmm,xmm/m OF5E/r DIVPS xmm,xmm/m F3 OF 5E /r DIVSS xmm,xmm/m Приложение Таблица 28. Коды команд расширения SSE (окончание) Код Команда OF 52 /r RSQRTPS xmm,xmm/m F3 OF 52 /r RSQRTSS xmm,xmm/m OF 51 /r SQRTPS xmm,xmm/m F3 OF 51 /r SQRTSS xmm,xmm/m OF 53 /r RCPPS xmm,xmm/m F3 OF 53 /r RCPSS xmm,xmm/m OF 5F /r MAXPS xmm,xmm/m F3 OF 5F /r MAXSS xmm,xmm/m OF 5F /r MAXPS xmm,xmm/m F3 OF 5F /r MAXSS xmm,xmm/m MINPS xmm,xmm/m128 OF 5D /r F3 OF 5D /r MINSS xmm,xmm/m OF C2 /r i CMPPS xmm,xmm/m 128, F3 OF C2 /r \ CMPSS xmm,xmm/m128,i OF 2F /r COMISS xmm,xmm/m OF 2E /r UCOMISS xmm,xmm/m OF 2A /r CVTPI2PS xmm,mm/m F3 OF 2A /r CVTSI2SS xmm,r/m OF 2D /r CVTPS2PI mm,xmm/m F3 OF 2D /r CVTSS2SI r32,xmto/m OF 2C /r CVTTPS2PI mm,xmm/m F30F2CA CVTTSS2SI r32,xmm/m OF 54 /r ANDPS xmm,xmm/m OF 55 /r ANDNPS xmm,xmm/m OF 56 /r ORPS xmm,xmm/m Испшшз^емые сокращения ABI Application Binary Interface Интерфейс для приложений на низком уровне AGI Address Generation Interlock Задержка для генерации адреса AMIS Alternative Multiplex Interrupt Спецификация альтернативного Specification мультиплексорного прерывания API Application Program Interface Интерфейс между приложением и программой ASCII American Standard Code Американский стандартный код for Information Interchange для обмена информацией AT&T American Telephone and Telegraph Американский телефон и телеграф (компания, которой принадлежала торговая марка UNIX) BCD Binary Coded Decimal Двоично-десятичный формат BIOS Basic Input/Output System Основная система ввода-вывода BIT Binary Digit Двоичная цифра BPB BIOS Parameter Block Блок параметров BIOS (для блочных устройств) BRM Big Real Mode Большой реальный режим (то же, что и нереальный режим) BSD Berkeley System Distribution Один из основных видов UNIX-систем Участок программы, содержащий BSS Block, Started by Symbol неинициализированные данные CMOS Complementary Metal Oxide Комплементарные металлооксИдные пары Semiconductor Общий формат объектных файлов COFF Common Object File Format CPL Current Privilege Level Текущий уровень привилегий Электронно-лучевая трубка CRT Cathode Ray Tube Цифро-аналоговый преобразователь DAC Digital to Analog Converter Набор для создания драйверов DDK Drivers Development Kit Динамическая библиотека DLL Dynamically Linked Library Прямой доступ к памяти DMA Direct Memory Access Дисковая операционная система DOS Disk Operating System Уровень привилегий дескриптора DPL Descriptor Privilege Level Assembler для DOS, Windows и UNIX Интерфейс для защищенного режима DPMI DOS Protected Mode Interface в DOS DSP Digital Signal Processor Процессор для оцифрованного звука в звуковых картах DTA Disk Transfer Area Область передачи дисковых данных (в DOS) ELF Executable and Linking Format Формат исполняемых и компонуемых файлов EMS Expanded Memory-Specification Спецификация доступа к дополнительной памяти Блок информации об исполняемой EPB Execution Program Block программе Таблица распределения файлов FAT File Allocation Table Регистр управления FIFO FCR FIFO Control Register Первый вошел - первый вышел FIFO First In First Out (очередь) FM Frequency Modulation Частотный синтез Блок для работы с числами FPU Floating Point Unit с плавающей запятой GDT Global Descriptor Table Глобальная таблица дескрипторов HCI Human Computer Interface Интерфейс между пользователем и программой HMA High Memory Area Верхняя область памяти (64 Кб после первого мегабайта) IBM International Business Machines Название компании ICW Initialization Control Word Управляющее слово инициализации IDE Integrated Drive Electronics Один из интерфейсов для жестких дисков IDT Interrupt Descriptor Table Таблица дескрипторов обработчиков прерываний IER Interrupt Enable Register Регистр разрешения прерываний IOCTL Input/Output Control Управление вводом-выводом IOPL Input/Output Privilege Level Уровень привилегий ввода^вывода IRQ Interrupt Request Запрос на прерывание (от внешнего устройства) ISP Interrupt Sharing Protocol Протокол разделения прерываний LCR Line Control Register Регистр управления линией LDT Local Descriptor Table Таблица локальных дескрипторов LE Linear Executable Линейный исполняемый формат LFN Long File Name Длинное имя файла LSR Line Status Register Регистр состояния линии Используемые сокращения MASM Macro Assembler Ассемблер компании 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 Самотестирование при включении PSP Program Segment Prefix Префикс программного сегмента RBR Reciever Buffer Register Регистр буфера приемника RFC Request For Comments Запрос для комментария (форма публикации документов в Internet, включая стандарты) RFM Real Flat Mode Реальный flat-режим (то же, что и нереальный режим) Часы реального времени RTC Real Time Clock RPL Requestor Privilege Level Запрашиваемый уровень привилегий RPN Reverse Polish Notation Обратная польская запись (для арифметических выражений) Один из интерфейсов для жестких SCSI Small Computer System Interface дисков Название компании SUN Stanford University Networks Любой видеоадаптер, способный SVGA SuperVGA на режимы, большие 13h Ассемблер компании Borland TASM Turbo Assembler Регистр хранения передатчика THR Transmitter Holding Register Завершиться и остаться резидентным TSR Terminate and Stay Resident Сегмент состояния задачи TSS Task State Segment U MB Upper Memory Block Блок верхней памяти (между границами 640 Кб и 1 Мб) Спецификация VESA VBE VESA BIOS Extension для расширения BIOS Один из интерфейсов к защищенному VCPI Virtual Control Program Interface режиму для DOS Ассоциация по стандартизации VESA Video Electronics Standard видео в электронике Association Assembler для DOS, Windows и UNIX VGA Video Graphics Array Основной тип видеоадаптеров VxD Virtual X Device Виртуальное устройство Х (общее название виртуальных драйверов в Windows 95) WASM Watcom Assembler Ассемблер компании Watcom XMS Extended Memory Specification Спецификация доступа к расширенной памяти Глоссарий А Активационная запись (activation record) - область стека, заполняемая при вы зове процедуры.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

I] Assembler для 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) - минимальный элемент растрового изображения.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Алфавитный указатель А Байт Адресация Байты состояния клавиатуры косвенная Бит с масштабированием Блоки непосредственная информации VBE по базе параметров PSP с индексированием параметров запускаемого файла со сдвигом Блоки повторений по смещению в UNIX полная форма Буфер клавиатуры прямая расширение при помощи драйвера регистровая Активационные записи 219 В дисплей Ввод стековый кадр из стандартного устройства ввода Алгоритмы с клавиатуры вывода на экран с помощью мыши шестнадцатеричного числа Видеопамять генераторов случайных чисел в SVGA-режимах генерации пламени в графических режимах неупакованного BCD в ASCII в текстовом режиме преобразования Видеорежимы цифры в ASCII-код SVGA шестнадцатеричного числа VGA в десятичное Виртуальная память рисования Виртуальные прерывания (в V86) круга Вложенные процедуры прямой линии Время выполнения микроопераций сортировки Вывод Ассемблер в стандартное устройство вывода директивы на экран макроопределения 121 в VGA-режимах метки в текстовом режиме 134, модели памяти 112 Вычисления операторы с плавающей запятой преимущества и недостатки с повышенной точностью процедуры с фиксированной запятой псевдокоманды сегменты структура программ 106 Генераторы случайных чисел условное ассемблирование 118 вычитаниями Атрибут символа 136 конгруэнтные Алфавитный указатель DLL (в Windows 95/NT) ELF Дата и время EXE (в DOS) Дескрипторы РЕ (в Windows 95/NT) сегмента данных или кода SYS (в DOS) Джойстик VxD (в Windows 95) Диалоги Динамик 335 К Динамические библиотеки Кластер Директивы ассемблера Кодировки в DOS/Windows Коды команд в UNIX Командные параметры Директории Команды Драйверы VxD 457 блочные 384 AAD символьные 375 ААМ AAS ADC Завершение программы ADD Задача ADDPS Защита памяти ADDSS Защита страниц AND Защищенный режим ANDNPS адресация ANDPS модель памяти ARPL селекторы BOUND средствами DPMI средствами VCPI 391 BSF Звук BSR без программирования DMA 355 BSWAP с программированием DMA 361 ВТ Звуковые платы 339 BTC BTR И BTS Идентификация процессора CALL Инициализация контроллера прерываний CBW Интерфейс CDQ DPMI CLC вызов прерываний CLD обработчики прерываний операции над дескрипторами 395 CLI передача управления между CLTS режимами 396 CMC управление памятью 405 CMOVcc VCPI CMP Исключения CMPPS FPU CMPS SSF. CMPSS в реальном режиме CMPXCHG код ошибки CMPXVHG8B список и функции CPU ID Исполняемые файлы COFF(BUNIX)540 COMISS СОМ (в DOS) 128 CVT* Assembler для DOS, Windows и UNIX FNSAVE CWD CWDE 32 FNSTCW FNSTENV DAA FNSTSW DAS FPATAN DEC FPREM DIV FPREM1 DIVPS FPTAN DIVSS FRNDINT EMMS FRSTOR ENTER FSAVE F2XM1 FSCALE FABS FSIN FADDP FSINCOS FBLD FSQRT FBSTP FST FCHS FSTCW FCLEX FSTENV FCMOVcc FSTP FCOM FSTSW FCOMI FSUB FCOMIP FSUBP FCOMP FSUBR FCOMPP FSUBRP FCOS FST FDECSTP FUCOM FDIV FUCOMI FDIVP FUCOMIP FDIVR FUCOMP FDIVRP FUCOMPP FFREE FWAIT FIADD FXAM FICOM 75 FXCH FICOMP FXRSTOR 81, FIDIV 72 FXSAVE 81, ЮЗ FIDIVR 72 FXTRACT FILD 69 FYL2X FIMUL 71 FYL2XP1 FINCSTP 78 HIT FINIT 79 IDIV FIST 69 IMUL FISTP 69 IN FISUB 71 INC FISUBR 71 INS FLD 68 INT FLD* 78 INT3 FLDCW 80 INTO FLDENV 81 INVD FMUL 71 INVLPG FMULP 71 IRET FNCLEX 79 Jcc FNINIT 79 JCXZ FNOP 82 JECXZ Алфавитный указатель JMP 47 OR LAHF 58 ORPS LAR 484 OUT LDMXCSR 103 OUTS LDS 59 PACK* LEA 34 PADD* LEAVE 53 PAND PANDN LES PAVGB LFS LGDT 482 - PAVGW LGS 59 PCMP* LIDT 483 PEXTRW PINSRW LLDT LMSW 483 PMADDWD LOCK 60 PMAXSW PMAXUB LODS PMINSW LOOP LOOPE 50 PMINUB PMOVMSKB LOOPNE PMUL* LOOPNZ LOOPZ 50 PMULHUW POP LSL POR LSS POPA LTR POPF MASKMOVQ PREFETCH* MAXPS PSADBW MAXSS PSLL* MINPS PSRA* MINSS PSRL* MOLPS PSUB* MOLSS PUNPCK* MOV 28, PUSH MOVAPS PUSHA MOVD PUSHF MOVHLPS PXOR MOVHPS RCL MOVLHPS RCPPS MOVLPS RCPSS MOVMSKPS RCR MOVNTPS RDMSR MOVNTQ RDPMC MOVQ RDTSC MOVS REP MOVSS REPE MOVSX REPNE MOVUPS REPNZ MOVZX REPZ MUL RET MULPS RETF MULSS RETN NEC ROL NOP ROR NOT Assembler для DOS, Windows и UNIX RSM 486 вЕХЕ-файл в UNIX RSQRTPS RSQRTSS 96 драйверы для DOS SAHF 58 графического приложения SAL 43 с ресурсами SALC 59 консольного приложения SAR 43 с использованием расширителей DOS SBB 35 Конвейеры исполнения команд SCAS 55 Конвенции передачи параметров SETcc 46 С-конвенция 461 ;

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