Cамоучитель по Assembler

         

Приложения

Приложение 1. Справочник API-функций и сообщений Windows.

В силу ограниченного объема книги мы не можем дать полный список API-функций — их насчитывается более двух тысяч. Мы даем список API-функций, которые содержатся в данной книге с кратким комментарием и указанием глав, где они были использованы или хотя бы упомянуты. Вторая таблица посвящена сообщениям Windows.

Таблица 1. Функции API.

В третьей колонке таблицы указываются не вообще все места, где упоминается данная функция, а места, где разъясняется смысл этой функции либо просто упоминается (если нет другой информации), либо упоминается в первый раз.



 Назначение функцииГде существенным образом упоминается
AllocConsole Создать консоль Глава 2.2. Консольные приложения.
ArcРисовать дугуУпоминание в Главе 2.1.
BeginPaint Получить контекст при получении сообщения WM_PAINT Глава 2.1. См. программу на Рис. 2.1.1.
BitBlt Скопировать виртуальную прямоугольную область в окно Глава 2.1 и программа на Рис. 2.1.6.
CallNextHookEx Продолжить выполнение других фильтров. Глава 3.7, раздел "Фильтры".
CallWindowProc Вызвать процедуру окна. Глава 3.5. Использование подклассов.
CharToOem Функция перекодировки строки. Глава 2.2. Программа на Рис. 2.2.3.
CloseHandle Закрыть объект: файл, консоль, коммуникационный канал, созданный функцией CreateFile, CreatePipe и т.п. Глава 2.5.
CreateCompatibleBitmap Создать карту бит, совместимую с заданным контекстом. Глава 2.1, программа на Рис. 2.1.6.
CreateCompatibleDC Создать контекст, совместимый с данным окном. Глава 2.1, программа на Рис. 2.1.6.
CreateDialogParam Создать немодальное диалоговое окно. Глава 2.3, программа на Рис. 2.3.5.
CreateEvent Создать событие. Глава 3.2. События.
CreateFile Создать или открыть файл, консоль, коммуникационный канал и т.п. Глава 2.5.
CreateFileMapping Создать отображаемый файл. Глава 3.5, раздел II.
CreateFont Задать параметры шрифта. Упоминается в главе 2.1.
CreateFontIndirect Задать параметры шрифта. Глава 2.1.
CreateMutex Создать объект синхронизации "взаимоисключение" Глава 3.2. Взаимоисключения.
CreatePen Создать перо. Глава 2.1, раздел III.
CreatePipe Создать канал обмена информацией. Глава 3.5, раздел IV.
CreateProcess Создать новый процесс. Глава 3.2. программа 3.2.1.
CreateSemaphore Создать семафор. Глава 3.2. Семафоры.
CreateSolidBrush Определить кисть. Глава 2.1, программа на Рис. 2.1.1.
CreateThread Создать поток. Глава 3.2, программа на Рис. 3.2.2.
CreateWindow Создать окно. Глава 1.2. Начала программирования в Windows.
CreateWindowEx Расширенное создание окна. Глава 1.2.
DefWindowProc Вызывается для сообщений, которые не обрабатываются функцией окна. Глава 1.2, программа на Рис. 1.2.1.
DeleteCriticalSection Удалить объект "критическая секция". Глава 3.2. Критические секции.
DeleteDC Удалить контекст, полученный посредством функций типа CreatePen или CreateDC. Глава 2.1, программа на Рис. 2.1.6.
DeleteObject Удалить объект, выбранный функцией SelectObject. Глава 2.1, программа на Рис. 2.1.3.
DestroyMenu Удалить меню из памяти. Глава 2.4, программа на Рис. 2.4.1.
DestroyWindow Удалить окно из памяти. Глава 2.3, программа на Рис. 2.3.5.
DeviceIoControl Вызов сервиса динамического виртуального драйвера. Глава 4.7. См. раздел "Динамические драйверы".
DialogBox Создать модальное диалоговое окно. Глава 2.3.
DialogBoxParam Создать немодальное диалоговое окно. Глава 2.3, программа на Рис. 2.3.2.
DispatchMessage Вернуть управление Windows с передачей сообщения предназначенному окну. Глава 1.2.
Ellipse Рисовать эллипс. Глава 2.1.
EndDialog Удалить модальное диалоговое окно. Глава 2.3. См. Рис. 2.3.2.
EndPaint Удалить контекст, полученный при помощи BeginPaint. Глава 2.1, программа на Рис. 2.1.1.
EnterCriticalSection Войти в критическую секцию. Глава 3.2. Критические секции.
EnumWindows Пересчитать окна. Глава 3.5, раздел VIII.
ExitProcess Закончить данный процесс со всеми подзадачами (потоками). Глава 1.2.
ExitThread Выход из потока с указанием кода выхода. Глава 3.2.
FindFirstFile Первый поиск файлов в каталоге. Глава 2.5. Поиск файлов.
FindNextFile Осуществить последующий поиск в каталоге. Глава 2.5. Поиск файлов.
FlushViewOfFile Сохранить отображаемый файл или его часть на диск. Глава 3.5.
FreeConsole Освободить консоль. Глава 2.2. См. программу на Рис. 2.2.3.
FreeLibrary Выгрузить динамическую библиотеку. Глава 3.3. См. программу на Рис. 3.3.3.
GetCommandLine Получить командную строку программы. Глава 2.2.
GetCursorPos Получить положение курсора в экранных координатах. Глава 3.1, программа на Рис. 3.1.3.
GetDC Получить контекст окна. Глава 2.1. См. программу на Рис. 2.1.6.
GetDiskFreeSpace Определяет объем свободного пространства на диске. Глава 3.4., раздел I.
GetDlgItem Получить дескриптор управляющего элемента в окне. Глава 3.1. См. Рис. 3.1.3.
GetDriveType Получить тип устройства. Глава 3.4. См. программу на Рис. 3.4.1.
GetLocalTime Получить местное время. Глава 3.1. См. программу на Рис. 3.1.2.
GetMenuItemInfo Получить информацию о выбранном пункте меню. Глава 2.4. См. программу на Рис. 2.4.1.
GetMessage Получить очередное сообщение из очереди сообщений данного приложения. Глава 1.2.
GetModuleHandle Получить дескриптор приложения. Глава 1.2, программа на Рис. 1.2.2.
GetProcAddress Получить адрес процедуры (в динамической библиотеке). См. главу 3.3.
GetStdHandle Получить дескриптор консоли. Глава 2.2.
GetStockObject Определить дескриптор стандартного объекта. См. главу 1.4.
GetSystemDirectory Получить системный каталог. Глава 3.2.
GetSystemMetrics Определить значение системных характеристик. Глава 2.1, программа на Рис. 2.1.6.
GetSystemTime Получить время по Гринвичу. Упоминается в главе 3.1.
GetTextExtentPoint32 Определить параметры текста в данном окне. Глава 2.1, программа на Рис. 2.1.2.
GetWindowRect Определить размер окна. Глава 2.1, программа на Рис. 2.1.2.
GetWindowsDirectory Получить каталог Windows. Глава 3.2.
GetWindowText Получить заголовок окна. Глава 3.5, программа на Рис. 3.5.4.
GetWindowThreadProcessId Получить идентификатор процесса. Глава 3.5, программа на Рис. 3.5.4.
GlobalAlloc Выделить блок памяти. Глава 3.7. См. раздел III.
GlobalDiscard Удалить удаляемый блок памяти. Глава 3.7. См. раздел III.
GlobalFree Освободить блок памяти. Глава 3.7. См. раздел III.
GlobalLock Фиксировать перемещаемый блок памяти. Глава 3.7. См. раздел III.
GlobalReAlloc Изменить размер блока памяти. Глава 3.7. См. раздел III.
GlobalUnlock Снять фиксацию блока памяти. Глава 3.7. См. раздел III.
InitializeCriticalSection Создать объект критическая секция. Глава 3.2. Программа на Рис. 3.2.3.
InvalidateRect Перерисовать окно. Глава 2.1. См. программу на Рис. 2.1.6.
KillTimer Удалить таймер. Глава 3.1. См. программу на 3.1.1.
LeaveCriticalSection Покинуть критическую секцию. Глава 3.2. Программа на Рис. 3.2.3.
LineTo Провести линию от текущей точки к заданной. Глава 2.1. Программа на Рис. 2.1.6.
LoadAccelerators Загрузить таблицу акселераторов.  
LoadCursor Загрузить системный курсор или курсор, определенный в файле ресурсов. Глава 1.2.2.
LoadIcon Загрузить системную иконку или иконку, определенную в файле ресурсов. Глава 1.2.2.
LoadLibrary Загрузить динамическую библиотеку. Глава 3.3, программа на Рис. 3.3.3.
LoadMenu Загрузить меню, которое определено в файле ресурсов. Глава 2.3. См. программу на Рис. 2.3.3.
LoadString Загрузить строку, определенную в файле ресурсов. Глава 2.3, программа на Рис. 2.3.2.
lstrcat Производит конкатенацию двух строк. Впервые упоминается в главе 2.5.
lstrcpy Скопировать одну строку в другую. Впервые упоминается в главе 2.5.
lstrlen Получить длину строки. Впервые упоминается в главе 2.5.
MapViewOfFile Скопировать файл или части файла в память. Глава 3.5. См. раздел II.
MessageBox Выдать окно сообщения. Глава 1.2.
MoveToEx Сменить текущую точку. Глава 2.1, программа на Рис. 2.1.6.
MoveWindow Установить новое положение программа окна. Глава 3.1, на Рис. 3.1.3.
OpenEvent Открыть событие. Глава 3.2. См. раздел События.
OpenSemaphore Открыть семафор. Глава 3.2. См. раздел "Семафоры".
PatBlt Заполнить заданную прямоугольную область. Глава 2.1, программа на Рис. 2.1.6.
Pie Рисовать сектор эллипса. Упоминается в главе 2.1.
PostMessage Аналогична SendMessage, но сразу возвращает управление. Глава 3.3, программа на Рис. 3.3.6.
PostQuitMessage Послать текущему приложению сообщение WM_QUIT. Глава 1.2.
ReadConsole Читать из консоли. Глава 2.2. См. раздел II.
ReadFile Читать из файла или того, что было создано функцией CreateFile. Глава 2.5
Rectangle Рисовать прямоугольник. Глава 2.1, раздел III.
RegisterClass Зарегистрировать класс окон. Глава 1.2.
RegisterHotKey Зарегистрировать горячую клавишу. Глава 2.4, программа на Рис. 2.4.2.
ReleaseDC Удалить контекст, полученный при помощи GetDC Глава 2.1, программа на Рис. 2.1.6.
ReleaseSemaphore Освободить семафор Глава 3.2. См. раздел "Семафоры".
ResetEvent Сбросить событие Глава 3.2. См. раздел "События".
ResumeThread Запустить "спящий" процесс. Глава 3.2, раздел II.
RoundRect Рисовать прямоугольник с округленными углами. Глава 2.1.
RtlMoveMemory Копировать блок памяти в другой блок. В помощи по API-функциям она называется MoveMemory. Глава 3.4, программа на Рис. 3.4.4.
SelectObject Выбрать объект (перо, кисть) в указанном контексте. Глава 2.1, программа на Рис. 2.1.3.
SendDlgItemMessage Послать сообщение управляющему элементу окна. Глава 2.4.
SendMessage Послать сообщение окну. Глава 1.3, программа на Рис. 1.3.2.
SetBkColor Установить цвет фона для вывода текста. Глава 2.1. Программа на Рис. 2.1.1.
SetConsoleCursorPosition Установить курсор в заданную позицию в консоли. Глава 2.2, программа на Рис. 2.2.3.
SetConsoleScreenBufferSize Установить размер буфера консоли. Глава 2.2, программа на Рис. 2.2.3.
SetConsoleTextAttribute Установить цвет текста в консоли. Глава 2.2, программа на Рис. 2.2.3.
SetConsoleTitle Установить название окна консоли. Глава 2.2, программа на Рис. 2.2.3.
SetEvent Подать сигнал о наступлении события. Глава 3.2. См. раздел "События".
SetFocus Установить фокус на заданное окно. Глава 1.3.
SetLocalTime Установить время и дату. Упоминается в главе 3.1.
SetMapMode Установить соотношение между логическими единицами и пикселями. Упоминается в главе 2.1.
SetMenu Назначить новое меню данному окну. Глава 2.3, программа на Рис. 2.3.3.
SetPixel Установить заданный цвет пикселя. Глава 2.1, программа на Рис. 2.1.6.
SetSystemTime Установить время, используя гринвичские координаты. Упоминается в главе 3.1.
SetTextColor Установить цвет текста. Глава 2.1, программа на Рис. 2.1.1.
SetTimer Установить таймер. Глава 3.1.
SetViewportExtEx Установить область вывода. Глава 2.1.
SetViewportOrgEx Установить начало области вывода. Глава 2.1.
SetWindowLong Изменить атрибут уже созданного окна. Глава 3.5. См. раздел III.
SetWindowsHookEx Установить процедуру-фильтр. Глава 3.7, программа на Рис. 3.7.5.
Shell_NotifyIcon Посредством данной функции можно поместить иконку приложения на системную панель. Глава 3.5. См. программу на Рис. 3.5.1.
SHFileOperation Осуществляет групповую операцию над файлами и каталогами. Глава 3.5. См. раздел VI.
SHGetDesktopFolder Выводит диалоговое окно для выбора каталогов и файлов. Глава 3.5. См. раздел VI.
ShowWindow Показать окно, установить статус показа. Глава 1.2.
Sleep Вызывает задержку. Глава 3.2. см. рис. 3.2.2.
TerminateProcess Уничтожить процесс. Глава 3.2. См. программу на Рис. 3.2.1.
TerminateThread Удалить поток. Глава 3.2. См. программу 3.2.1.
TextOut Вывести текст в окно. Глава 2.1.
timeKillEvent Удалить таймер. Глава 2.2. См. раздел III.
timeSetEvent Установить таймер. Глава 2.2. См. раздел III.
TranslateAccelerator Транслирует акселераторные клавиши в команду выбора пункта меню. Глава 2.3. См. раздел III.
TranslateMessage Транслировать клавиатурные сообщения в ASCII-коды. Глава 1.2.
UnhookWindowsHookEx Снять процедуру-фильтр. Глава 3.6. Программа на Рис. 3.6.5.
UnmapViewOfFile Сделать указатель на отображаемый файл недействительным. Глава 3.5. См. раздел II.
UnregisterHotKey Снять регистрацию горячей клавиши. Глава 2.4, программа на Рис. 2.4.2.
UpdateWindow Обновить рабочую область окна. Глава 1.2.
VirtualAlloc Зарезервировать блок виртуальной памяти или отобразить на него физическую память. Глава 3.6. См. раздел III.
VirtualFree Снять резервирование с блока виртуальной памяти или сделать блок виртуальной памяти неотображенным. Глава 3.6. См. раздел III.
WaitForSingleObject Ожидает одно из двух событий: определенный объект сигнализирует о своем состоянии, вышло время ожидания (TimeOut). Работает с такими объектами, как семафор, событие, взаимоисключение, процесс, консольный ввод и др. Глава 3.2. См. раздел "Семафоры".
WNetAddConnection2 Осуществляет соединение с сетевым ресурсом локальной сети. Глава 3.4.
WNetCancelConnection2 Отсоединить от ресурса локальной сети. Глава 3.4.
WNetCloseEnum Найти все ресурсы локальной сети данного уровня. Глава 3.4.
WNetGetConnection Получить информацию о данном соединении. Глава 3.4.
WNetOpenEnum Открыть поиск ресурсов в локальной сети. Глава 3.4.
WriteConsole Вывод в консоль. Глава 2.2, программа на Рис. 2.2.1.
wsprintf Преобразовать последовательность параметров в строку. Глава 2.2. См. программу на Рис. 2.2.4.

