AND dest,src |
Логическая операция "AND". Обнуление бит dest, которые равны нулю у src. |
TEST dest,src |
Аналогична "AND", но не меняет dest. Используется для проверки ненулевых бит. |
OR dest,src |
Логическая "ИЛИ". В dest устанавливаются биты, отличные от нуля в src. |
XOR dest,src |
Исключающее "ИЛИ". |
NOT dest |
Переключение всех бит (инверсия). |
Переключение задач
Переключение задач
Состояние каждой задачи (значение всех регистров, связанных с данной задачей) хранится в сегменте состояния задачи (TSS), на который указывает адрес в регистре задачи. При переключении задач достаточно загрузить новый селектор в регистр задачи, и состояние старой задачи автоматически сохранится в TSS, в процессор же загрузится состояние новой задачи.
Справочник APIфункций и сообщений Windows
Приложение 1. Справочник API-функций и сообщений Windows.
В силу ограниченного объема книги мы не можем дать полный список API-функций — их насчитывается более двух тысяч. Мы даем список API-функций, которые содержатся в данной книге с кратким комментарием и указанием глав, где они были использованы или хотя бы упомянуты. Вторая таблица посвящена сообщениям Windows.
Справочник по командам и архитектуре Pentium
Приложение 2. Справочник по командам и архитектуре Pentium
В литературе при описании команд микропроцессоров часто встречаются досадные ошибки. Стараясь избежать таких ошибок, автор выверял описание команд по нескольким источникам [3,5,6,8,9,10]. Часть команд была проверена программным путем.
Защищенный режим микропроцессора Pentium
Приложение 3. Защищенный режим микропроцессора Pentium
В главе 3.6 мы уже говорили о схеме преобразования логического адреса в физический адрес. Здесь мы дадим информацию о некоторых структурах, используемых в защищенном режиме.
В отличие от реального режима, сегментные регистры содержат в защищенном режиме не адреса, а селекторы. Рассмотрим структуру селектора:
0-1-й биты, запрошенный программой уровень привилегий; 2-й бит, определяет, использовать глобальную таблицу дескрипторов GDT (0) или локальную таблицу дескрипторов LDT (1); 3-16-й биты, индекс дескриптора в таблице.
Дескриптор для защищенного режима - это 64-битная структура, которая может описывать сегмент кода, сегмент данных, сегмент состояния задачи, шлюз вызова, ловушки, прерывания или задачи. Дескриптор в глобальной дескрипторной таблице может описывать локальную дескрипторную таблицу.
Расширение MMX
Расширение MMX
.
Расширение MMX ориентировано в основном на использование в мультимедийных приложениях. Основная идея MMX заключается в одновременной обработке нескольких элементов данных за одну инструкцию. Расширение MMX появилось в процессорах модификации Pentium P54C и присутствует во всех последних модификациях этого процессора.
Расширение MMX использует новые типы упакованных данных: упакованные байты (восемь байт), упакованные слова (четыре слова), упакованные двойные слова (два двойных слова), учетверенное слово. Расширение MMX включает восемь регистров общего пользования (MM0-MM7). Размер регистров составляет 64 бита. Физически эти регистры пользуются младшими битами рабочих регистров сопроцессора. Команды MMX "портят" регистр состояния и регистр тэгов. По этой причине совместное использование команд MMX и команд сопроцессора может вызвать определенные трудности. Другими словами, перед каждым использованием команд MMX Вам придется сохранять контекст сопроцессора, а это может весьма замедлить работу программы. Важно отметить также, что команды MMX работают непосредственно с регистрами сопроцессора, а не с указателями на элементы стека.
Регистр CR
Регистр CR2
хранит 32-битный линейный адрес, по которому был получен последний отказ страницы памяти.
Регистр CR3
- в старших 20 битах хранится физический базовый адрес таблицы каталога страниц.
Остальные биты.
3-й бит, кэширование страниц со сквозной записью (PWT). 4-й бит, запрет кэширование страницы (PCD).
Регистр CR4
0-й бит, разрешение использования виртуального флага прерываний в режиме V8086 (VME). 1-й бит, разрешение использования виртуального флага прерываний в защищенном режиме (PVI). 2-й бит, превращение инструкции RDTSC в привилегированную (TSD). 3-й бит, разрешение точек останова по обращению к портам ввода-вывода (DE). 4-й бит, включает режим адресации с 4-мегабайтными страницами (PSE). 5-й бит, включает 36-битное физическое адресное пространство (РАЕ). 6-й бит, разрешение исключения МС (МСЕ). 7-й бит, разрешение глобальной страницы (PGE). 8-й бит, разрешает выполнение команды RDPMC (РМС). 9-й бит, разрешает команды быстрого сохранения/восстановления состояния сопроцессора (FSR).
Регистр CR0.
0-й бит, разрешение защиты (РЕ). Переводит процессор в защищенный режим. 1-й бит, мониторинг сопроцессора (МР). Вызывает исключение 7 по каждой команде WAIT. 2-й бит, эмуляция сопроцессора (ЕМ). Вызывает исключение 7 по каждой команде сопроцессора. 3-й бит, бит переключения задач (TS). Позволяет определить, относится данный контекст сопроцессора к текущей задаче или нет. Вызывает исключение 7 при выполнении следующей команды сопроцессора. 4-й бит, индикатор поддержки инструкций сопроцессора (ЕТ). 5-й бит, разрешение стандартного механизма сообщений об ошибке сопроцессора (NE). 5-15-й бит, не используются. 16-й бит, разрешение защиты от записи на уровне привилегий супервизора (WP). 17-й бит, не используется. 18-й бит, разрешение контроля выравнивания (AM). 19-28-й бит, не используются. 29-й бит, запрет сквозной записи кэша и циклов аннулирования (NW). 30-й бит, запрет заполнения кэша (CD). 31-й бит, включение механизма страничной переадресации.
Регистр флагов
Регистр флагов
. Содержит 32 бита. Вот используемые значения битов.
0-й бит, флаг переноса (CF), устанавливается в 1 если был перенос из старшего бита; 1-й бит, 1; 2-й бит, флаг четности (PF). Устанавливается в 1, если младший байт результата содержит четное число единиц. 3-й бит, 0; 4-й бит, флаг вспомогательного переноса (AF). Устанавливается в 1, если произошел перенос из третьего бита в четвертый. 5-й бит, 0; 6-й бит, флаг нуля (ZF). Устанавливается в единицу, если результат операции ноль; 7-й бит, флаг знака (SF). Равен старшему биту результата; 8-й бит, флаг ловушки (TF). Установка в единицу этого флага приводит к тому, что после каждой команды вызывается INT 3. Используется отладчиками в реальном режиме; 9-й бит, флаг прерываний (IF). Сброс этого флага в 0 приводит к тому, что микропроцессор перестает воспринимать прерывания; 10-й бит, флаг направления (DF). Данный флаг учитывается в строковых операциях. Если флаг равен 1, то в строковых операциях адрес автоматически уменьшается; 11-й бит, флаг переполнения (OF). Устанавливается в единицу, если результат операции над числом со знаком вышел за допустимые пределы; 12,13-й биты, уровень привилегий ввода-вывода (IOPL); 14-бит, флаг вложенной задачи (NT); 15-й бит, 0; 16-й бит, флаг возобновления (RF). Используется совместно с регистрами точек отладочного останова; 17-й бит, в защищенном режиме включает режим виртуального режима 8086 (VM); 18-й бит, флаг контроля выравнивания (AC). При равенстве этого флага 1 и при обращении к невыровненному операнду вызывает исключение 17; 19-й бит, виртуальная версия флага IF (VIF). Работает в защищенном режиме; 20-й бит, виртуальный запрос прерывания (VIP); 21-й бит, флаг доступности команды идентификации; 22-31-й, 0;
Регистры общего назначения
Регистры общего назначения
EAX = (16+AX=(AH+AL)) EBX = (16+BX=(BH+BL)) ECX = (16+CX=(CH+CL)) EDX = (16+DX=(DH+DL)) ESI = (16+SI) EDI = (16+DI) EBP = (16+BP) ESP = (16+SP)
Регистры EAX, EBX, EDX, ECX называют рабочими регистрами. Регистры EDI, ESI - индексные регистры, играют особую роль в строковых операциях. Регистр EBP обычно используется для адресации в стеке параметров и локальных переменных. Регистр ESP - указатель стека, автоматически модифицируется командами PUSH, POP, RET, CALL. Явно используется реже.
Регистры отладки
Регистры отладки
DR0...DR3 - хранят 32-битные линейные адреса точек останова.
DR6 (равносильно DR4) - отражает состояние контрольных точек.
DR7 (равносильно DR5) - управляет установкой контрольных точек.
Сдвиговые операции
Сдвиговые операции.
Начиная с 386-ого микропроцессора, непосредственный операнд src может быть не только 1, но произвольным числом. В ранних версиях для количества сдвигов использовался регистр CL.
RCL/RCR dest,src |
Циклический сдвиг влево/вправо через бит переноса CF. Src может быть либо CL, либо непосредственный операнд. |
ROL/ROR dest,src |
Аналогично командам RCL/RCR, но по другому, работает с флагом CF. Флаг не участвует в цикле, но в него попадает бит, перешедший с начала на конец или наоборот. |
SAL/SAR dest,src |
Сдвиг влево/право. Называется еще арифметическим сдвигом. При сдвиге вправо дублируется старший бит. При сдвиге влево младший бит заполняется нулем. Ушедший бит помещается в CF. |
SHL/SHR dest,src |
Логический сдвиг влево/вправо. Сдвиг вправо отличается от SAR тем, что и старший бит заполняется нулем. |
SHLD/SHRD dest,src,count |
Трехоперандные команды сдвига влево/вправо. Первым операндом, как обычно, может быть либо регистр, либо ячейка памяти, вторым операндом должен быть регистр общего назначения, третьим - регистр CL или непосредственный операнд. Суть операции заключается в том, что dest и src в начале объединяются, а потом производится сдвиг на количество бит count. Результат снова помещается в dest. |
Сегментные регистры
Сегментные регистры
CS - сегмент кода,
DS - сегмент данных,
SS - сегмент стека,
ES,GS,FS - дополнительные регистры. Сегментные регистры 16-битны.
Системные адресные регистры
Системные адресные регистры
GDTR - 6-байтный регистр, в котором содержится линейный адрес глобальной дескрипторной таблицы.
IDTR - 6-байтный регистр, содержащий 32-битный линейный адрес таблицы дескрипторов обработчиков прерываний.
LDTR - 10-байтный регистр, содержащий 16-битный селектор (индекс) для GDT и 8-байтный дескриптор.
TR - 10-байтный регистр, содержащий 16-битный селектор для GDT и весь 8-байтный дескриптор из GDT, описывающий TSS текущей задачи.
Страничное управление памятью
Страничное управление памятью
Механизм со страничным управлением памятью включается установкой бита PG в регистре CR0. Регистр CR2 хранит линейный адрес отказа и адрес памяти, по которому был обнаружен последний отказ страницы. Регистр CR3 хранит физический адрес каталога страниц. Младшие 12 бит этого регистра всегда равны нулю (выравнивание по границе страниц). Каталог страниц состоит из 32-битных элементов и имеет длину 4 Кб.
20 старших бит адреса таблицы следующего уровня |
Резерв 3 бита |
G |
P S |
D |
A |
P C D |
P W T |
U / S |
R / W |
P |
Каждая таблица страниц также имеет размер 4 Кб и элементы аналогичного формата. Но эти элементы содержат базовый адрес самих страниц и атрибуты страниц. Физический адрес собирается из базового адреса и младших 12 бит линейного адреса. Значение атрибутов страниц:
G - глобальная страница, страница не удаляется из буфера. PS - размер страницы. Если 1, то размер страницы 4 Mb*
D - грязная страница. Устанавливается в 1 при записи на страницу. А - бит доступа. Устанавливается в 1 при любом обращении к странице. PCD - бит запрещения кэширования. PWT - бит разрешения сквозной записи. U/S - страница или таблица доступна для программ с уровнем доступа 3. R/W - страница/таблица доступна для записи. P - страница/таблица присутствуют.
*
Автор не упомянул (точнее в оригинале опечатка :), но следует добавить, что 4 Мб - при нормальной 32-битной адресации, и 2 Мб - при разрешенной расширенной физической адресации).
Строковые операции
Строковые операции
REP |
Префикс, означающий повтор строковой операции до обнуления ECX. Префикс имеет также разновидности REPZ (REPE) - выполнять, пока не нуль (ZF=1), REPNZ (REPNE) - выполнять, пока нуль. |
MOVS dest,src |
Команда передает байт, слово или двойное слово из цепочки, адресуемой DS:[ESI], в цепочку dest, адресуемую ES:[EDI]. При этом EDI и ESI автоматически корректируются согласно значению флага DF. Допускается явная спецификация MOVSB (byte), MOVSW (word), MOVSD (dword). Dest и src можно явно не указывать. |
LODS src |
Команда загрузки цепочки в аккумулятор. Имеет разновидности LODSB, LODSW, LODSD. При выполнении команды байт, слово, двойное слово загружается соответственно в AL,AX,EAX. При этом ESI автоматически изменяется на 1 в зависимости от значения флага DF. Префикс REP не используется. |
STOS dest |
Команда, обратная LODS, т.е. передает байт, слово или двойное слово из аккумулятора в цепочку и автоматически корректирует EDI. |
SCAS dest |
Команда сканирования цепочки. Команда вычитает элемент цепочки dst из содержимого аккумулятора (AL\AX\EAX) и модифицирует флаги. Префикс REPNE позволяет найти в цепочке нужный элемент. |
CMPS dest,src |
Команда сравнения цепочек. Данная команда производит вычитание байта, слова или двойного слова цепочки dst из соответствующего элемента цепочки src. В зависимости от результата вычитания модифицируются флаги. Регистры EDI и ESI автоматически продвигаются на следующий элемент. При использовании префикса REPE команда означает - сравнивать, пока не будет, достигнут конец цепочки или пока элементы не будут равны. При использовании префикса REPNE команда означает - сравнивать, пока не достигнут конец цепочки или пока элементы будут равны. |
Таблица Функции API
Таблица 1. Функции API.
В третьей колонке таблицы указываются не вообще все места, где упоминается данная функция, а места, где разъясняется смысл этой функции либо просто упоминается (если нет другой информации), либо упоминается в первый раз.
Назначение функцииГде существенным образом упоминается
AllocConsole |
Создать консоль |
Глава 2.2. Консольные приложения. |
Arc | Рисовать дугу | Упоминание в Главе 2.1. |
BeginPaint |
Получить контекст при получении сообщения WM_PAINT |
Глава 2.1. См. программу на |
Таблица Сообщение операционной системы Windows
Таблица 2. Сообщение операционной системы Windows.
В третьей колонке таблицы указываются не вообще все места, где упоминается данное сообщение, а места, где разъясняется смысл этого сообщения, либо просто упоминается, если нет другой информации.
Сообщение системы
Назначение
Где существенным образом упоминается
WM_ACTIVATE |
Посылается функции окна перед активизацией и деактивизацией этого окна. |
Глава 2.4. |
WM_ACTIVATEAPP |
Посылается функции окна перед активизацией окна другого приложения. |
Глава 2.4. |
WM_CHAR |
Сообщение, возникающее при трансляции сообщения WM_KEYDOWN функцией TranslateMessage. |
Главы 1.2, 2.4. |
WM_CLOSE |
Сообщение, приходящее на процедуру окна при его закрытии. Приходит до WM_DESTROY. Дальнейшее выполнение DefWindowProc, EndDialog или WindowsDestroy и вызывает появление сообщения WM_DESTROY. |
Глава 2.3. |
WM_COMMAND |
Сообщение, приходящее на функцию окна, при наступлении события с управляющим элементом, пунктом меню, а также от акселератора. |
Главы 1.3, 2.3. |
WM_CREATE |
Первое сообщение, приходящее на функцию окна при его создании. Приходит один раз. |
См. подробнее Гл. 1.2. |
WM_DEADCHAR |
Сообщение, возникающее при трансляции сообщения WM_KEYUP функцией TranslateMessage. |
Глава 1.2. |
WM_DESTROY |
Сообщение, приходящее на функцию окна при его уничтожении. |
Подробнее см. Гл. 1.2. |
WM_GETTEXT |
Посылается окну для получения текстовой строки, ассоциированной с данным окном (строка редактирования, заголовок окна и т.д.). |
Глава 1.3, см. программу на |
Трансцендентные функции
Трансцендентные функции
|
FCOS
|
Вычисление косинуса. ST(0)<-COS(ST(0)). Содержимое в ST(0) интерпретируется как угол в радианах.
|
FPTAN
|
Частичный тангенс. Содержимое в ST(0) интерпретируется как угол в радианах. Значение тангенса возвращается на место аргумента, а затем в стек включается 1.
|
FPATAN
|
Вычисление арктангенса. Вычисляется функция Arctg(ST(1)/ST(0)). После вычисления функции происходит выталкивание из стека, после чего значение функции помещается в вершину.
|
FSIN
|
Вычисление синуса. ST(0)<-SIN(ST(0)). Содержимое в ST(0) интерпретируется как угол в радианах.
|
FSINCOS
|
Вычисление синуса и косинуса. ST(0)<-SIN(ST(0)) и ST(1)<-COS(ST(0))
|
F2XM1
|
Вычисление 2^X-1. ST(0)<-2^ST(0)-1.
|
FYL2X
|
Вычисление Y*LOG2(X). ST(0)=Y, ST(1)=X. Происходит выталкивание из стека, и только потом в вершину стека помещается результат вычисления.
|
FYL2XP1
|
Вычисление Y*LOG2(X). ST(0)=Y, ST(1)=X. Происходит выталкивание из стека, и только потом в вершину стека помещается результат вычисления.