Таблица 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, см. программу на Рис. 1.3.2.
WM_HOTKEY Генерируется при нажатии горячей клавиши. Глава 2.4 и программа на Рис. 2.4.2.
WM_INITDIALOG Сообщение, приходящее на функцию диалогового окна вместо сообщения WM_CREATE. Глава 2.3.
WM_KEYDOWN Сообщение, генерируемое при нажатии клавиши клавиатуры и посылаемое окну, имеющему фокус ввода. Главы 1.2, 2.3.
WM_KEYUP Сообщение, генерируемое при отпускании клавиши клавиатуры и посылаемое окну, имеющему фокус ввода. Главы 1.2, 2.3.
WM_LBUTTONDOWN Сообщение генерируется при нажатии левой кнопки мыши. Глава 1.2.
WM_MENUSELECT Посылается окну, содержащему меню, при выборе пункта меню. Глава 2.4.
WM_PAINT Сообщение посылается окну перед его перерисовкой. Главы 1.2, 1.3.
WM_QUIT Сообщение, приходящее приложению (не окну) при выполнении функции PostQuitMessage. При получении этого сообщения происходит выход из цикла ожидания и, как следствие, выход из программы. Глава 1.2. См. комментарий к программе на Рис. 1.2.2.
WM_RBUTTONDOWN Сообщение генерируется при нажатии правой кнопки мыши. Глава 1.2, программа на рис. 1.2.2.
WM_SETFOCUS Сообщение, посылаемое окну, после того, как оно получило фокус. Глава 1.3, программа на Рис.1.3.2
WM_SETICON Приложение посылает окну данное сообщение, чтобы ассоциировать с ним новую иконку (значок). Глава 2.3.
WM_SETTEXT Сообщение, используемое приложением для посылки текстовой строки окну и интерпретируемое в зависимости от типа окна (обычное окно - заголовок, кнопка — надпись на кнопке, окно редактирования - содержимое этого окна и т.д.). Глава 1.3, см. программу на Рис. 1.3.2.
WM_SIZE Посылается функции окна после изменения его размера. Глава 3.5, см. программу на Рис. 3.5.1.
WM_SYSCHAR Сообщение, возникающее при трансляции сообщения WM_SYSKEYDOWN функцией TranslateMessage. Глава 1.2.
WM_SYSCOMMAND Генерируется при выборе пунктов системного меню или меню окна. Глава 2.3. См. также Рис. 2.3.4.
WM_SYSDEADCHAR Сообщение, возникающее при трансляции сообщения WM_SYSKEYUP функцией TranslateMessage. Глава 1.2.
WM_SYSKEYDOWN Сообщение аналогично WM_KEYDOWN, но генерируется, когда нажата и удерживается еще и клавиша Alt. Главы 1.2, 2.3.
WM_SYSKEYUP Сообщение аналогично WM_SYSKEYDOWN, но генерируется при отпускании клавиши. Главы 1.2, 2.3.
WM_TIMER Сообщение, приходящее на функцию окна или специально определенную таймерную процедуру после определения интервала таймера при помощи функции SetTimer. Глава 3.1 полностью посвящена данному сообщению.
WM_VKEYTOITEM Сообщение окну приложения, когда нажимается какая-либо клавиша при наличии фокуса на данном списке. Список должен иметь свойство LBS_WANTKEYBOARDINPUT. Глава 2.4.

Приложение 2. Справочник по командам и архитектуре Pentium

В литературе при описании команд микропроцессоров часто встречаются досадные ошибки. Стараясь избежать таких ошибок, автор выверял описание команд по нескольким источникам [3,5,6,8,9,10]. Часть команд была проверена программным путем.

Список регистров микропроцессора Pentium

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

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. Явно используется реже.

Регистр флагов. Содержит 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;

Сегментные регистры

CS - сегмент кода,
DS - сегмент данных,
SS - сегмент стека,
ES,GS,FS - дополнительные регистры. Сегментные регистры 16-битны.

Управляющие регистры

Регистр 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-й бит, включение механизма страничной переадресации.

Регистр CR1 пока не используется.

Регистр 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).

Системные адресные регистры

GDTR - 6-байтный регистр, в котором содержится линейный адрес глобальной дескрипторной таблицы.
IDTR - 6-байтный регистр, содержащий 32-битный линейный адрес таблицы дескрипторов обработчиков прерываний.
LDTR - 10-байтный регистр, содержащий 16-битный селектор (индекс) для GDT и 8-байтный дескриптор.
TR - 10-байтный регистр, содержащий 16-битный селектор для GDT и весь 8-байтный дескриптор из GDT, описывающий TSS текущей задачи.

Регистры отладки
DR0...DR3 - хранят 32-битные линейные адреса точек останова.
DR6 (равносильно DR4) - отражает состояние контрольных точек.
DR7 (равносильно DR5) - управляет установкой контрольных точек.

Команды пересылки данных

MOV dest,src Пересылка данных в регистр из регистра, памяти или непосредственного операнда. Пересылка данных в память из регистра или непосредственного операнда. Например, MOV AX,10; MOV EBX,ESI; MOV AL, BYTE PTR MEM.
XCHG r/m,r Обмен данными между регистрами или регистром и памятью. Команда "память - память" в микропроцессоре Intel не предусмотрена.
BSWAP reg32 Перестановка байт из порядка "младший - старший" в порядок "старший - младший". Разряды 7-0 обмениваются с разрядами 31-24, а разряды 15-8 с разрядами 23-16. Команда появилась в 486-м микропроцессоре.
MOVSXB r,r/m Пересылка байта с его расширением до слова или двойного слова с дублированием знакового бита: MOVSXB AX,BL; MOVSXB EAX,byte ptr mem. Команда появилась с 386-ого процессора.
MOVSXW r,r/m Пересылка слова с расширением до двойного слова с дублированием знакового бита: MOVSXW EAX,WORD PTR MEM. Команда появилась с 386-ого процессора.
MOVZXB r,r/m Пересылка байта с его расширением до слова или двойного слова с дублированием нулевого бита: MOVSXB AX,BL; MOVSXB EAX,byte ptr mem. Команда появилась с 386-ого процессора.
MOVZXW r,r/m Пересылка слова с расширением до двойного слова с дублированием нулевого бита: MOVZXW EAX,WORD PTR MEM. Команда появилась с 386-ого процессора.
XLAT Загрузить в AL байт из таблицы в сегменте данных, на начало которой указывает EBX (ВХ), при этом начальное значение AL играет роль смещения.
LEA r,m Загрузка эффективного адреса. Например, LEA EAX,MEM; LEA EAX,[EBX]. Данная команда обладает магичаскими свойствами, позволяющими эффективно выполнять арифметические действия. Например, команда LEA EAX,[EAX*8] умножает содержимое EAX на 8, LEA EAX,[EAX][EAX*4] на 5, Команда LEA ECX,[EAX][ESI+5] эквивалента 3(!) командам MOV ECX,EAX/ADD ECX,ESI/ADD ECX,5.
LDS r,m Загрузить пару DS:reg из памяти. Причем вначале идет слово (или двойное слово), а в DS - последующее слово.
LES r,m Аналогично предыдущему, но для пары ES:reg.
LFS r,m Аналогично предыдущему, но для пары FS:reg.
LGS r,m Аналогично предыдущему, но для пары GS:reg.
LSS r,m Аналогично предыдущему, но для пары SS:reg.
SETcc r/m Проверяет условие "cc", если выполняется, то первый бит байта устанавливается в 1, в противном случае в 0. Условия аналогичны в условных переходах (je, jc). Например, SETE AL. Команда появилась с 386-ого микропроцессора.
LAHF Загрузить флаги в АН (устарела).
SAHF Сохранить АН в регистре флагов (устарела).

Команды ввода-вывода

IN AL(AX,EAX),Port
IN AL(AX,EAX),DX
Ввод в аккумулятор из порта ввода-вывода. Порт адресуется непосредственно или через регистр DX.
OUT port,AL(АХ,EAX)
OUT DX,AL(АХ,EAX)
Вывод в порт ввода-вывода. Порт адресуется непосредственно или через регистр DX.
[REP] INSB
[REP] INSW
[REP] INSD
Выводит данные из порта, адресуемого регистром DX в ячейку памяти ES:[EDI/DI]. После ввода байта, слова или двойного слова производится коррекция EDI/DI на 1,2,4. При наличии префикса REP процесс продолжается, пока содержимое СХ не станет равным 0.
[REP] OUTSB
[REP] OUTSW
[REP] OUTSD
Выводит данные из ячейки памяти, определяемой регистрами DS:[ESI/SI], в выходной порт, адрес которого находится в регистре DX. После вывода байта, слова, двойного слова производится коррекция указателя ESI/SI на 1,2,4.

Инструкции работы со стеком

PUSH r/m Поместить в стек слово или двойное слово. Поскольку при включении в стек слова нарушается выравнивание стека по границам двойных слов, рекомендуется в любом случае помещать в стек двойное слово.
PUSH const Поместить в стек непосредственный 32-битный операнд.
PUSHA Поместить в стек регистры EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP. Команда появилась с 386-ого процессора.
POP reg/mem Извлечь из стека слово или двойное слово.
POPА Извлечение из стека данных в регистры EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP. Команда появилась, начиная с 386-ого процессора.
PUSHF Помещение в стек регистра флагов.
POPFИзвлечь данные в регистр флагов.

Инструкции целочисленной арифметики.

ADD dest,src Сложение двух операндов. Первый операнд может быть регистром или ячейкой памяти, второй - регистром, ячейкой памяти, константой. Невозможно только, когда оба операнда являются ячейками памяти.
XADD dest,src Данная операция производит в начале обмен операндами, а затем выполняет операцию ADD. Начиная 486-ого.
ADC dest,src Сложение с учетом флага переноса - в младший бит добавляется бит (флаг) переноса.
INC r/m Инкремент операнда.
SUB dest,src Вычитание двух операндов. Остальное аналогично сложению (команда ADD).
SBB dest,src Вычитание с учетом бита переноса. Из младшего бита вычитается бит (флаг) переноса.
DEC r/m Декремент операнда.
CMP r/m,r/m Вычитание без изменения операндов (сравнение).
CMPXCHG r,m,a Сравнение с обменом. Воспринимает три операнда (регистр-операнд-источник, ячейка памяти-операнд- получатель, аккумулятор, т.е. AL,AX или EAX) Если значения в операнде-получателе и аккумуляторе равны, операнд-получатель заменяется операндом-источником, исходное значение операнда-получателя загружается в аккумулятор. Начиная с 486-ого.
CMPXCHG8B r,m,a Сравнение и обмен восьми байт. Начиная с Pentium.
NEG r/m Изменение знака операнда.
ААА Коррекция после ASCII-сложения. Коррекция результата двоичного сложения двух неупакованных десятичных чисел. Например, АХ содержит число 9H. Пара команд ADD AL,8/AAA приводит к тому, что в АХ будет содержаться 0107, т.е. ASCII-число 17.
AAS Коррекция после ASCII-вычитания. Например:
MOV AX,205H; загрузить ASCII 25 SUB AL,8; двоичное вычитание AAS ;теперь АХ содержит 107Н, т.е. 17.
ААМ Коррекция после ASCII-умножения. Для этой команды предполагается, что в регистре АХ находится результат двоичного умножения двух десятичных цифр (диапазон от 0 до 81). После выполнения команды образуется двухбайтное произведение в регистре АХ в ASCII-формате.
AAD Коррекция перед ASCII-делением. Предполагается, что младшая цифра находится в AL, а старшая - в АН.
DAA Коррекция после BCD-сложения.59
DAS Коррекция после ВСD-вычитания.
MUL r/m Умножение АL(AX,EAX) на целое беззнаковое число. Результат, соответственно, будет содержаться в АХ, DX:AX, EDX:EAX.
IMUL r/m Знаковое умножение (аналогично MUL). Все операнды считаются знаковыми. Команда IMUL имеет также двухоперандный и трехоперандный вид. Двухоперандный вид IMUL r,src r<-r*src. Трехоперандный вид IMUL dst,src,imm dst<-src*imm.
DIV r/m (src) Беззнаковое деление. Аналогично беззнаковому умножению. Осуществляет деление аккумулятора и его расширения (AH:AL, DX:AX, EDX:EAX) на делитель src. Частное помещается в аккумуляторе, а остаток - в расширении аккумулятора.
IDIV r/m Знаковое деление. Аналогично беззнаковому.
CBW Расширение байта (AL) в слово с копированием знакового бита.
CWD Расширение слова (АХ) в двойное слово (DX:AX) с копированием знакового бита.
CWDE Расширение слова (АХ) в двойное слово (EAX) с копированием знакового бита.
CDQ Преобразование двойного слова (EAX) в учетверенное слово (EDX:EAX).

59 Напоминаю, что ASCII-число предполагает одну цифру на один байт, BCD-число - одну цифру на половину байта. Т.о. скажем в регистре АХ, может находиться двухразрядное ASCII-число и четырехразрядное BCD-число.


Логические операции.

AND dest,src Логическая операция "AND". Обнуление бит dest, которые равны нулю у src.
TEST dest,src Аналогична "AND", но не меняет dest. Используется для проверки ненулевых бит.
OR dest,src Логическая "ИЛИ". В dest устанавливаются биты, отличные от нуля в src.
XOR dest,src Исключающее "ИЛИ".
NOT dest Переключение всех бит (инверсия).

Сдвиговые операции.

Начиная с 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.

Строковые операции

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 команда означает - сравнивать, пока не достигнут конец цепочки или пока элементы будут равны.

Команды управления флагами

CLC Сброс флага переноса.
CMC Инверсия флага переноса.
STC Установка флага переноса.
CLD Сброс флага направления.
STD Установка флага направления.
CLI Запрет маскируемых аппаратных прерываний.
STI Разрешение маскируемых аппаратных прерываний.
CTS Сброс флага переключения задач.

Команды передачи управления

JMP target Имеет пять форм, различающихся расстоянием назначения от текущего адреса, и способом задания целевого адреса. При работе в Windows используется в основном внутрисегментный переход (NEAR) в пределах 32-битного сегмента. Адрес перехода может задаваться непосредственно (в программе это метка) или косвенно, т.е. содержаться в ячейке памяти или регистре (JMP [EAX]).
Другой тип перехода - короткий переход (SHORT), занимает всего 2 байта. Диапазон смещения, в пределах которого происходит переход: -128 ... 127. Использование такого перехода весьма ограниченно.
Межсегментный переход может иметь следующий вид: JMP FWORD PTR L, L - указатель на структуру, содержащую 48-битный адрес, в начале которого 32-й адрес смещения, затем 16-й селектор (сегмента, шлюза вызова, сегмента состояния задачи). Возможен также и такой вид межсегментного перехода:
JMP FWORD ES:[EDI].
Условные переходы JA/JNBE - перейти, если выше.
JAE/JNB - перейти, если выше или равно.
JB/JNAE - перейти, если ниже.
JBE/JNA - перейти, если ниже.
JC - перейти, если перенос.
JE/JZ - перейти, если нуль.
JG/JNLE - перейти, если больше.
JGE/JNL - перейти, если больше или равно.
JL/JNGE - перейти, если меньше.
JLE/JNG - перейти, если меньше или равно.
JNC - перейтИ, если нет переноса.
JNE/JNZ - перейти, если меньше или равно.
JNO - перейти, если нет переполнения.
JNP/JPO - перейти, если нет паритета.
JNS - перейти, если нет знака.
JO - перейти, если есть переполнения.
JP/JPE - перейти, если есть паритет.
JS - перейти, если есть знак.
JCXZ - переход, если СХ=0.
JECXZ - переход, если ECX=0.
В плоской модели команды условного перехода осуществляют переход в пределах 32-битного регистра.
Команды управления циклом. Все команды этой группы уменьшают содержимое регистра ECX. LOOP - переход, если содержимое ECX не равно нулю.
LOOPE (LOOPZ) - переход, если содержимое ECX не равно нулю и флаг ZF=1.
LOOPNE (LOOPNZ) - переход, если содержимое ECX не равно нулю и флаг ZF=0.
CALL target Передает управление процедуре (метке) с сохранением в стеке адреса, следующей за CALL командой. В плоской модели адрес возврата представляет собой 32-битное смещение. Межсегментный вызов предполагает сохранение в стеке селектора и смещения, т.е. 48-битной величины (16 бит - селектор и 32 бита - смещение).
RET [N] Возврат из процедуры. Необязательный параметр N предполагает, что команда также автоматически чистит стек (освобождает N байт). Команда имеет разновидности, которые выбираются ассемблером автоматически, в зависимости от того, является процедура ближней или дальней. Можно, однако, и явно указать тип возврата (RETN или RETF). В случае плоской модели по умолчанию берется RETN с четырехбайтным адресом возврата.

Команды поддержки языков высокого уровня

ENTER par1,par2 Подготовка стека при входе в процедуру (см. главу 1.2.).
LEAVEПриведение стека в исходное состояние.
BOUND REG16,MEM16 или BOUND REG32,MEM32 Предполагается, что регистр содержит текущий индекс массива, а второй операнда определяет в памяти два слова или два двойных слова. Первое считается минимальным значением индекса, а второе - максимальным. Если текущий индекс оказывается вне границ, то генерируется команда INT 5. Используется для контроля нахождения индекса в заданных рамках, что является важным средством отладки.

Команды прерываний

INT n Двухбайтная команда. В начале в стек помещается содержимое регистра флагов, затем полный адрес возврата. Кроме того, сбрасывается флаг TF. После этого осуществляется косвенный переход через n-й элемент дескрипторной таблицы прерываний. Однобайтная команда INT 3 называется прерыванием контрольного останова и используется в программах-отладчиках.
INTO Равносильна команде INT 4, если флажок переполнения OF=1,
если OF=0 - команда не производит никакого действия.
IRETКоманда возврата из прерываний. Извлекает из стека сохраненные в нем адрес возврата и регистр флажков. Бит уровня привилегий будет модифицироваться только в том случае, если текущий уровень привилегий равен 0.

Команды синхронизации процессора

HLT Останавливает процессор. Из такого останова процессор может быть выведен внешним прерыванием.
LOCK Представляет собой префикс блокировки шины. Он заставляет процессор сформировать сигнал LOCK# на время выполнения находящейся за префиксом команды. Этот сигнал блокирует запросы шины другими процессорами в мультипроцессорной системе.
NOP Холостая команда. Не производит никаких действий.
WAIT (FWAIT) Синхронизация с сопроцессором. Большинство команд сопроцессора автоматически вырабатывают эту команду.

Команды обработки цепочки бит.

Эти команды появились в 386-м процессоре

BSF(BSR) dest,src dest - 16-битный или 32-битный регистр. src - регистр или ячейка памяти. При выполнении команды BSF операнд src просматривается с младших, а в команде BSR - со старших бит. Номер первого встречного бита, находящегося в состоянии 1, помещается в регистр dest, флажок ZF сбрасывается в 0. Если src содержит 0, то ZF=1, а содержимое dest не определено.
ВТ dest,src Тестирование бита с номером из src в dest и перенос его во флаг CF.
ВТС dest,srcПроверка и инвертирование бита из src в dest.
BTR dest,srcПроверка и сброс бита из src в dest.
BTS dest,srcПроверка и установка бита из src в dest.

Команды управления защитой

LGDT src Загрузка GDTR из памяти. Src указывает на 6-байтную величину.
SGDT destСохранить GDTR в памяти.
LIDT srcЗагрузить IDTR из памяти.
SIDT destСохранить IDTR в памяти.
LLDT srcЗагрузить LDTR из памяти (16 бит).
SLDT destСохранить LDTR в регистре или памяти (16 бит).
LMSW srcЗагрузка MSW.
SMSW destСохранить MSW в регистре или памяти (16 бит).
LTR srcЗагрузка регистра задачи из регистра или памяти (16 бит).
STR destСохранение регистра задачи в регистре или памяти (16 бит).
LAR dest,srcЗагрузка старшего байта dest байтом прав доступа дескриптора src.
LSL dest,srcЗагрузка dest лимитом сегмента, дескриптор которого задан src.
ARPL r/m,rВыравнивание RPL в селекторе до наибольшего числа из текущего уровня и заданного операндом.
VERR segВерификация чтения: установка ZF=1, если задаче позволено чтение в сегменте SEG.
VERW segВерификация чтения: установка ZF=1, если задаче позволена запись в сегменте SEG.

Команды обмена с управляющими регистрами

MOV CRn,srcЗагрузка управляющего регистра CRn.
MOV dest,CRnЧтение управляющего регистра CRn.
MOV DRn,srcЗагрузка регистра отладки DRn.
MOV dest,DRnЧтение регистра отладки DRn.
MOV TRn,srcЗагрузка регистра тестирования TRn.
MOV dest,TRnЧтение регистра тестирования TRn.
RDTSCЧтение счетчика тактов.

Команды идентификации и управления архитектурой

CPUID Получение информации о процессоре. Требует параметр в регистре EAX.
EAX=0, процессор в регистрах EBX,EDX,ECX возвращает символьную строку, специфичную для производителя. Процессоры AMD возвращают строку "AuthenticAMD", процессоры Intel - "Genuinelntel".
EAX=1, в младшем слове регистра EAX возвращает код идентификации.
EAX=2, в регистрах EAX, EBX, ECX, EDX возвращаются параметры конфигурации процессора.
RDMSR r/mЧтение модельно-специфического регистра в ECX.
WRMSR r/mЗапись ECX в модельно-специфический регистр.

Команды управления кэшированием

Внутренний кэш появился в процессоре, начиная с 486-ого. Процессоры 486 и Pentium имеют внутренний кэш первого уровня, Pentium Pro и Pentium II имеют уже и вторичный кэш.

INVDАннулирование данных в первичном КЭШе без обратной записи.
WBINVDОбратная запись модифицированных строк и аннулирование кэш-памяти.
INVLPG r/mАннулирование элемента таблицы трансляции TLB (TLB - буфер ассоциативной трансляции таблиц каталогов и страниц памяти).

Команды арифметического сопроцессора.

Описание работы арифметического сопроцессора см. [1,5]. Здесь мы коснемся основных положений работы арифметического сопроцессора.60

1. Арифметический сопроцессор работает со своим набором команд и своим набором регистров. Однако выборку команд сопроцессора осуществляет процессор.

2. Арифметический сопроцессор выполняет операции со следующими типами данных: целое слово (16 бит), короткое целое (32 бита), длинное слово (64 бита), упакованное десятичное число (80 бит), короткое вещественное число (32 бита), длинное вещественное число (64 бита), расширенное вещественное число (80 бит).

3. При выполнении операции сопроцессором, процессор ждет завершения этой операции. Другими словами, перед каждой командой сопроцессора ассемблером автоматически генерируется команда, проверяющая, занят сопроцессор или нет. Если сопроцессор занят, процессор переводится в состояние ожидания. Иногда программисту требуется вручную ставить команду ожидания (WAIT) после команды сопроцессора.

4. Сопроцессор имеет восемь 80-битных рабочих регистров, представляющих собой стековую кольцевую структуру. Регистры называются R0,R1, ... R7, но доступ к ним напрямую невозможен. Каждый регистр может занимать любое положение в стеке. Название стековых (относительных) регистров - ST(0), ST(1), ST(2), ST(3), ST(4), ST(5), ST(6), ST(7). Кроме того, имеется еще регистр состояния, по флагам которого можно, в частности, судить о результате выполненной операции. Регистр управления содержит в себе биты, влияющие на выполнение команд сопроцессора.

5. Регистр тэгов содержит 16 бит, описывающих содержание регистров сопроцессора: по два бита на каждый рабочий регистр. Тэг говорит о содержимом регистре данных. Вот значение тэгов: 00 - действительное ненулевое число, 01 - истинный нуль, 10 - специальные числа, 11 - отсутствие данных.

6. При вычислении с помощью команд сопроцессора большую роль играют исключения или особые ситуации. Типичной особой ситуацией является деление на 0. Биты особых ситуаций хранятся в регистре состояний. Учет особых ситуаций необходим для получения правильных результатов.

7. Список особых ситуаций.

    Неточный результат (округление). Недействительная операция. Деление на ноль. Антипереполнение (слишком маленький результат). Переполнение (слишком большой результат). Денормализованный операнд.

8. Регистр состояния. 0-й бит, флаг недопустимой операции. 1-й бит, флаг денормализованной операции. 2-й бит, флаг деления на ноль. 3-й бит, флаг переполнения. 4-й бит, флаг антипереполнения. 5-й бит, флаг неточного результата. 6-й бит, ошибка стека. 7-й бит, общий флаг ошибки. 8,9,10-й, флаги условий. 11,12,13-й, число, показывающее, какой регистр является вершиной. 14-й бит, условный флаг. 15-й бит, флаг занятости.

9. Регистр управления. 0-й бит, маска недействительной операции. 1-й бит, маска денормализованного операнда. 2-й бит, маска деления на ноль. 3-й бит, маска переполнения. 4-й бит, маска антипереполнения. 5-й бит, маска неточного результата. 6,7-й бит, резерв. 8-9-й биты, управление точностью. 10,11-й биты, управление округлением. 12-й, управление бесконечностью. 13,14,15-й, резерв.

Команды передачи данных

FLD src Загрузить вещественное число в ST(0) (вершину стека) из области памяти. Область памяти может быть 32-, 64-, 80-битная.
FILD src Загрузить целое число в ST(0) из памяти. Область памяти может быть 16-, 32-, 64-битной.
FBLD src Загрузить BCD-число в ST(0) из 80-битной области памяти.
FLDZ Загрузить 0 в ST(0).
FLD1 Загрузить 0 в ST(0).
FLDPI Загрузить PI в ST(0).
FLDL2T Загрузить LOG2(10) в ST(0).
FLDTL2E Загрузить LOG2(e) в ST(0).
FLDLG2 Загрузить LG(2) в ST(0).
FLDLN2 Загрузить LN(2) в ST(0).
FST dest Запись вещественного числа из ST(0) в память. Область памяти 32-, 64- или 80-битная.
FSTP dest Запись вещественного числа из ST(0) в память. Область памяти 32-, 64- или 80-битная. При этом происходит выталкивание вершины из стека.
FBST dest Запись BCD-числа в память. Область памяти 80-битная.
FBSTP dest Запись BCD-числа в память. Область памяти 80-битная. При этом происходит выталкивание вершины из стека.
FXCH st(i) Обмен значениями вершины стека и регистра i.

Команды сравнения данных

FCOM Сравнение вещественных чисел ST(0) и ST(1). Флаги устанавливаются, как при операции ST(0)-ST(1).
FCOM src Сравнение ST(0) с операндом в памяти. Операнд может быть 32- или 64-битным.
FCOMP src Сравнение вещественного числа в ST(0) с операндом с выталкиванием ST(0) из стека. Операнд может быть регистром и областью памяти.
FCOMPP Сравнение ST(0) и ST(1) с двойным выталкиванием из стека.
FICOM src Сравнение целых чисел в ST(0) с операндом. Операнд может быть 16- или 32-битным.
FICOMP src Сравнение целых чисел в ST(0) с операндом. Операнд может быть 16- или 32-битной областью памяти или регистром. При выполнении операции происходит выталкивание ST(0) из стека.
FTST Проверка ST(0) на нуль.
FUCOM ST(i) Сравнение ST(0) с ST(i) без учета порядков.
FUCOMP ST(i) Сравнение ST(0) с ST(i) без учета порядков. При выполнении операции происходит выталкивание из стека.
FUCOMPP ST(i) Сравнение ST(0) с ST(i) без учета порядков. При выполнении операции происходит двойное выталкивание из стека.
FXAM Анализ содержимого вершины стека. Результат помещается в биты С3-С0.
000 - неподдерживаемый формат.
001 - не число.
010 - нормализованное число.
011 - бесконечность.
100 - нуль.
101 - пустой операнд.
110 - денормализованное число.

Арифметические команды

FADD src
FADD ST(i),ST
Сложение вещественных чисел. ST(0)<-ST(0)+src, src - 32- или 64-битное число ST(i)<-ST(i)+ST(0)
FADDP ST(i),ST Сложение вещественных чисел, ST(i)<-ST(i)+ST(0). При выполнении операции происходит выталкивание стека.
FIADD src Сложение целых чисел. ST(0)<-ST(0)+src, src - 16- или 32-битное число.
FSUB src
FSUB ST(i),ST
Вычитание вещественных чисел. ST(0)<-ST(0)-src, src - 32- или 64-битное число. ST(i)<-ST(i)-ST(0).
FSUBP ST(i),ST Вычитание вещественных чисел, ST(i)<-ST(i)-ST(0). При выполнении операции происходит выталкивание стека.
FSUBR ST(i),ST Обратное вычитание вещественных чисел. ST(0)<-ST(i)-ST(0)
FSUBRP ST(i),ST Обратное вычитание вещественных чисел. ST(0)<-ST(i)-ST(0). При выполнении операции происходит выталкивание стека.
FISUB src Вычитание целых чисел. ST(0)<-ST(0)-src, src - 16- или 32-битное число.
FISUBR src Вычитание целых чисел. ST(0)<-ST(0)-src, src - 16- или 32-битное число. При выполнении операции происходит выталкивание из стека.
FMUL
FMUL ST(i)
FMUL ST(i),ST
Умножение двух операндов.
В первом случае ST(0)<-ST(0)*ST(1).
Во втором случае ST(0)<-ST(i)*ST(0).
В третьем случае ST(i)<-ST(i)*ST(0).
FMULP ST(i),ST(0) ST(i)<-ST(i)*ST(0) умножение и выталкивание из стека.
FIMUL src Умножение ST(0) на целое число. ST(0)<-ST(0)*src. Операнд может быть 16- и 32-битным числом.
FDIV
FDIV ST(i)
FDIV ST(i),SY
ST(0)<-ST(0)/ST(1)
ST(0)<-ST(0)/ST(i)
ST(i)<-ST(0)/ST(i)
FDIVP ST(i),ST Деление с выталкиванием из стека. ST(i)<-ST(0)/ST(i).
FIDIV src Деление целых чисел. ST(0)<-ST(i)/src. Делитель может быть 16- и 32-битным числом.
FDIVR ST(i),ST Обратное деление вещественных чисел. ST(0)<-ST(i)/ST(0)
FDIVRP ST(i),ST Обратное деление вещественных чисел и выталкивание из стека. ST(0)<-ST(i)/ST(0)
FIDIVR src Обратное деление целых чисел. ST(0)<-src/ST(0).
FSQRT Извлечь корень из ST(0) и поместить обратно.
FSCALE Масштабирование. ST(0)<-ST(0)*2^ST(1)
FEXTRACT Выделение мантиссы и порядка из числа ST(0). В ST(0) помещается порядок, в ST(1) - мантисса.
FPREM Нахождение остатка от деления. ST(0)<-ST(0)MODST(1).
FPREM1 Нахождение остатка от деления в стандарте IEEE.
FRNDINT Округление до ближайшего целого числа, находящегося в ST(0). ST(0)<-int(ST(0))
FABS Нахождение абсолютного значения. ST(0)<-ABS(ST(0))
FCSH Изменение знака ST(0)<- -ST(0)

Трансцендентные функции

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. Происходит выталкивание из стека, и только потом в вершину стека помещается результат вычисления.

Команды управления сопроцессором

FINIT Инициализация сопроцессора.
FSTSW АХ Запись слова состояния в АХ.
FSTSW dest Запись слова состояния в dest.
FLDCW src Загрузка управляющего слова (16 бит) из dest.
FSTCW dest Сохранение управляющего слова в dest.
FCLEX Сброс исключений.
FSTENV dest Сохранение состояния оборудования (SR, CR, TAGW, FIP, FDP) в памяти.
FLDENV src Загрузка состояния оборудования из памяти.
FSAVE dest Сохранение состояния оборудования и файла регистров в памяти.
FRSTOR src Загрузка состояния оборудования и файла регистров в памяти.
FINCSTP Инкремент указателя стека.
FDECSTP Декремент указателя стека.
FFREE ST(i) Освобождение регистра - пометка ST(i) как свободного.
FNOP Холостая операция сопроцессора.
WAIT (FWAIT) Ожидание процессором завершение текущей операции сопроцессором.

Расширение MMX.

Расширение MMX ориентировано в основном на использование в мультимедийных приложениях. Основная идея MMX заключается в одновременной обработке нескольких элементов данных за одну инструкцию. Расширение MMX появилось в процессорах модификации Pentium P54C и присутствует во всех последних модификациях этого процессора.

Расширение MMX использует новые типы упакованных данных: упакованные байты (восемь байт), упакованные слова (четыре слова), упакованные двойные слова (два двойных слова), учетверенное слово. Расширение MMX включает восемь регистров общего пользования (MM0-MM7). Размер регистров составляет 64 бита. Физически эти регистры пользуются младшими битами рабочих регистров сопроцессора. Команды MMX "портят" регистр состояния и регистр тэгов. По этой причине совместное использование команд MMX и команд сопроцессора может вызвать определенные трудности. Другими словами, перед каждым использованием команд MMX Вам придется сохранять контекст сопроцессора, а это может весьма замедлить работу программы. Важно отметить также, что команды MMX работают непосредственно с регистрами сопроцессора, а не с указателями на элементы стека.

Команды MMX расширения (по книге [3])

EMMS Очистка стека регистров. Установка всех единиц в слове тегов.
MOVD mm,m32/ir32 Пересылка данных в младшие 32 бита регистра MMX с заполнением старших бит нулями.
MOVD m32/ir32,mm Пересылка данных из младших 32 бит регистра MMX.
MOVQ mm,mm/m64 Пересылка данных в регистр MMX.
MOVQ mm/m64,mm Пересылка данных из регистра MMX.
PACKSSDW mm,mm/m64 Упаковка со знаковым насыщением двух двойных слов, расположенных в mm, и двух двойных слов mm/m64 в четыре слова, расположенных в mm.
PACKSSWB mm,mm/m64 Упаковка со знаковым насыщением четырех слов, расположенных в mm, и четырех слов mm/m64 в восемь байт, расположенных в mm.
PACKUSWB mm,mm/m64 Упаковка с насыщением четырех знаковых слов, расположенных в mm, и четырех слов mm/m64 в восемь беззнаковых байт, расположенных в mm.
PADDB mm,mm/m64
PADDW mm,mm/m64
PADDD mm,mm/m64
Сложение упакованных байт (слов или двойных слов) без насыщения (с циклическим переполнением).
PADDSB mm,mm/m64
PADDSW mm,mm/m64
Сложение упакованных байт (слов) со знаковым насыщением.
PADDUSB mm,mm/m64
PADDUSW mm,mm/m64
Сложение упакованных байт (слов) с беззнаковым насыщением.
PAND mm,mm/m64 Логическое "И".
PANDN mm,mm/m64 Логическое "И-НЕ".
PCMPEQB mm,mm/m64
PCMPEQD mm,mm/m64
PCMPEQW mm,mm/m64
Сравнение (на равенство) упакованных байт (слов, двойных слов). Все биты элемента результата будут единичными (true) при совпадении соответствующих элементов операндов и нулевыми (false) - при несовпадении.
PCMPGTB mm,mm/m64
PCMPGTD mm,mm/m64
PCMPGTW mm,mm/m64
Сравнение (по величине) упакованных знаковых байт (слов, двойных слов). Все биты элемента результата будут единичными (true), если соответствующий элемент операнда назначения больше элемента операнда источника, и нулевыми (false) в противном случае.
PMADDWD mm,mm/m64 Умножение четырех знаковых слов операнда источника на четыре знаковых слова операнда назначения. Два двойных слова результатов умножения младших слов суммируются и записываются в младшее двойное слово операнда назначения. Два двойных слова результатов умножения старших слов суммируются и записываются в старшее двойное слово операнда назначения.
PMULHW mm,mm/m64 Умножение упакованных знаковых слов с сохранением только старших 16 бит элементов результата.
PMULLW mm,mm/m64 Умножение упакованных знаковых или беззнаковых слов с сохранением только младших 16 бит результата.
POR mm,mm/m64 Логическое "ИЛИ".
PSHIMD mm,imm
PSHIMQ mm,imm
PSHIMW mm,imm
PSHIMD представляет инструкции PSLLD, PSRAD и PSRLD с непосредственным операндом-счетчиком.
PSHIMW представляет инструкции PSLLW, PSRAW, PSRLW.
PSHIMQ представляет инструкции PSLLQ и PSRLQ с непосредственным операндом-счетчиком.
PSLLD mm,mm/m64
PSLLQ mm,mm/m64
PSLLW mm,mm/m64
Логический сдвиг влево упакованных слов (двойных, учетверенных) операнда назначения на количество бит, указанных в операнде-источнике, с заполнением младших бит нулями.
PSRAD mm,mm/m64
PSRAW mm,mm/m64
Арифметический сдвиг вправо упакованных двойных (учетверенных) знаковых слов операнда назначения на количество бит, указанных в операнде-источнике, с заполнением младших бит битами знаковых разрядов.
PSRLD mm,mm/m64
PSRLQ mm,mm/m64
PSRLW mm,mm/m64
Логический сдвиг вправо упакованных слов (двойных, учетверенных) операнда назначения на количество бит, указанных в операнде-источнике, с заполнением старших бит нулями.
PSUBB mm,mm/m64
PSUBW mm,mm/m64
PSUBD mm,mm/m64
Вычитание упакованных байт (слов или двойных слов) без насыщения (с циклическим антипереполнением).
PSUBSB mm,mm/m64
PSUBSW mm,mm/m64
Вычитание упакованных знаковых байт (слов) с насыщением.
PSUBUSB mm,mm/m64
PSUBUSW mm,mm/m64
Вычитание упакованных беззнаковых байт (слов) с насыщением.
PUNPCKHBW mm,mm/m64 Чередование в регистре назначения байт старшей половины операнда-источника с байтами старшей половины операнда назначения.
PUNPCKHWD mm,mm/m64 Чередование в регистре назначения слов старшей половины операнда-источника со словами старшей половины операнда назначения.
PUNPCKHDQ mm,mm/m64 Чередование в регистре назначения двойного слова старшей половины операнда-источника с двойным словом старшей половины операнда назначения.
PUNPCKLBW mm,mm/m64 Чередование в регистре назначения байт младшей половины операнда-источника с байтами младшей половины операнда назначения.
PUNPCKLWD mm,mm/m64 Чередование в регистре назначения слов младшей половины операнда-источника со словами младшей половины операнда назначения.
PUNPCKLDQ mm,mm/m64 Чередование в регистре назначения двойного слова младшей половины операнда-источника с двойным словом младшей половины операнда назначения.
PXOR mm,mm/m64 Исключающее "ИЛИ".

60 Мы пользуемся несколько устаревшим названием. Правильнее было бы это назвать числовым процессором.










Приложение 3. Защищенный режим микропроцессора Pentium

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

В отличие от реального режима, сегментные регистры содержат в защищенном режиме не адреса, а селекторы. Рассмотрим структуру селектора: 0-1-й биты, запрошенный программой уровень привилегий; 2-й бит, определяет, использовать глобальную таблицу дескрипторов GDT (0) или локальную таблицу дескрипторов LDT (1); 3-16-й биты, индекс дескриптора в таблице. Дескриптор для защищенного режима - это 64-битная структура, которая может описывать сегмент кода, сегмент данных, сегмент состояния задачи, шлюз вызова, ловушки, прерывания или задачи. Дескриптор в глобальной дескрипторной таблице может описывать локальную дескрипторную таблицу.

Дескриптор кода и данных

Биты 24-31
базы сегмента
Биты
доступа
Базовый адрес
24 бита
Предел
16 бит

Базовый адрес сегмента содержит физический адрес сегмента.

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

Описание других битов.

6-й байт. Биты 0-3 определяют биты 16-19 предела. Бит 4 зарезервирован для операционной системы. Бит 5 равен 0. Бит 6 - разрядность: 0 - 16-битный, 1 - 32-битный. Бит 7 - гранулярность: 0 - лимит в байтах, 1 - лимит в 4-килобайтных величинах.

5-й байт. Бит 0, если 1, то к сегменту было обращение. Бит 1 - разрешение чтения для кода, записи для данных. Бит 2 - бит подчиненности для кода, бит расширения для данных. Бит 3 - тип сегмента (0 - данные, 1 - код). Бит 4 - тип дескриптора (1 - не системный). Биты 5-6 - уровень привилегий дескриптора. Бит 7 - бит присутствия сегмента.

Другие дескрипторы

Если в дескрипторе бит 4 (байт 5) равен 0, то дескриптор называется системным. В этом случае биты 0-3 определяют один из возможных типов дескрипторов. 0 - зарезервированный тип. 1 - свободный 16-битный TSS (TSS - сегмент состояния задачи). 2 - дескриптор таблицы LDT. 3 - занятый 16-битный TSS. 4 - 16-битный шлюз вызова. 5 - шлюз задачи. 6 - 16-битный шлюз прерывания. 7 - 16-битный шлюз ловушки. 8 - зарезервировано. 9 - свободный 32-битный TSS. 10 - зарезервировано. 11 - занятый 32-битный TSS. 12 - 32-битный шлюз вызова. 13 - зарезервировано. 14 - 32-битный шлюз прерывания. 15 - 32-битный шлюз ловушки.

Команды CALL или JMP на адрес с селектором, указывающим на дескриптор шлюза, приводит к передаче управления по адресу, указанному в дескрипторе. Если селектор указывает на шлюз задачи, то это приводит к переключению задач. Обычные же переходы JMP, CALL, RET, IRET возможны лишь к сегментам с тем же уровнем привилегий, либо более низким уровнем привилегий.

Переключение задач

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

Четырехуровневая система привилегий

Уровни привилегий нумеруются от 0 до 3. Номер 3 является самым низким уровнем привилегий. Нулевой привилегией обладает ядро операционной системы. Уровни привилегий относятся к дескрипторам, селекторам и задачам. В регистре флагов имеется поле привилегий ввода-вывода, которое регулирует управление доступом к инструкциям ввода-вывода. Уровень привилегий задачи определяется двумя младшими битами сегмента CS. При страничной адресации имеется всего два уровня доступа - 3 и 0.

Страничное управление памятью

Механизм со страничным управлением памятью включается установкой бита 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 Мб - при разрешенной расширенной физической адресации).