ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
Часть 1 О Г Л А В Л Е Н И Е ВВЕДЕНИЕ.................................................. 26 1. АРХИТЕКТУРА ЦЕНТРАЛЬНОГО ПРОЦЕССОРА ПЭВМ............... 27 2. СИСТЕМА КОМАНД ЦЕНТРАЛЬНОГО ПРОЦЕССОРА................. 39 2.1 Команды пересылки данных........................... 42 2.1.1 IN Ввод байта или слова................. 42 2.1.2 LAHF Загрузка AH из регистра флагов....... 42 2.1.3 LDS Загрузка указателя с использо- ванием DS............................ 43 2.1.4 LEA Загрузка исполнительного адреса...... 44 2.1.5 LES Загрузка указателя с использо- ванием ES............................ 45 2.1.6 MOV Пересылка (байта или слова).......... 45 2.1.7 OUT Загрузка в порт...................... 46 2.1.8 POP Выборка слова из стека............... 47 2.1.9 POPF Пересылка слова из стека в регистр FLAGS...................... 47 2.1.10 PUSH Загрузка слова в стек................ 48 2.1.11 PUSHF Загрузка содержимого регистра FLAGS в стек......................... 49 2.1.12 SAHF Загрузка регистра AH в регистр флагов............................... 49 2.1.13 XCHG Обмен значениями..................... 50 2.1.14 XLAT Кодирование AL по таблице............ 50 2.2 Арифметические операции............................ 51 2.2.1 AAA ASCII-коррекция при сложении......... 51 2.2.2 AAD ASCII-коррекция при делении.......... 52 2.2.3 AAM ASCII-коррекция при умножении........ 53 2.2.4 AAS ASCII-коррекция при вычитании........ 54 2.2.5 ADC Сложение с переносом................. 55 2.2.6 ADD Сложение............................. 56 2.2.7 CBW Преобразование байта в слово......... 56 2.2.8 CMP Сравнение............................ 57 2.2.9 CWD Преобразование слова в двойное слово................................ 58 2.2.10 DAA Десятичная коррекция при сложении.... 59 2.2.11 DAS десятичная коррекция при вычитании... 59 2.2.12 DEC Декремент............................ 60 2.2.13 DIV Деление без учета знака.............. 61 - 4 - 2.2.14 IDIV Деление с учетом знака............... 62 2.2.15 IMUL Умножение с учетом знака............. 63 2.2.16 INC Инкремент............................ 64 2.2.17 MUL Умножение без учета знака............ 65 2.2.18 NEG Получение дополнительного кода....... 65 2.2.19 SBB Вычитание с заемом................... 66 2.2.20 SUB Вычитание............................ 67 2.3 Логические операции................................ 68 2.3.1 AND Логическое умножение................. 68 2.3.2 NOT Логическое отрицание................. 69 2.3.3 OR Логическое сложение.................. 70 2.3.4 RCL Циклический сдвиг влево через CF..... 71 2.3.5 RCR Циклический сдвиг вправо через CF.... 72 2.3.6 ROL Циклический сдвиг влево.............. 73 2.3.7 ROR Циклический сдвиг вправо............. 74 2.3.8 SAL Арифметический сдвиг влево........... 75 2.3.9 SAR Арифметический сдвиг вправо.......... 77 2.3.10 SHL Логический сдвиг влево............... 78 2.3.11 SHR Логический сдвиг вправо.............. 79 2.3.12 TEST Тест................................. 80 2.3.13 XOR Исключающее ИЛИ...................... 81 2.4 Обработка блоков данных............................ 82 2.4.1 CMPS Сравнение строк...................... 82 2.4.2 CMPSB Сравнение строк из байтов............ 84 2.4.3 CMPSW Сравнение строк из слов.............. 85 2.4.4 LODS Загрузка строки...................... 87 2.4.5 LODSB Загрузка строки из байтов............ 88 2.4.6 LODSW Загрузка строки из слов.............. 89 2.4.7 MOVS Пересылка строки..................... 90 2.4.8 MOVSB Пересылка строки из байтов........... 92 2.4.9 MOVSW Пересылка строки из слов............. 93 2.4.10 REP Повтор............................... 94 2.4.11 REPE Повторять пока равно................. 95 2.4.12 REPNE Повторять пока не равно.............. 96 2.4.13 REPNZ Повторять пока не ноль............... 97 2.4.14 SCAS Просмотр строки...................... 98 2.4.15 SCASB Просмотр строки из байтов............ 99 - 5 - 2.4.16 SCASW Просмотр строки из слов..............101 2.4.17 STOS Запись в строку......................102 2.4.18 STOSB Запись в строку из байтов............104 2.4.19 STOSW Запись в строку из слов..............104 2.5 Команды передачи управления........................105 2.5.1 CALL Вызов подпрограммы...................105 2.5.2 JMP Безусловный переход..................107 2.5.3 RET Возврат из подпрограммы..............108 2.6 Команды условного перехода.........................109 2.6.1 JA Переход если выше...................109 2.6.2 JAE Переход если выше или равно.........109 2.6.3 JB Переход если ниже...................110 2.6.4 JBE Переход если ниже или равно.........111 2.6.5 JC Переход если перенос................111 2.6.6 JCXZ Переход если CX = 0.................112 2.6.7 JE Переход если равно..................113 2.6.8 JG Переход если больше.................113 2.6.9 JGE Переход если больше или равно.......114 2.6.10 JL Переход если меньше.................115 2.6.11 JLE Переход если меньше или равно.......115 2.6.12 JNA Переход если не выше................116 2.6.13 JNAE Переход если не выше и не равно.....116 2.6.14 JNB Переход если не ниже................116 2.6.15 JNBE Переход если не ниже и не равно.....117 2.6.16 JNC Переход если нет переноса...........117 2.6.17 JNE Переход если не равно...............117 2.6.18 JNG Переход если не больше..............118 2.6.19 JNGE Переход если не больше и не равно...118 2.6.20 JNL Переход если не меньше..............118 2.6.21 JNLE Переход если не меньше и не равно...119 2.6.22 JNO Переход если нет переполнения.......119 2.6.23 JNP Переход если нечетно................119 2.6.24 JNS Переход если положительный результат...........................120 2.6.25 JNZ Переход если не ноль................120 2.6.26 JO Переход если есть переполнение......121 2.6.27 JP Переход если четно..................121 - 6 - 2.6.28 JPE Переход если четно..................122 2.6.29 JPO Переход если нечетно................122 2.6.30 JS Переход если отрицательный результат...........................122 2.6.31 JZ Переход если ноль...................123 2.6.32 LOOP Переход по счетчику.................123 2.6.33 LOOPE Переход пока равно..................124 2.6.34 LOOPNE Переход пока не равно...............124 2.6.35 LOOPNZ Переход пока не ноль................125 2.6.36 LOOPZ Переход пока ноль...................125 2.7 Команды прерывания.................................125 2.7.1 INT Прерывание..........................125 2.7.2 INTO Прерывание по переполнению..........126 2.7.3 IRET Возврат после обработки прерывания..........................127 2.8 Управление состоянием процессора...................128 2.7.1 CLC Сброс признака переноса.............128 2.7.2 CLD Сброс признака направления..........128 2.7.3 CLI Сброс признака разрешения прерывания..........................129 2.7.4 CMC Инвертирование признака переноса....129 2.7.5 ESC Выборка кода операции и операнда....130 2.7.6 HLT Останов.............................131 2.7.7 LOCK Блокирование шины BUS...............131 2.7.8 NOP Нет операции........................132 2.7.9 STC Установка признака переноса.........132 2.7.10 STD Установка признака направления......133 2.7.11 STI Установка признака разрешения прерывания..........................133 2.7.12 WAIT Ожидание............................134 3. ПРОГРАММИРОВАНИЕ НА АССЕМБЛЕРЕ.........................135 3.1 Общие сведения.....................................135 3.2 Арифметические операторы...........................139 3.2.1 + Сложение или унарный плюс...........139 3.2.2 - Вычитание или унарный минус.........139 3.2.3 * Умножение...........................140 3.2.4 / Деление.............................140 - 7 - 3.2.5 MOD Деление по модулю...................140 3.3 . Оператор доступа к полю структуры.........141 3.4 [] Оператор индексации.......................141 3.5 Операторы сдвига...................................142 3.5.1 SHL Сдвиг влево.........................142 3.5.2 SHR Сдвиг вправо........................142 3.6 Побитовые логические операции......................142 3.6.1 NOT Побитовое отрицание.................142 3.6.2 AND Побитное логическое "И"...........143 3.6.3 OR Побитовая логическая операция "ИЛИ"...............................143 3.6.4 XOR Побитовое логическое "исключающее ИЛИ"...................143 3.7 Операторы отношений................................144 3.7.1 EQ Оператор отношения "равно"..........144 3.7.2 NE Операция отношения "не равно".......144 3.7.3 LT Операция отношения "меньше чем".....145 3.7.4 GT Оператор отношения "больше".........145 3.7.5 LE Оператор отношения "меньше или равно"..................145 3.7.6 GE Оператор отношения "больше или равно"..................146 3.8 Оператор явного задания сегмента...................146 3.9 Операторы типа.....................................147 3.9.1 PTR Изменение типа переменной...........147 3.9.2 SHORT Метка...............................148 3.9.3 THIS Создание операнда по текущей позиции.............................148 3.9.4. HIGH Возврат старших 8 бит...............149 3.9.5 LOW Получение восьми младших битов......149 3.9.6 SEG Выдача значения сегмента............149 3.9.7 OFFSET Смещение выражения..................150 3.9.8 .TYPE Выдача режима и контекста для выражения.......................150 3.9.9 TYPE Получение размера типа..............151 3.9.10 LENGTH Возврат длины переменной............151 - 8 - 3.9.11 SIZE Выдача количества байт, используемых под переменную.........152 3.10 Использование специальных операторов макрокоманд.........................152 3.10.1 & Оператор подстановки................152 3.10.2 <> Оператор буквального прочтения текста..............................153 3.10.3 ! Оператор буквальной интерпретации символа.............................153 3.10.4 % Оператор преобразования в выражение...........................154 3.10.5 ;; Макрокомментарий....................154 3.11 Размещение сегментов, имеющих одинаковые имена в области памяти.Комбинирование сегментов...........155 3.11.1 PUBLIC Соединение одноименных сегментов....155 3.11.2 STACK Определение стекового сегмента......155 3.11.3 COMMON Определение совмещаемых сегментов...156 3.11.4 MEMORY Размещает сегмент как последний возможный.................156 3.11.5 AT Определение абсолютного сегмента....157 3.12 Управление размещением сегментов в области памяти. Типы размещения..........................157 3.12.1 BYTE Располагает сегмент по адресу некоторого байта....................157 3.12.2 WORD Выравнивание на 2-байтовую границу.............................158 3.12.3 PARA Выравнивание на 16-байтовую границу.............................158 3.12.4 PAGE Выравнивание на 256-байтовую границу.............................158 3.13 Привязка сегментов к сегментным регистрам.........159 3.14 Определение меток и переменных....................159 3.14.1 Спецификация типов данных...................159 3.14.1.1 BYTE Тип данных для 1 байта....159 3.14.1.2 WORD Тип данных в 2 байта......160 3.14.1.3 DWORD Тип данных для 4 байтов...160 3.14.1.4 QWORD Тип данных в 8 байт.......161 - 9 - 3.14.1.5 TBYTE Тип данных в 10 байтов....161 3.14.2 Спецификация типов меток....................162 3.14.2.1 FAR Тип данных для метки из другого сегмента..........162 3.14.2.2 NEAR Тип данных в том же сегменте..................162 3.14.3 $ Операнд счетчика размещения.............163 3.14.4 Массивы и буферы. Оператор DUP.........163 3.15 Специальные операторы для работы с записями.......164 3.15.1 MASK Получение битовой маски...........164 3.15.2 WIDTH Получение ширины в битах.........164 4. ДИРЕКТИВЫ АССЕМБЛЕРА...................................165 4.1 .186 Разрешает команды процессора 80186......165 4.2 .286c Разрешает команды реального режима процессора 80286........................165 4.3 .286p Разрешает команды защищенного режима процессора 80286........................167 4.4 .287 Разрешает команды процессора 80287.....167 4.5 .8086 Разрешает команды процессора 8086......167 4.6 .8087 Разрешает команды процессора 8087......168 4.7 = Создание абсолютного символа............169 4.8 COMMENT Ввод комментария в несколько строк......169 4.9 .CREF Разрешает листинг перекрестных ссылок...170 4.10 DB Описание байта..........................170 4.11 DD Описание двойного слова.................171 4.12 DQ Описание учетверенного слова............172 4.13 DT Описание 10-байтной единицы.............172 4.14 DW Описание слова..........................173 4.15 ELSE Ассемблирование, если условие не выполнено............................174 4.16 END Конец модуля............................175 4.17 ENDIF Конец условного блока...................175 4.18 ENDIF Конец условного блока...................175 4.19 ENDM Конец макроопределения или повторного блока........................176 4.20 ENDP Конец описания процедуры................176 4.21 ENDS Конец описания сегмента или - 10 - структуры...............................177 4.22 EQU Создание символа........................177 4.23 .ERR Симуляция ошибки........................178 4.24 .ERR1 Симуляция ошибки при первом проходе.................................178 4.25 .ERR2 Симуляция ошибки при втором проходе.................................179 4.26 .ERRB Ошибка, если строка пустая..............179 4.27 .ERRDEF Ошибка, если имя определено.............180 4.28 .ERRDIF Ошибка, если строки различаются.........180 4.29 .ERRE Ошибка, если ложь.......................181 4.30 .ERRIDN Ошибка, если строки идентичны...........181 4.31 .ERRNB Ошибка, если строка не пустая...........182 4.32 .ERRNDEF Ошибка, если имя не определено..........182 4.33 .ERRNZ Ошибка, если истина.....................182 4.34 EVEN Располагает на границе слова............183 4.35 EXITM Немедленный выход из макро..............183 4.36 EXTRN Описание внешнего имени.................184 4.37 GROUP Описание группы сегментов...............184 4.38 IF Начало условного блока..................185 4.39 IF1 Ассемблирование, если первый проход.....186 4.40 IF2 Ассемблирование, если второй проход.....186 4.41 IFB Ассемблирование, если аргумент пустой...187 4.42 IFDEF Ассемблирование, если имя определено....187 4.43 IFDIF Ассемблирование, если аргументы различны................................188 4.44 IFE Ассемблирование, если ложь..............188 4.45 IFIDN Ассемблирование, если аргументы совпадают...............................189 4.46 IFNB Ассемблирование, если аргумент не пуст..189 4.47 IFNDEF Ассемблирование, если имя не определено...........................190 4.48 INCLUDE Включение кодов из внешнего файла.......190 4.49 IRP Ассемблирование по 1 разу для каждого параметра...................191 4.50 IRPC Ассемблирование по 1 разу для каждого символа.....................192 - 11 - 4.51 LABEL Создание переменной или метки...........192 4.52 .LALL Распечатка всех макрорасширений.........193 4.53 .LFCOND Выдача блоков с отрицательными условиями...............................193 4.54 .LIST Разрешение выдачи исходных кодов........193 4.55 LOCAL Объявление символа для использования в макросе...............................194 4.56 MACRO Начало описания макрокоманды............195 4.57 NAME Задание имени модуля....................195 4.58 ORG Задание счетчика размещения в памяти....196 4.59 %OUT Выдача текста при ассемблировании.......196 4.60 PAGE Постраничное управление листингом.......196 4.61 PROC Начало описания процедуры...............197 4.62 PUBLIC Объявление символа доступным для всех модулей............................198 4.63 PURGE Удаление описания макроса...............198 4.64 .RADIX Установка системы счисления для ввода...199 4.65 RECORD Описание типа записи....................200 4.66 REPT Начало повторяемого блока...............201 4.67 .SALL Подавление листинга всех макрорасширений.........................201 4.68 SEGMENT Начало описания сегмента................202 4.69 .SFCOND Подавление листинга ложных условий......202 4.70 STRUC Определение структурного типа...........203 4.71 SUBTTL Описание подзаголовка для листинга......204 4.72 .XALL Список макрорасширений, генерирующих коды.......................204 4.73 .XCREF Подавление формирования списка перекрестных ссылок.....................204 4.74 .XLIST Подавление списка исходных кодов........205 5. РАБОТА С АССЕМБЛЕРОМ В СРЕДЕ MS DOS....................206 5.1 Общие сведения.....................................206 5.1.1 Карта распределения памяти...................206 5.1.2 Загрузочные модули программ..................207 5.1.3 Загрузочный модуль типа .EXE.................207 5.1.4 Загрузочный модуль типа .COM.................209 5.1.5 Префикс программного сегмента PSP............211 - 12 - 5.1.6 Основные понятия об организации файловой системы......................................213 5.2 Прерывания ДОС....................................214 5.2.1 Прерывание INT 20h (32) - завершить прог- рамму........................................214 5.2.2 Прерывание INT 22h (34) - адрес завершения...215 5.2.3 Прерывание INT 23h (35) - адрес выхода при Ctrl+Break...................................215 5.2.4 Прерывание INT 24h (36) - адрес обработчи- ка критических ошибок........................216 5.2.5 Прерывание INT 25h/26h (37/38) - прямая дисковая операция чтения/записи..............218 5.2.6 Прерывание 27h (39) - завершить программу и оставить ее резидентной....................220 5.3 Функции ДОС.......................................221 5.3.1 Функция 00h (0) Завершение программы.........221 5.3.2 Функция 01h (1) Ввод символа с клавиатуры с эхом.......................................222 5.3.3 Функция 02h (2) Вывод символа на дисплей.....223 5.3.4 Функция 03h (3) Ввод символа через комму- никационный канал............................223 5.3.5 Функция 04h (4) Вывод символа через комму- никационной канал............................224 5.3.6 Функция 05h (5) Вывод символа на печать......225 5.3.7 Функция 06h (6) Обмен символами с термина- лом..........................................225 5.3.8 Функция 07h (7) Ввод символа с клавиатуры без эха и без проверки Ctrl-break............226 5.3.9 Функция 08h (8) Ввод символа с клавиатуры без эха с проверкой Ctrl-Break...............227 5.3.10 Функция 09h (9) Вывод строки символов на дисплей.....................................227 5.3.11 Функция 0Ah (10) Ввод строки символоов с клавиатуры с буферизацией...................228 5.3.12 Функция 0Bh (11) Проверка факта ввода с клавиатуры..................................229 - 13 - 5.3.13 Функция 0Ch (12) Очистка буфера вызов функции ввода с клавиатуры..................230 5.3.14 Функция 0Dh (13) Сброс диска, сохранение буферов файлов..............................230 5.3.15 Функция 0h (14) Назначение текущего дис- ковода......................................231 5.3.16 Функция 0Fh (15) Открытие файла (с ис- пользованием FCB)...........................231 5.3.17 Функция 10h (16) Закрытие файла (с ис- пользованием FCB)...........................234 5.3.18 Функция 11h (17) Поиск первого имени файла, удовлетворяющего шаблону(с исполь- зованием FCB)...............................234 5.3.19 Функция 12h (18) Продолжение поиска имен файлов, начатого функцией 11h (с исполь- зованием FCB)...............................235 5.3.20 Функция 13h (19) Удаление файлов с диска (с использованием FCB)......................236 5.3.21 Функция 14h (20) Последовательное чтение из файла (с использованием FCB).............236 5.3.22 Функция 15h (21) Последовательная запись в файл (с использованием FCB)...............237 5.3.23 Функция 16h (22) Создание и открытие фай- ла для чтения/записи (с использованием FCB)........................................238 5.3.24 Функция 17h (23) Переименование файла (с использованием FCB).........................239 5.3.25 Функция 19h (25) Определение текущего диска.......................................240 5.3.26 Функция 1Ah (26) Установка буфера переда- чи данных (DTA).............................240 5.3.28 Функция 1Ch (28) Получение данных об ука- занном дисководе............................242 5.3.29 Функция 21h (33) Чтение с диска с прямым доступом (с использованием FCB).............243 5.3.30 Функция 22h (34) Запись на диск с прямым доступом (с использованием FCB).............244 - 14 - 5.3.31 Функция 23h (35) Выдача длины файла (с использованием FCB).........................245 5.3.32 Функция 24h (36) Задание номера записи для прямого доступа (с использованием FCB)..246 5.3.33 Функция 25h (37) Установка вектора преры- вания.......................................246 5.3.34 Функция 26h (38) Создание программного сегмента....................................247 5.3.35 Функция 27h (39) Чтение блока с прямым доступом (с использованием FCB).............247 5.3.36 Функция 28h (40) Запись блока с прямым доступом (с использованием FCB).............249 5.3.37 Функция 29h (41) Преобразование имени файла во внутренние параметры блока FCB.....250 5.3.38 Функция 2Ah (42) Выдача текущей даты........252 5.3.39 Функция 2Bh (43) Установка системной даты...253 5.3.40 Функция 2Ch (44) Выдача текущего времени...253 5.3.41 Функция 2Dh (45) Установка системного времени.....................................254 5.3.42 Функция 2h (46) Установка/сброс переклю- чателя VERIFY...............................254 5.3.43 Функция 2Fh (47) Выдача адреса буфера об- ласти передачи данных DTA...................255 5.3.44 Функция 30h (48) Выдача номера версии ДОС...255 5.3.45 Функция 31h (49) Завершить программу и оставить ее резидентной в ОЗУ...............256 5.3.46 Функция 33h (51) Проверка или изменение статуса Ctrl-Break..........................257 5.3.47 Функция 35h (53) Выдача вектора прерыва- ния.........................................257 5.3.48 Функция 36h (54) Выдача размера свободно- го пространства на диске....................258 5.3.49 Функция 38h (56) Выдача форматов даты, времени, чисел, денежных единиц.............258 5.3.50 Функция 39h (57) Создание подкаталога (MKDIR).....................................262 - 15 - 5.3.51 Функция 3Ah (58) Удаление подкаталога (RMDIR).....................................263 5.3.52 Функция 3Bh (59) Смена текущего подката- лога (CHDIR)................................264 5.3.53 Функция 3Ch (60) Создание или открытие файла.......................................264 5.3.54 Функция 3Dh (61) Открытие существующего файла.......................................266 5.3.55 Функция 3h (62) Закрытие файла..............271 5.3.57 Функция 40h (64) Запись в файл или вывод на устройство...............................273 5.3.58 Функция 41h (65) Удаление файла из ука- занного каталога (UNLINK)...................274 5.3.59 Функция 42h (66) Установка текущей пози- ции (LSEEK).................................275 5.3.60 Функция 43h (67) Выдача или установка ат- рибутов файла (CHMOD).......................276 5.3.61 Функция 44h (68) Управление вводом/выво- дом на устройствах (IOCTL). Обзор...........278 5.3.61.1 Функция 4400h (68-0) IOCTL: Полу- чение информации об устройстве........280 5.3.61.2 Функция 4401h (68-1) IOCTL: Уста- новка информации для устройства.......281 5.3.61.3 Функция 4402h (68-2) IOCTL: Чтение из посимвольного устройства...........282 5.3.61.4 Функция 4403h (68-3) IOCTL: Запись в посимвольное устройство.............282 5.3.61.5 Функция 4404h (68-4) IOCTL: Чтение из блочного устройства................283 5.3.61.6 Функция 4405h (68-5) IOCTL: Запись в блочное устройство..................284 5.3.61.7 Функция 4406h (68-6) IOCTL: Полу- чение состояния ввода.................284 5.3.61.8 Функция 4407h (68-7) IOCTL: Полу- чение состояния вывода................285 - 16 - 5.3.61.9 Функция 4408h (68-8) IOCTL: Инфор- мация о сменяемости носителя (DOS 3.0)..................................285 5.3.61.10 Функция 4409h (68-9) IOCTL: Ин- формация об логического удаленности устройства............................286 5.3.61.11 Функция 440Ah (68-10) IOCTL: Ин- формация об удаленности устройства, заданного номером (DOS 3.1)...........287 5.3.61.12 Функция 440Bh (68-11) IOCTL: Ус- тановка числа повторов при совмест- ном использовании ресурсов(DOS 3.0)..................................287 5.3.61.13 Функция 440Dh (68-13) IOCTL: Об- щий запрос (DOS 3.2)..................288 5.3.61.14 Функция 440h (68-14) IOCTL: Полу- чение символа имени логического дисковода(DOS 3.2)...................288 5.3.61.15 Функция 440Fh (68-15) IOCTL: Ус- тановка символа логического диско- вода(DOS 3.2)........................289 5.3.62 Функция 45h (69) Дублирование дескриптора файла (DUP).................................290 5.3.63 Функция 46h (70) Производит удвоение дескриптора файла (FORCDUP).................291 5.3.64 Функция 47h (71) Получение текущего ката- лога........................................292 5.3.65 Функция 48h (72) Выделение памяти..........293 5.3.66 Функция 49h (73) Освобождение выделенной памяти......................................293 5.3.67 Функция 4Ah (74) Изменение выделенной па- мяти (SETBLOCK).............................294 5.3.68 Функция 4Bh (75) Загрузка или выполнение программы (EXEC)............................295 5.3.69 Функция 4Ch (76) Завершить выполнение программы (EXIT)............................297 - 17 - 5.3.70 Функция 4Dh (77) Получение кода возврата подпроцесса (WAIT)..........................298 5.3.71 Функция 4h (78) Поиск первого подходящего файла (FIND FIRST)..........................298 5.3.72 Функция 4Fh (79) Поиск следующего подхо- дящего файла (FIND NEXT)....................300 5.3.73 Функция 54h (84) Получение статуса флага проверки VERIFY.............................300 5.3.74 Функция 56h (86) Переименование файла.......301 5.3.75 Функция 57h (87) Получение или установка даты и времени для файла....................302 5.3.76 Функция 59h (89) Получение расширенной информации об ошибках (DOS 3.0).............303 5.3.77 Функция 5Ah (90) Создание и открытие но- вого файла (DOS 3.0)........................306 5.3.78 Функция 5Bh (91) Создание нового файла (без открытия) DOS 3.0......................307 5.3.79 Функция 5Ch (92) Блокировка/разблокировка доступа к файлу (DOS 3.0)...................308 5.3.80 Функция 5E0h (94-0) Получение имени маши- ны (DOS 3.1)................................309 5.3.81 Функция 5E0h (94-2) Установка параметров принтера (DOS 3.1)..........................310 5.3.82 Функция 5E0h (94-3) Получениепараметров принтера (DOS 3.1)..........................311 5.3.83 Функция 5F02h (95-2) Получение входа в списке переопределений (DOS 3.1)............312 5.3.84 Функция 5F03h (95-3) Переопределение уст- ройства (DOS 3.1)...........................313 5.3.85 Функция 5F04h (95-4) Отмена переопределе- ний (DOS 3.1)...............................315 5.3.86 Функция 62h (98) Получение адреса PSP (префикс программного сегмента) DOS 3.0.....315 6. БАЗОВАЯ СИСТЕМА ВВОДА/ВЫВОДА BIOS. ПРЕРЫВАНИЯ..........316 6.1 INT 00h (0) Деление на ноль........................316 6.2 INT 01h (1) Трассировка............................316 - 18 - 6.3 INT 02h (2) Немаскированное прерывание.............317 6.4 INT 03h (3) Контрольная точка......................317 6.5 INT 04h (4) Переполнение...........................318 6.6 INT 05h (5) Печать экрана..........................318 6.7 INT 08h (8) Системный таймер.......................319 6.8 INT 09h (9) Клавиатура.............................319 6.9 Прерывание INT 10h (управление экраном)............321 6.9.1 INT 10h, 00h (0) Установка pежима работы дисплея............................322 6.9.2 INT 10h, 01h (1) Установка размера курсора...323 6.9.3 INT 10h, 02h (2) Установка положения кур- сора...............................324 6.9.4 INT 10h, 03h (3) Считывание положения и размера курсора....................325 6.9.5 INT 10h, 04h (4) Считывание положения све- тового пера........................327 6.9.6 INT 10h, 05h (5) Установка текущей страни- цы дисплея.........................328 6.9.7 INT 10h, 06h (6) Прокрутка окна вверх........329 6.9.8 INT 10h, 07h (7) Прокрутка окна вниз.........329 6.9.9 INT 10h, 08h (8) Считывание символа и ат- рибута по месту расположения курсора............................330 6.9.10 INT 10h, 09h (9) Запись символа и атрибу- та по месту расположения курсора...331 6.9.11 INT 10h, 0Ah (10) Запись символа по месту расположения курсора...............332 6.9.12 INT 10h, 0Bh (11) Установка цветовой па- литры..............................333 6.9.13 INT 10h, 0Ch (12) Запись элемента изобра- жения (точки)......................334 6.9.14 INT 10h, 0Dh (13) Считывание элемента изображения (точки)................335 6.9.15 INT 10h, 0h (14) Запись символа в теле- тайпном режиме.....................336 6.9.16 INT 10h, 0Fh (15) Выдача текущего режима экрана.............................337 - 19 - 6.9.16 INT 10h, 10h (16) Установка регистров па- литры (PCjr и EGA).................337 6.9.18 INT 10h, 11h (17) Генератор символов (EGA)..............................340 6.9.19 INT 10h, 12h (18) Альтернативный выбор (EGA)..............................343 6.9.20 INT 10h, 13h (19) Вывод строки символов.....344 6.9.21 INT 10h, 14h (20) Обработчик LCD (дисплей на жидких кристаллах) Convertible........................345 6.9.22 INT 10h, 15h (21) Выдача физических ха- рактеристик дисплея Convertible...346 6.10 INT 11h (17) Выдача списка оборудования...........348 6.11 INT 12h (18) Выдача объема памяти.................349 6.12 Прерывание INT 13h (поддержка дисковых операций)..350 6.12.1 INT 13h, 00h (0) Сброс дисковой системы в начальное состояние................350 6.12.2 INT 13h, 01h (1) Определение состояния дисковой системы...................351 6.12.3 INT 13h, 02h (2) Считывание секторов в память.............................352 6.12.4 INT 13h, 03h (3) Запись секторов из памя- ти.................................355 6.12.5 INT 13h, 04h (4) Проверка секторов..........357 6.12.6 INT 13h, 05h (5) Форматирование цилиндра...358 6.12.7 INT 13h, 06h (6) Форматирование дорожки и установление признаков плохих секторов (винчестер)...............361 6.12.8 INT 13h, 07h (7) Форматирование диска, начиная с цилиндра (винчестер).....362 6.12.9 INT 13h, 08h (8) Взять текущие параметры дисковода (винчестер)..............363 6.12.10 INT 13h, 09h (9) Инициализация таблиц винчестера.........................365 6.12.11 INT 13h, 0Ah (10) Длинное считывание (диагностика)......................366 6.12.12 INT 13h, 0Bh (11) Длинная запись (диаг- ностика)...........................368 - 20 - 6.12.13 INT 13h, 0Ch (12) Поиск цилиндра (вин- честер)............................369 6.12.14 INT 13h, 0Dh (13) Альтернативный сброс диска (винчестер)..................370 6.12.15 INT 13h, 10h (16) Проверка готовности диска (винчестер)..................371 6.12.16 INT 13h, 11h (17) Перекалибровка диско- вода (винчестер)...................371 6.12.17 INT 13h, 15h (21) Считывание DASD-типа.....372 6.12.18 INT 13h, 16h (22) Статус смены носителя...373 6.12.19 INT 13h, 17h (23) Установление DASD-типа для форматирования.................374 6.12.20 INT 13h, 18h(24) Установление типа носи- теля для форматирования............375 6.13 Прерывание INT 14h (поддержка последователь- ного порта)........................377 6.13.1 INT 14h, 00h (00) Инициализация парамет- ров последовательного порта........377 6.13.2 INT 14h, 01h (1) Засылка одного символа.....377 6.13.4 INT 14h, 03h (3) Состояние последователь- ного порта.........................378 6.14 Прерывание INT 15h (расширенный сервис AT)........378 6.14.1 INT 15h, 40h (64) Считывание/модификация профиля (для Convertible)..........380 6.14.2 INT 15h, 41h (65) Ожидание внешнего собы- тия (для Convertible)..............382 6.14.3 INT 15h, 42h (66) Запрос отключения пита- ния системы (для Convertible)......383 6.14.4 INT 15h, 43h (67) Считывание состояния системы (для Convertible)..........384 6.14.5 INT 15h, 44h (68) Включение/выключение модема (для Convertible)...........385 6.14.6 INT 15h, 4Fh (79) Перехват клавиатуры.......386 6.14.7 INT 15h, 80h (128) Устройство открыто.......386 6.14.8 INT 15h, 81h (129) Устройство закрыто.......387 - 21 - 6.14.9 INT 15h, 82h (130) Прекращение работы ус- тройства...........................388 6.14.10 INT 15h, 83h (131) Ожидание события........388 6.14.11 INT 15h, 84h (132) Поддержка координат- ной ручки (джойстик)...............389 6.14.12 INT 15h, 85h (133) Нажат системный зап- рос................................390 6.14.13 INT 15h, 86h (134) Ожидание для XT и AT...391 6.14.14 INT 15h, 87h (135) перемещение блока для XT-286,AT..........................391 6.14.15 INT 15h, 88h (136) выборка размера рас- ширенной памяти для XT-286,AT......394 6.14.16 INT 15h, 89h (137) переключение в защи- щенный режим для XT-286,AT.........394 6.14.17 INT 15h, 90h (138) Устройство занято.......396 6.14.18 INT 15h, 91h (139) Прерывание закончено...397 6.14.19 INT 15h, C0h (192) Возврат конфигурации системы............................398 6.15 Прерывание INT 16h (поддержка клавиатуры).........400 6.15.1 INT 16h, 00h (0) считывание клавиатуры......400 6.15.2 INT 16h, 01h (1) Состояние клавиатуры.......401 6.15.3 INT 16h, 02h (2) Выборка состояния сдвига...401 6.15.4 INT 16h, 03h (3) Установка скорости пов- торения для PCjr,XT-286,AT.........402 6.15.5 INT 16h, 04h (4) Настройка щелчка клавиа- туры (для PCjr, Convertible).......404 6.15.6 INT 16h, 05h (5) Запись в буфер клавиату- ры.................................404 6.15.7 INT 16h, 10h (16) расширенное считывание клавиатуры.........................405 6.15.8 INT 16h, 11h (17) Расширенное состояние клавиатуры.........................406 6.15.9 INT 16h, 12h (18) Выборка расширенного состояния сдвига...................406 6.16 Прерывание INT 17h (поддержка принтера)...........408 6.16.1 INT 17h, 00h (0) Засылка одного байта на принтер............................408 - 22 - 6.16.1 INT 17h, 00h (0) Засылка одного байта на принтер............................408 6.16.2 INT 17h, 01h (1) Инициализация принтера.....408 6.16.3 INT 17h, 02h (2) Выборка состояния прин- тера...............................408 6.17 INT 18h (24) Загрузка БЕЙСИКа.....................409 6.18 INT 19h (25) Функция начальной загpузки...........409 6.19 Прерывание INT 1Ah (операции даты/времени)........411 6.19.1 INT 1Ah, 00h (0) Считывание времени по системному таймеру.................411 6.19.2 INT 1Ah, 01h (1) Установка времени по системному таймеру.................412 6.19.3 INT 1Ah, 02h (2) Считывание времени по часам реального времени............413 6.19.4 INT 1Ah, 03h (3) Установка времени на ча- сах реального времени..............414 6.19.5 INT 1Ah, 04h (4) Считывание даты по часам реального времени..................415 6.19.6 INT 1Ah, 05h (5) Установка даты на часах реального времени..................416 6.19.7 INT 1Ah, 06h (6) Установка сигнала на ча- сах реального времени..............417 6.19.8 INT 1Ah, 07h (7) Сброс сигнала на часах реального времени..................418 6.19.9 INT 1Ah, 08h (8) Установка режима включе- ния в сеть по часам................419 6.19.10 INT 1Ah, 09h (9) Чтение времени сигнала и его статуса......................419 6.19.11 INT 1Ah, 0Ah (10) Чтение значения счет- чика дней по системному таймеру...420 6.19.12 INT 1Ah, 0Вh (11) Установка счетчика дней для системного таймера........421 6.19.13 INT 1Ah, 80h (128) Установка звукового мультиплексора.....................421 - 23 - 6.20 INT 1Bh (27) Сброс с клавиатуры...................422 6.21 INT 1Ch (28) Квант таймера........................422 6.22 INT 4Ah (74) Сигнал пользователю (XT-286, AT, Convertible)........................423 6.23 INT 70h (112) Часы реального времени (XT-286, AT, Convertible)..................423 7. ОБЛАСТЬ ДАННЫХ MS DOS..................................425 7.1. RAM-BIOS (ОЗУ)....................................425 7.1.1 0:400h Базовые адреса последовательного коммуникационного порта RS-232.......425 7.1.2 0:408h Базовые адреса параллельного порта принтера.............................425 7.1.3 0:410h Список оборудования..................426 7.1.4 0:412h Зарезервировано (Для PC Convertible - статус POST).........................427 7.1.5 0:413h Объем памяти.........................427 7.1.6 0:415h Зарезервировано (Для PC Convertible - состояние батареи)...................428 7.1.7 0:417h Состояние сдвига (Shift).............428 7.1.8 0:418h Состояние расширенного сдвига........429 7.1.9 0:419h Альтернативный ввод через цифровую клавиатуру...........................429 7.1.10 0:41Ah Указатель на начало буфера клави- атуры...............................430 7.1.11 0:41Ch Указатель на конец буфера клавиа- туры................................430 7.1.12 0:41Eh Буфер клавиатуры................430 7.1.13 0:43Eh Состояние перекалибровки дисковода..430 7.1.14 0:43Fh Состояние мотора дисковода..........431 7.1.15 0:440h Счетчик выключения мотора...........432 7.1.16 0:441h Статус последней операции диско- вода................................433 7.1.17 0:442h Информация о состоянии контролле- ра дисковода........................433 7.1.18 0:449h Режим дисплея.......................434 7.1.19 0:44Ah Число колонок текущего режима.......434 7.1.20 0:44Ch Длина буфера регенерации изобра- жения...............................434 - 24 - 7.1.21 0:44h Начальный адрес буфера регенерации...435 7.1.22 0:450h Позиция курсора (колонка, строка) для страниц дисплея.................435 7.1.23 0:460h Конечная и начальная строки раз- вертки курсора......................436 7.1.24 0:462h Текущая страница дисплея............436 7.1.25 0:463h Базовый адрес контроллера CRT.......436 7.1.26 0:465h Текущее содержимое регистра уп- равления режимом....................437 7.1.27 0:466h Текущее содержимое регистра выбо- ра цвета (порт 3х9h)................437 7.1.28 0:467h Зарезервирован......................437 7.1.29 0:46Ch Длинное целое, содержащее значение счетчика таймера...........438 7.1.30 0:470h Признак переполнения таймера........438 7.1.31 0:471h Состояние клавиши сброса (Break)...439 7.1.32 0:472h Признак состояния сброса............439 7.1.33 0:474h Статус последней операции над жестким диском......................440 7.1.34 0:475h Число жестких дисков................441 7.1.35 0:476h Зарезервирован......................441 7.1.36 0:477h Зарезервирован......................441 7.1.37 0:478h Значение времени ожидания для па- раллельных принтеров................441 7.1.38 0:47Сh Значения текущего времени тайм-аута...........................442 7.1.39 0:480h Указатель на смещение начала бу- фера клавиатуры.....................442 7.1.40 0:482h Указатель на смещение конца буфе- ра клавиатуры.......................443 7.1.41 0:484h Число строк дисплея минус 1.........443 7.1.42 0:485h Высота символа......................443 7.1.43 0:487h Состояние управлениея дисплеем......443 7.1.44 0:489h Зарезервирован......................444 7.1.45 0:48Bh Управление средой дисковода.........444 7.1.46 0:48Сh Статус контроллера жесткого диска...444 - 25 - 7.1.47 0:48Dh Статус ошибки контроллера жестко- го диска............................445 7.1.48 0:48Eh Управление прерыванием жесткого диска...............................445 7.1.49 0:48Fh Зарезервирован......................445 7.1.50 0:490h Состояние среды 0-го дисковода......445 7.1.51 0:491h Состояние среды 1-го дисковода......446 7.1.52 0:492h Зарезервирован......................447 7.1.53 0:494h Текущая дорожка 0-го дисковода......447 7.1.54 0:495h Текущая дорожка 1-го дисковода......447 7.1.55 0:496h Состояние клавиатуры и признаки типа................................447 7.1.56 0:497h Состояние световых индикаторов клавиатуры..........................448 7.1.57 0:498h 4-х байтный указатель на признак завершения ожидания пользователя...448 7.1.58 0:49Сh Длинное целое - счетчик ожидания пользователя........................449 7.1.59 0:4A0h Активный признак ожидания...........449 7.1.60 0:4A1h Зарезервирован......................449 7.1.61 0:4A8h 4-х байтовый указатель на пара- метры дисплея для EGA...............450 7.1.62 0:4AСh Зарезервирован......................452 7.1.63 0:4F0h Внутренняя область для связей приклад ных программ................452 7.1.64 0:500h Байт состояния печати экрана........452 7.1.65 0:501h Зарезервирован......................453 7.1.66 0:504h Признак имитации дисковода..........453 7.1.67 0:505h Зарезервирован......................453 7.2 Некоторые специальные точки ROM-BIOS (ПЗУ)........454 7.2.1 F000:FFF0h Длинный переход (FAR JMP) на начало программы POST...........454 7.2.2 F000:FFF5h Дата версии ПЗУ BIOS в ASCII кодах...........................454 7.2.3 F000:FFFCh Зарезервирован...................455 7.2.4 F000:FFFЕh Идентификатор (ID) модели сис- темы.............................455 СПИСОК ЛИТЕРАТУРЫ......................................456 - 26 - о заказу Центрального института повышения квалификации уководящих работников и специалистов черной металлургии. азработчики: к.т.н., доц. ТЕР-АКОПОВ Р.С., АЛЕКСЕЕВ А.А. аучный руководитель проекта: к.т.н., доцент Гладков А.И. Copyright (C) 1989 Все права принадлежат ЦИПКЧермет. - 27 - 1. АРХИТЕКТУРА ЦЕНТРАЛЬНОГО ПРОЦЕССОРА ПЭВМ Основными аппаратными компонентами персональной ЭВМ явля- ются: - системный блок; - клавиатура; - монитор с дисплеем; - накопители на магнитных дисках; - принтер. Кроме того, компьютер может быть укомплектован средствами асинхронной связи, графопостроителями, сканерами и т.п. В системный блок входят: - системная плата; - блок питания; - гнезда расширения для дополнительных плат. Главным компонентом персонального компьютера ПК является центральный микропроцессор ЦП, который выполняет все операции обработки команд и данных. Центральный процессор ПК IBM и сов- местимых с ними может быть реализован на микросхемах фирмы Intel 8080, 8086, 80286 или 80386. Центральный процессор может быть разделен на два логичес- ких блока (см. рис.1.1): - блок исполнения EU; - блок итерфейса шин BIU. Итерфейс - это совокупность средств, обеспечивающих сопря- (interface) жение устройств и программных модулей как на физическом, так и на логичес- ком уровнях. Иногда этот термин упот- ребляют так же и для характеристики средств доступа пользователя к вычис- лительной системе - "интерфейс поль- зователя". Интерфейс состоит из нес- кольких контроллеров ввода/вывода, каждый из которых может содержать в себе одну или более микросхем СБИС (Chips). - 28 - EU:Execution Unit є BIU:Bus Interface Unit ЪДДДДДДВДДДДДДї є і AH і AL і є ГДДДДДДЕДДДДДДґ є і BH і BL і є ГДДДДДДЕДДДДДДґ є Program Control і CH і CL і є ГДДДДДДЕДДДДДДґ є ЪДДДДДДДДДДДДДї і DH і DL і є і CS і ГДДДДДДБДДДДДДґ є ГДДДДДДДДДДДДДґ і SP і є і DS і ГДДДДДДДДДДДДДґ є ГДДДДДДДДДДДДДґ і BP і є і SS і ГДДДДДДДДДДДДДґ є ГДДДДДДДДДДДДДґ і SI і є і ES і ГДДДДДДДДДДДДДґ є АДДВДДДДДДДДДДЩ і DI і є і ЪДДДДДДДДДї АДДДДДДВДДДДДДЩ є і і Bus і Bus ДДДДДДДДДЕДДДДДДДДДДДДДДЧДДДДДДДДДДДДДДДЕДДґ Control ГДДДДД і є і і Unit і і є і АДДДДДДДДДЩ ЪДДДДДДБДДДДДДДДДї є і і ALU:Arithmetic і є і і and Logic Unit і є і ГДДДДДДДДДДДДДДДДґ є і ЪДД>іCU:Control Unit і є і і ГДДДДДДДДДДДДДДДДґ є ЪДДДДДДБДДДДДДї і і Flags Register і є ЪДДДДґ 1 і Instruction і АДДДДДДВДДДДДДДДДЩ є і ГДДДДДДДДДДДДДґ Queue і і є і і 2 і (Six Bytes) і і ЪДДДДЧДДДЩ ГДДДДДДДДДДДДДґ і і і є і ...... і і і і є ГДДДДДДДДДДДДДґ і ЪДДДДДДБДДДДДДї і є і 6 і і і Instrucnion і і є АДДДДДДДДДДДДДЩ АДДДґ Pointer і<ДЩ є Рис. 1.1 Блок исполнения и АДДДДДДДДДДДДДЩ є блок интерфейса шин - 29 - Системная шина - это совокупность проводников, соединяющих (bus) ЦП с памятью и устройствами ввода/вывода. Проводники шины объединены в три группы: - линии данных; - линии адреса; - линии управления. Взаимодействие между интерфейсом ввода/выводда и шиной осуществляется через регистры, называемые портами ввода/вывода. Назначение блока EU - исполнение команд, а блок BIU выпол- няет передачу команд и данных в EU. В состав EU входят арифме- тико-логическое устройство ALU, устройство управления CU и де- сять регистров. Устройства блока EU обеспечивают обработку команд, выполнение арифметических и логических операций. Три части блока BIU - устройство управления шинами, блок очереди команд и регистры сегментов - предназначены для выпол- нения следующих функций: - управление обменом данными с EU, памятью и внешними уст- ройствами ввода/вывода; - адресация 1 Мбайт памяти; - выборка команд. Выборка команд осуществляется с помощью блока очереди команд Queue (шесть байтов), который поз- воляет выбирать команды с упреждением. ПК имеет два вида внутренней памяти: - постоянное запоминающее устройство ПЗУ (ROM - read only memory); - оперативное запоминающее устройство ОЗУ (RAM - random acces memory). Одна из основных задач ПЗУ обеспечить процедуру старта. В ПЗУ хранятся базовая система ввода/вывода BIOS, интерпретатор BASIC и некоторые служебные программы и таблицы, например, на- чальный загрузчик, программы тестирования и т.п. ОЗУ используется для хранения программы и необходимых ей областей данных. Характерным для ПК является тот факт, что при выключении электропитания содержимое ОЗУ утрачивается. Наименьшей единицей данных, с которой работает компьютер, является бит (bit). Значением бита может быть либо ноль, либо - 30 - единица. Группа из восьми битов называется байтом (Byte) и представляет собой наименьшую адресуемую единицу - ячейку. Биты в байте нумеруют справа налево цифрами 0...7. ЪДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДї BYTE і 7 і 6 і 5 і 4 і 3 і 2 і 1 і 0 і АДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДЩ . Каждому из байтов присвоен уникальный адрес памяти, начи- ная с нулевого (самый младший адрес). Двухбайтовое поле образует шестнадцатиразрядное машинное слово (Word), биты в котором нумеруются от 0 до 15 справа нале- во. WORD ДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДТДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДї 15 і14 і13 і 12і11 і10 і 9 і 8 є 7 і 6 і 5 і 4 і 3 і 2 і 1 і 0 і ДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДРДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДЩ Байт с меньшим адресом считается младшим. В ПК принята двоичная система представления данных. Сим- вольная информация кодируется в соответствии с кодом ASCII (Американский стандартный код для обмена информацией). Некото- рые из его 256 символов заменяются на символы русского алфавита (кириллица). Числовые данные кодируются в соответствии с двоич- ной арифметикой. Отрицательные числа представляются в дополни- тельном коде. Для удобства представления данных используется шестнадцатиричная система счисления. Принято двоичные числа сопровождать латинской буквой B или b, например, 101B, а шестнадцатиричные - буквой H или h на кон- це. Если число начинается с буквы, то обязательной является постановка нуля впереди, например, 0BA8H. Регистры Процессоры 8086/8088 имеют 14 шестнадцатиразрядных регист- ров, которые используются для управления исполнением команд, адресации и выполнения арифметических операций. Регистр, содер- жащий одно слово, адресуется по имени. - 31 - Регистры сегмента CS, DS, SS и ES Регистр CS - содержит начальный адрес сегмента кода. Этот адрес, суммированный со значением смещения в указателе команд (IP), определяет очередную выполняемую команду. Регистр DS - содержит начальный адрес сегмента данных. В простейшем случае этот адрес плюс смещение, указанное в инс- трукции, задает адрес в сегменте данных. Регистр SS - содержит начальный адрес регистра стека. Регистр ES - используется для адресации памяти в строковых операциях. И этом плане он похож на регистр DI. Регистр ES ини- циализируется программой на ассемблере. Регистры общего назначения AX, BX, CX и DX Регистры общего назначения являются основными рабочими ре- гистрами ассемблерных программ. Их отличает то, что к ним можно адресоваться одним словом или однобайтовым кодом. Левый байт считается старшим, а правый - младшим. Регистр AX - первичный аккумулятор, используется во всех операциях ввода/вывода, в некоторых операциях со строками и в некоторых арифметических операциях. Регистр BX - базовый регистр, единственный из регистров общего назначения, используемый в индексной адресации. Кроме того, регистр BX используется при вычислениях. Регистр DX - регистр данных. Используется в некоторых опе- рациях ввода/вывода, в операциях умножения и деления больших чисел совместно с регистром AX. Любой из регистров общего назначения может быть использо- ван для суммирования или вычитания 8- или 16-разрядных величин. Регистры указателя SP и BP Регистры указателя используются для обращения к данным в сегменте стека. Регистр SP - указатель стека. Используется для временного хранения адресов и иногда данных. Адресует стек аналогично ре- - 32 - гистру SS. Регистр BP - указатель базы. Обеспечивает ссылки на пара- метры (данные и адреса, передаваемые через стек). Индексные регистры SI и DI Индексные регистры используются для адресации, а также для выполнения операций сложения и вычитания. Регистр SI - индекс источника. Используется в некоторых операциях со строками или символами, аналогичен регистру DS. Регистр DI - индекс приемника. Используется в тех же опе- рациях, что и регистр SI. Аналогичен регистру ES. Регистр указателя команд IP Регистр IP используется для выборки очередной команды программы с целью ее исполнения. Регистр флагов Flags Регистр Flags содержит девять активных битов (из 16), ко- торые отражают состояние машины и результаты выполнения машин- ных команд. Биты : 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Регистр : OF DF IF TF SF ZF AF PF CF ------------------------ПРИЗНАКИ--------------------------- OF (переполнения) - равен 1, если возникает арифмети- ческое переполнение, т.е. когда об'ем результата превышает размер ячейки назначения DF (направления) - устанавливается в 1 для автомати- ческого декремента в командах об- работки строк, и в 0 для инкре- мента - 33 - IF (разрешения прерывания) - прерывания разрешены, если IF=1. Если IF=0, то распознаются лишь немаскированные прерывания TF (трассировки) - если TF=1, то процессор переходит в состояние прерывания INT 3 пос- ле выполнения каждой команды SF (знака) - SF=1, когда старший бит результа- та равен 1. Иными словами, SF=0 для положительных чисел, и SF=1 для отрицательных чисел ZF (нулевого результата) - ZF=1, если результат равен нулю AF (дополнительный признак переноса) - этот признак устанавливается в 1 во время выполнения команд деся- тичного сложения и вычитания при необходимости выполнения перено- са или заема между полубайтами PF (четности) - этот признак устанавливается в 1, если результат имеет четное чис- ло единиц CF (переноса) - этот признак устанавливается в 1, если имеет место перенос или заем из старшего бита результата; он полезен для произведения операций над числами длиной в несколько слов, которые сопряжены с перено- сами и заемами из слова в слово. - 34 - Сегменты Сегментом называется область памяти, которая начинается на границе параграфа, то есть в любой точке, адрес которой кратен 16 (восемь младших битов равны нулю). Существуют три основных типа сегментов: - сегмент кода - содержит машинные команды, адресуется ре- гистром CS; - сегмент данных - содержит данные, то есть константы и рабочие области, необходимые программе. Адресуется регистром DS; - сегмент стека - содержит адреса возврата в точку вызова подпрограмм. Адресуется регистром SS. Каждый из упомянутых регистров содержит адрес начала сег- мента (базовый адрес). В программе все адреса записаны относи- тельно начала сегмента, и они определяются как смещение (offset) от начала сегмента. Двухбайтовое смещение (одно слово) может принимать значение от 0000 до 0FFFFh. Для того, чтобы вы- полнить обращение по любому адресу процессор выполняет суммиро- вание адреса, записанного в регистре сегмента, со смещением. При этом, содержимое регистра сдвигается на четыре двоичных разряда влево. Результирующий адрес занимает 20 позиций, что и позволяет адресовать 1 Мбайт памяти. Пример. Содержимое DS 045F + Смещение 0032 ------ Исполнительный 04622 адрес (EA) Примечание: Адреса шестнадцатиричные. - 35 - РЕЖИМЫ АДРЕСАЦИИ Стандартный сег- Режим адресации Формат адреса ментный регистр =============== ============= ================= Регистровая регистр Нет Непосредственная данные Нет Косвенная регистровая [BX] DS [BP] SS [DI] DS [SI] DS По базе со смещением метка [BX] DS метка [BP] SS Прямая метка [DI] DS с индексированием метка [SI] DS По базе метка [BX + SI] DS с индексированием метка [BX + DI] DS метка [BP + SI] SS метка [BP + DI] SS Строковые команды исходный адрес DS:SI место назначения ES:DI * Метка [...] может быть заменена на [смещение + ...]. Следовательно, запись [24 + BX] будет означать адрес 24+ВХ. ========================================================= имечание: Многие строковые команды используют ES:DI как место назначения, а DS:SI как адрес источника. Эта таблица приводит количество временных тактов, требуе- мых для вычисления исполнительного адреса на микропроцессоре 8088. Микропроцессор 80*8* производит эти вычисления быстрее, - 36 - так что эта таблица содержит "самые медленные" данные. -------------------------------------------------------------- Способы адресации Такты для 8088 Пример -------------------------------------------------------------- Смещение 6 MOV AX,ADDR Косвенная регистровая 5 MOV AX,[BX] BX, SI, DI По базе или с индек- 9 MOV AX,ADDR[BP] сированием + смещение BX+смещение, BP+смещение SI+смещение, DI+смещение По базе или с индексиро- ванием (без смещения) BP+DI, BX+SI 7 MOV AX,[BP+DI] BP+SI, BX+DI 8 MOV AX,[BX+DI] По базе с индексирова- нием + смещение BP+DI+смещение 11 MOV AX,ADDR[BP+DI] BX+SI+смещение BP+SI+смещение 12 MOV AX,ADDR[BP+SI] BX+DI+смещение -------------------------------------------------------------- Примечание: Прибавьте 2 такта в случае вычисления исполнительного ад- реса из другого сегмента. Каждое обращение к памяти занимает дополнительные 4 такта. Поле обращений в описаниях команд содержит информацию о коли- честве обращений к памяти для каждой команды. - 37 - Стеки Во многих случаях программе требуется временно запомнить информацию, а затем считывать ее в обратном порядке. Эта проб- лема в ПК решена посредством реализации стека LIFO ("последний пришел - первый ушел"), называемого также стеком включения/из- влечения (stack - кипа, например, бумаг). Наиболее важное ис- пользование стека связано с процедурами. Стек обычно рассчитан на косвенную адресацию через регистр SP - указатель стека. При включении элементов в стек производится автоматический декре- мент указателя стека, а при извлечении - инкремент, то есть стек всега "растет" в сторону меньших адресов памяти. Адрес последнего включенного в стек элемента называется вершиной сте- ка (TOS). Физический адрес стека формируется из SP и SS или BP и SS, причем SP служит неявным указателем стека для всех операций включения и извлечения, а SS - сегментным регистром стека. Со- держимое SS является самым младшим адресом (границей) области стека и называется базой стека. Первоначальное содержимое SP считается наибольшим смещением, которого может достигать стек. Регистр BP предназначен, главным образом, для произвольных об- ращений к стеку. Прерывания Иногда необходимо выполнить одну из набора специальных процедур, если в системе или в программе возникают определенные условия, например, нажата клавиша на клавиатуре. Действие, сти- мулирующее выполнение одной из таких процедур, называется пре- рыванием, поскольку основной процесс при этом приостанавливает- ся на время выполнения этой процедуры. Существует два общих класса прерываний: внутренние и внешние. Первые инициируются- состоянием ЦП или командой, а вторые - сигналом, подаваемым от других компонентов системы. Типичные внутренние прирывания: де- ление на нуль, переполнение и т.п., а типичные внешние - это запрос на обслуживание со стороны какого-либо устройства ввода/ вывода. - 38 - Переход к процедуре прерывания осуществляется из любой программы, а после выполнения процедуры прерывания обязательно происходит возврат в прерванную программу. Перед обращением к процедуре прерывания должно быть сохранено состояние всех ре- гистров и флагов, используемых процедурой прерывания, а после окончания прерывания эти регистры должны быть восстановлены. Некоторыми видами прерываний управляют флажки IF и TF, ко- торые для восприятия прерываний должны быть правильно установ- лены. Если условия для прерывания удовлетворяются и необходимые флажки установлены, то микропроцессор завершает текущую коман- ду, а затем реализует последовательность прерывания: - текущее значение регистра Flags включается в стек (экви- валентно команде pushf); - текущее значение кодового сегмента CS включается в стек (эквивалентно команде push CS); - текущее значение указателя инструкции IP включается в стек (эквивалентно команде push IP); - сбрасываются флажки IF и TF. Новое содержимое IP и CS определяет начальный адрес выпол- няемой процедуры прерывания (обслуживание прерывания). Возврат в прерванную программу осуществляется командой, которая извле- кает из стека содержимое для: - IP (эквивалентно pop IP); - CS (эквивалентно pop CS); - Flags (эквивалентно popf). Двойное слово, в котором находится новое содержимое IP и CS, называется указателем прерывания, или вектором. Каждому ти- пу прерывания назначено число из диапазона 0...255, и адрес указателя прерывания находится путем умножения номера типа на четыре. - 39 - 2. СИСТЕМА КОМАНД ЦЕНТРАЛЬНОГО ПРОЦЕССОРА Центральный процессор содержит следующий набор команд. ПЕРЕСЫЛКА ДАННЫХ MOV PUSH POP XCHG OUT IN XLAT LEA LDS LES LAHF SAHF PUSHF POPF АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ ADD ADC INC SUB SBB DEC CMP MUL IMUL DIV IDIV NEG AAA DAA AAS DAS AAM AAD CBW CWD ЛОГИЧЕСКИЕ ОПЕРАЦИИ NOT SHL/SAL SHR SAR ROL ROR RCL RCR AND TEST OR XOR ОБРАБОТКА БЛОКОВ ДАННЫХ REP MOVS CMPS SCAS LODS STOS CMPB CMPSW LODSB LODSW MOVSB MOVSB MOVSW REPE REPNZ SCASB SCASW STOSB STOSW КОМАНДЫ ПЕРЕДАЧИ УПРАВЛЕНИЯ CALL JMP RET - 40 - КОМАНДЫ УСЛОВНОГО ПЕРЕХОДА JA JLE JNL JS JAE JNA JNLE JZ JB JNAE JNO LOOP JBE JNB JNP LOOPE JC JNBE JNS LOOPNE JCXZ JNC JNZ LOOPNZ JE JNE JO LOOPZ JG JNE JP JGE JL JPE JNGE JPO КОМАНДЫ ПРЕРЫВАНИЯ INT INTO IRET УПРАВЛЕНИЕ СОСТОЯНИЕМ ПРОЦЕССОРА CLС CMC STС CLD STD CLI STI HLT WAIT ESC LOCK NOP Подробное описание каждой из команд приводится ниже. Каж- дая запись этого списка содержит информацию о том, какие признаки из регистра FLAGS процессора 8088 и как изменяются. Поскольку регистр FLAGS содержит всего 9 признаков, эту инфор- мацию можно выдать в компактной форме, например: Признаки: O D I T S Z A P C 0 * * ? * 0 , где приняты следующие обозначения признаков: ? - неопределен после операции; * - изменился в зависимости от результатов выполнения команды; 0 - всегда сброшен; 1 - всегда установлен. - 41 - Диаграмма времени иллюстрирует синхронизацию для 8088. Т.к. процессоры 80*8* выполняют команды за меньшее число так- тов, чем 8088, эта диаграмма отражает наиболее медленный вари- ант. Операнды В этом поле приводится список возможных операндов и способы адресации для каждой команды. Такты Число временных циклов (тактов), необхо- димых для выполнения команды на 8088. Вычисление исполнительного адреса (EA) требует дополнительного времени, как показано в таблице EA. Обращения Число обращений к памяти. Каждое обра- щение к памяти длится 4 такта. Байты Число байтов в команде. Примечание: Дополнительное время, требуемое для изменения указателя команд и выборки следующей команды после команд, передающих уп- равление (таких как JMP или CALL), уже учтено при составлении диаграммы времени. В случае команд, осуществляющих условную пе- редачу управления (таких как JZ) приводится две диаграммы вре- мени; меньшее число тактов соответствует случаю, когда переход не осуществляется. - 42 - 2.1 Команды пересылки данных 2.1.1 IN Ввод байта или слова Признаки не меняются. Команда: IN accumulator,port. Логика : accumulator = (port). IN передает байт или слово из заданного порта port в AL или AX. Адрес порта может определяться как непосредственным байтовым значением (в диапазоне 0-255), так и с использованием косвенной адресации по регистру DX. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример байт(слово) accumulator,непоср.8 10(14) 1 2 IN AL,45h accumulator,DX 8(12) 1 1 IN AX,DX ------------------------------------------------------------- Примечания : Следует указать на то, что аппаратная часть не использует порты от F8h до FFh для ввода/вывода, поскольку они зарезерви- рованы для контроля за внешним процессором и для других возмож- ных расширений процессора в будущем. 2.1.2 LAHF Загрузка AH из регистра флагов Признаки не меняются. Команда: LAHF . Логика : биты регистра AH : 7 6 4 2 0 биты регистра признаков FLAGS : S Z A P C . Команда LAHF копирует пять признаков процессора 8080/8086 (признаки знака, нулевого результата, вспомогательного перено- - 43 - са, четности и переноса) в биты регистра AH с номерами 7, 6, 4, 2, 0 соответственно. Сами признаки при выполнении этой команды не меняются. ---------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 4 - 1 LAHF ---------------------------------------------------------- Примечания : Эта команда используется, в основном, в целях обеспечения совместимости микропроцессоров семейств 8080/8085 и 8086. После выполнения этой команды значения битов регистра AH с номерами 1, 3 и 5 не определены. 2.1.3 LDS Загрузка указателя с использованием DS Признаки не меняются. Команда: LDS destination,source. Логика : DS = (source) destination = (source + 2) . Команда LDS загружает в два регистра 32-битный указатель, расположенный в памяти по адресу source. При этом старшее слово заносится в сегментный регистр DS, а младшее слово - в базовый регистр destination. В качестве операнда destination может выс- тупать любой 16-битный регистр, кроме сегментных. --------------------------------------------------------------- Операнды Такты Обращения Байты Пример регистр16,память32 24+EA 2 2-4 LDS DI,32_POINTER --------------------------------------------------------------- Примечания : Команда LES, загрузка указателя с использованием ES, вы- полняет те же действия, что и LDS, но использует при этом вмес- - 44 - то регистра DS регистр ES. 2.1.4 LEA Загрузка исполнительного адреса Признаки не меняются. Команда: LEA destination,source. Логика : destination = Addr(source). Команда LEA присваивает значение смещения (offset) операн- да source (а не его значение !) операнду destination. Операнд source должен быть ссылкой на память, а в качестве операнда destination может выступать любой 16-битный регистр, кроме сег- ментных. -------------------------------------------------------------- Операнды Такты Обращения Байты Пример регистр16,память32 2+EA - 2-4 LEA BX,MEM_ADDR -------------------------------------------------------------- Примечания : Эта команда имеет то преимущество по сравнению с использо- ванием оператора OFFSET в команде MOV, что операнду source можно иметь индексы. Например, следущая строчка не содержит ошибок : LEA BX,TABLE[SI] в то время, как строка MOV BX,OFFSET TABLE[SI] ошибочна, так как оператор OFFSET вычисляется во время ассемб- лирования, а указанный адрес не будет известен до тех пор, пока программа не будет запущена на счет. - 45 - 2.1.5 LES Загрузка указателя с использованием ES Признаки не меняются Команда: LES destination,source. Логика : ES = (source) destination = (source + 2). Команда LES загружает в два регистра 32-битный указатель, расположенный в памяти по адресу source. При этом высшее слово заносится в сегментный регистр ES, а низшее слово - в базовый регистр destination. В качестве операнда destination может выс- тупать любой 16-битный регистр, кроме сегментных. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример регистр16,память32 24+EA 2 2-4 LES DI,STR_ADDR ------------------------------------------------------------- Примечания : Команда LDS, загрузка указателя с использованием DS, вы- полняет те же действия, что и LES, но использует при этом вмес- то регистра ES регистр DS. 2.1.6 MOV Пересылка (байта или слова) Признаки не меняются. Команда: MOV destination,source. Логика: destination = source . MOV пересылает по адресу destination байт или слово, нахо- дящееся по адресу source. - 46 - --------------------------------------------------------------- Операнды Такт Обраще- Байты Пример байты ния (слова) регистр,регистр 2 - 2 MOV BX,SI регистр,непоср.операнд 4 - 2-3 MOV CX,128 аккумулятор,память 10(14) 1 3 MOV AL,MEM_SOURCE регистр,память 8(12)+EA 1 2-4 MOV DI,[DX] память,регистр 9(13)+EA 1 2-4 MOV BETA,DI память,непоср.операнд 10(14)+EA 1 3-6 MOV GAMMA,16h память,аккумулятор 10(14) 1 3 MOV MEM_DEST,AX сегм.регистр,регистр16 2 - 2 MOV DS,BX сегм.регистр,память16 8(12)+EA 1 2-4 MOV DS,SEGMENT_VAL регистр16,сегм.регистр 2 - 2 MOV BP,SS память,сегм.регистр 9(13)+EA 1 2-4 MOV SEGMENT_VAL,DS --------------------------------------------------------------- 2.1.7 OUT загрузка в порт Признаки не меняются. Команда: OUT port,accumulator. Логика : (port) = accumulator. OUT передает байт или слово из AL или AX в заданный порт. Адрес порта может определяться как непосредственным байтовым значением (в диапазоне 0-255), так и с использованием косвенной адресации по регистру DX. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример байт(слово) непоср.8,accumulator 10(14) 1 2 OUT 254,AX DX,accumulator 8(12) 1 1 OUT DX,AL ------------------------------------------------------------- Примечания : Следует указать на то, что аппаратная часть не использует - 47 - порты от F8h до FFh для ввода/вывода, поскольку они зарезерви- рованы для контроля за внешним процессором и для других возмож- ных расширений процессора в будущем. 2.1.8 POP выборка слова из стека Признаки не меняются. Команда: POP destination. Логика : destination = (SP) SP = SP + 2 . Команда POP пересылает слово из верхушки стека по адресу destination, затем увеличивает указатель стека SP на 2, чтобы он указывал на новую верхушку стека. ------------------------------------------------------------ Операнды Такты Обращения Байты Пример регистр 12 1 1 POP CX сегм.регистр(кроме CS) 12 1 1 POP ES память 25 + EA 2 2-4 POP VALUE ------------------------------------------------------------ 2.1.9 POPF пересылка слова из стека в регистр FLAGS Признаки: O D I T S Z A P C r r r r r r r r r Команда: POPF . Логика : flag-register = (SP) SP = SP + 2 . Команда POPF пересылает слово из верхушки стека в регистр FLAGS, изменяя значения всех признаков, затем увеличивает ука- затель стека SP на 2, чтобы он указывал на новую верхушку сте- ка. - 48 - --------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 12 1 1 POPF --------------------------------------------------------- 2.1.10 PUSH загрузка слова в стек Признаки не меняются. Команда: PUSH source. Логика : SP = SP - 2 (SP) = source . Команда PUSH уменьшает значение указателя стека SP на 2, затем пересылает операнд в новую верхушку стека. Операндом source не может быть 8-битный регистр. --------------------------------------------------------------- Операнды Такты Обращения Байты Пример регистр 15 1 1 PUSH BX сегм.регистр(кроме CS) 14 1 1 PUSH ES память 24 + EA 2 2-4 PUSH PARAMETERS --------------------------------------------------------------- Примечание : Даже если source указывает на байт, в стек пересылается целое слово. Микропроцессоры 80286 и 80786 перешлют в стек не те же значения, что микропроцессоры 8086/8088, если использовать ко- манду PUSH SP. Микропроцессоры 80286 и 80386 перешлют старое значение SP, а 8086/8088 - новое значение SP в верхушку стека. Поэтому, в целях получения одинаковых результатов для всех мик- ропроцессоров, используйте следующую последовательность команд: PUSH BP MOV BP, SP XCHG BP, [SP] Эта последовательность команд соответствует выполнению ко- - 49 - манды PUSH SP на микропроцессорах 8088/8086. 2.1.11 PUSHF загрузка содержимого регистра FLAGS в стек Признаки не меняются. Команда: PUSHF . Логика : SP = SP - 2 (SP) = flag-register . Команда PUSHF уменьшает значение указателя стека SP на 2, затем пересылает слово из регистра FLAGS в верхушку стека. ------------------------------------------------------------ Операнды Такты Обращения Байты Пример нет операндов 14 1 1 PUSHF ------------------------------------------------------------ 2.1.12 SAHF загрузка регистра AH в регистр флагов Признаки: O D I T S Z A P C . Команда: SAHF . Логика : биты регистра признаков FLAGS : S Z A P C биты регистра AH : 7 6 4 2 0 . Команда SAHF копирует биты регистра AH с номерами 7, 6, 4, 2 и 0 в регистр FLAGS, заменяя текущие значения признаков зна- ка, нулевого результата, вспомогательного признака переноса, четности и переноса. ------------------------------------------------------------ Операнды Такты Обращения Байты Пример нет операндов 4 - 1 SAHF ------------------------------------------------------------ - 50 - Примечания : Эта команда используется, в основном, в целях обеспечения совместимости микропроцессоров семейств 8080/8085 и 8086. После выполнения этой команды признаки переполнения, направления, прерывания и трассировки не изменяются. 2.1.13 XCHG обмен значениями Признаки не меняются. Команда: XCHG destination,source . Логика: destination <--> source . Команда XCHG обменивает значения своих операндов, которые могут быть байтами или словами. --------------------------------------------------------------- Операнды Такты Обращения Байты Пример байты (слова) память,регистр 17(25)+EA 2 2-4 LOCK XCHG SEM,DX регистр,регистр 4 - 2 XCHG CL,DL аккумулятор,регистр16 3 - 1 XCHG AX,SI --------------------------------------------------------------- Примечание: Эта команда в паре с префиксом LOCK полезна, в частности, при реализации семафоров для управления разделенными ресурсами. 2.1.14 XLAT кодирование AL по таблице Признаки не меняются. Команда: XLAT translate-table . Логика: AL = (BX + AL) . - 51 - Команда XLAT переводит байт, согласно таблице преобразова- ний. Указатель 256-байтовой таблицы преобразований находится в BX. Байт, который нужно перевести, расположен в AL. После вы- полнения команды XLAT байт в AL заменяется на байт, смещенный на AL байтов от начала таблицы преобразований. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример translate-table 11 1 1 XLAT SINE_TABLE ------------------------------------------------------------- Примечания: Таблица преобразований может содержать менее 256 байтов. Операнд, т.е. translate-table, является необязательным, пос- кольку указатель таблицы должен быть загружен в BX еще до нача- ла выполнения команды. Следующий пример иллюстрирует перевод десятичного числа (от 0 до 15) в соответствующую "цифру" шестнадцатеричной систе- мы счисления: LEA BX,HEX_TABLE ;указатель таблицы засылаем в BX, MOV AL,DECIMAL_DIGIT ;а переводимую цифру - в AL XLAT HEX_TABLE ;переводим . ;теперь в AL находится ASCII-код . ;соответствующей цифры . ;шестнадцатеричной системы HEX_TABLE DB '0123456789ABCDEF' 2.2 Арифметические операции 2.2.1 AAA ASCII-коррекция при сложении Команда: AAA . Признаки: O D I T S Z A P C ? ? ? * ? * . - 52 - Логика: if (AL & 0Fh) > 9 or (AF = 1) then AL = AL + 6 AH = AH + 1 AF = 1; CF = 1 else AF = 0; CF = 0 AL = AL & 0Fh . Переводит число, записанное в младшем полубайте аккумуля- тора AL в число, представленное в неупакованном формате в дво- ично-десятичном коде (старший полубайт AL содержит нули). --------------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 4 - 1 AAA --------------------------------------------------------------- Если младший полубайт в AL больше, чем 9 или дополнитель- ный признак переноса AF установлен (=1), то эта команда преобразовывает содержимое AL в его неупакованный двоично-деся- тичный код путем прибавления числа 6 к AL, увеличения AH на 1 и установки признака переноса CF и дополнительного признака пере- носа AF. Старший полубайт AL сбрасывается. Примечания: В неупакованном двоично-десятичном коде каждому байту со- ответствует одна цифра, и AH содержит более значащую цифру, а AL - менее значащую. 2.2.2 AAD ASCII-коррекция при делении Признаки: O D I T S Z A P C ? * * ? * ? Команда: AAD . Логика: AL = AH * 10 + AL AH = 0 . - 53 - AAD переводит двухзначное число, представленное в неупако- ванном формате в регистре AX, из двоично-десятичного кода в двоичный, готовя число к выполнению операций деления DIV или IDIV, которые обрабатывают двоичные числа быстрее. --------------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 60 - 2 AAD --------------------------------------------------------------- AAD преобразует числитель в AL таким образом, чтобы ре- зультат деления был представлен числом в двоично-десятичном ко- де. Для того, чтобы последующая операция деления DIV давала правильный результат, необходимо, чтобы AH=0. После деления частное заносится в AL, а остаток - в AH. Примечания: В неупакованном двоично-десятичном коде каждому байту со- ответствует одна цифра, и AH содержит более значащую цифру, а AL - менее значащую. 2.2.3 AAM ASCII-коррекция при умножении Признаки: O D I T S Z A P C ? * * ? * ? . Команда: AAM . Логика: AH = AL / 10 AL = AL MOD 10 . Эта команда корректирует результат предшествующего умноже- ния двух операндов, представленных в неупакованном двоично-де- сятичном коде. Двузначное неупакованное число берется из AX, проводится корректировка, и результат возвращается в AX. Для того, чтобы эта команда дала верный результат, необходимо, что- бы старшие полубайты обоих сомножителей были равны нулю. - 54 - -------------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 83 - 1 AAM -------------------------------------------------------------- Примечание: В неупакованном двоично-десятичном ко- де каждому байту соответствует одна цифра, и AH содержит более значащую цифру, а AL - менее значащую. 2.2.4 AAS ASCII-коррекция при вычитании Признаки: O D I T S Z A P C ? ? ? * ? * Команда: AAS . Логика: if (AL & 0Fh) > 9 or (AF = 1) then AL = AL - 6 AH = AH - 1 AF = 1; CF = 1 else AF = 0; CF = 0 AL = AL & 0Fh . Эта команда корректирует результат предшествующего вычита- ния двух операндов, представленных в неупакованном двоично-де- сятичном коде, засчет перевода содержимого AL в двоично-десятичный код. Операнд назначения (destination) коман- ды вычитания должен быть специфицирован так же, как AL. Старший полубайт AL всегда равен нулю. --------------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 4 - 1 AAS --------------------------------------------------------------- Примечание: В неупакованном двоично-десятичном ко- де каждому байту соответствует одна цифра, и AH содержит более значащую - 55 - цифру, а AL - менее значащую. 2.2.5 ADC Сложение с переносом Признаки: O D I T S Z A P C * * * * * * . Команда: ADC destination,source. Логика: destination = destination + source + CF. ADC складывает операнды, прибавляет единицу, если признак переноса CF установлен (CF=1), и засылает сумму по назначению (destination). Оба операнда могут быть байтами или словами, и оба операнда могут быть двоичными числами со знаком или без знака. --------------------------------------------------------------- Операнды Такты Обращения Байты Пример байты (слова) регистр,регистр 3 - 2 ADC BX,SI регистр,непоср.операнд 4 - 3-4 ADC CX,128 аккумулятор,непоср.оп. 4 - 2-3 ADC AL,10 регистр,память 9(13)+EA 1 2-4 ADC DX,RESULT память,регистр 16(24)+EA 2 2-4 ADC BETA,DI память,непоср.операнд 17(25)+EA 2 3-6 ADC GAMMA,16h --------------------------------------------------------------- Примечание: Команда ADC полезна при сложении чисел, которые занимают больше 16 бит, т.к. она прибавляет перенос от предыдущей опера- ции. - 56 - 2.2.6 ADD Сложение Признаки: O D I T S Z A P C * * * * * * . Команда: ADD destination,source . Логика: destination = destination + source . ADD складывает операнды и засылает сумму по назначению (destination). Оба операнда могут быть байтами или словами, и оба операнда могут быть двоичными числами со знаком или без знака. ---------------------------------------------------------------- Операнды Такты Обращения Байты Пример байты (слова) регистр,регистр 3 - 2 ADD BX,SI регистр,непоср.операнд 4 - 3-4 ADD CX,128 аккумулятор,непоср.оп. 4 - 2-3 ADD AL,10 регистр,память 9(13)+EA 1 2-4 ADD DI,[DX] память,регистр 16(24)+EA 2 2-4 ADD BETA,DI память,непоср.операнд 17(25)+EA 2 3-6 ADD GAMMA,16h --------------------------------------------------------------- Примечания: При сложении чисел, занимающих более 16 бит, полезна команда ADC, т.к. она прибавляет перенос от предыдущей опера- ции. 2.2.7 CBW Преобразование байта в слово Признаки не меняются. Команда: CBW. - 57 - Логика: if (AL < 80h) then AH = 0 else AH = FFh . CBW расширяет бит знака регистра AL в регистр AH. Эта ко- манда переводит байтовую величину со знаком в эквивалентное ей слово со знаком. ------------------------------------------------------------ Операнды Такты Обращения Байты Пример нет операндов 2 - 1 CBW ------------------------------------------------------------ Примечания : Эта команда положит AH равным 0FFh, если бит знака регист- ра AL (т.е. седьмой бит) установлен; если же седьмой бит AL не установлен, то в AH заносятся нули. Эта команда полезна для преобразования байта в слово, в первую очередь, с целью выпол- нения операции деления байтов. 2.2.8 CMP Сравнение Признаки: O D I T S Z A P C * * * * * * . Команда: CMP destination,source . Логика: Установка признаков в соответствии с результатом. (destination - source) CMP сравнивает два числа, вычитая операнд source из опе- ранда destination, и изменяет значения признаков. CMP не изме- няет сами операнды. Операндами могут быть байты или слова . - 58 - --------------------------------------------------------------- Операнды Такты Обращения Байты Пример байты (слова) регистр,регистр 3 - 2 CMP BX,SI регистр,непоср.операнд 4 - 3-4 CMP CX,128 аккумулятор,непоср.оп. 4 - 2-3 CMP AL,02h регистр,память 9(13)+EA 1 2-4 CMP DI,[DX] память,регистр 9(13)+EA 1 2-4 CMP BETA,DI память,непоср.операнд 10(14)+EA 1 3-6 CMP GAMMA,16h --------------------------------------------------------------- 2.2.9 CWD Преобразование слова в двойное слово Признаки не меняются. Команда: CWD . Логика: if (AX < 8000h) then DX = 0 else DX = FFFFh . CWD расширяет бит знака регистра AX на весь регистр DX. Эта команда генерирует двойное слово, эквивалентное числу со знаком, находящемуся в регистре AX. -------------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 5 - 1 CWD -------------------------------------------------------------- Примечания: Эта команда положит DX равным 0FFFFh, если бит знака (15-ый бит) регистра AX установлен, и равным 0, если бит знака AX сброшен. - 59 - 2.2.10 DAA Десятичная коррекция при сложении Признаки: O D I T S Z A P C ? * * * * * Команда: DAA . Логика: if (AL & 0Fh) > 9 or (AF = 1) then AL = AL + 6 AF = 1 else AF = 0 if (AL > 9Fh) or (CF = 1) then AL = AL + 60h CF = 1 else CF = 0 . Команда DAA корректирует результат предшествующего ей сло- жения двух упакованных десятичных операндов (заметьте, что ре- зультат должен находиться в AL). Эта команда изменяет содержи- мое AL так, чтобы AL содержал пару упакованных десятичных цифр. -------------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 4 - 1 DAA -------------------------------------------------------------- Примечания: В упакованном двоично-десятичном коде каждому полубайту соответствует одна цифра; менее значащую цифру содержит младший полубайт. После деления или умножения чисел, записанных в упа- кованном двоично-десятичном коде, производить коррекцию нельзя. Поэтому, если Вы хотите воспользоваться операцией деления или умножения, то лучше использовать числа в неупакованном двоично- десятичном коде. См., например, описание команды AAM (ASCII-коррекция при умножении). 2.2.11 DAS десятичная коррекция при вычитании Признаки: O D I T S Z A P C ? * * * * * . - 60 - Команда: DAS . Логика: if (AL & 0Fh) > 9 or (AF = 1) then AL = AL - 6 AF = 1 else AF = 0 if (AL > 9Fh) or (CF = 1) then AL = AL - 60h CF = 1 else CF = 0 . Команда DAS корректирует результат предшествующего ей вы- читания двух упакованных десятичных операндов (заметьте, что результат должен находиться в AL). Эта команда изменяет содер- жимое AL так, чтобы AL содержал пару упакованных десятичных цифр. -------------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 4 - 1 DAS -------------------------------------------------------------- Примечания: В упакованном двоично-десятичном коде каждому полубайту соответствует одна цифра; менее значащую цифру содержит младший полубайт. После деления или умножения чисел, записанных в упа- кованном двоично-десятичном коде, производить коррекцию нельзя. Поэтому, если Вы хотите воспользоваться операцией деления или умножения, то лучше использовать числа в неупакованном двоично- десятичном коде. См., например, описание команды AAM (ASCII-коррекция при умножении). 2.2.12 DEC Декремент Признаки: O D I T S Z A P C * * * * * * . Команда: DEC destination. Логика: destination = destination - 1 - 61 - Эта команда отнимает от операнда destination единицу. Опе- ранд destination, который может быть словом или байтом, интерп- ретируется как двоичное число без знака. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример байт(слово) регистр16 2 1 DEC BX регистр8 3 2 DEC BL память 15(23)+EA 2 2-4 DEC MATRIX[SI] ------------------------------------------------------------- Примечания : При выполнении этой команды признак переноса CF не изменя- ется, поэтому если Вы хотите декрементировать число, записанное несколькими словами, то лучше воспользоваться командами SUB и SBB. 2.2.13 DIV Деление без учета знака Признаки: O D I T S Z A P C ? ? ? ? ? ? . Команда: DIV source . Логика: AL = AX / source ;операнд source - байт AH = remainder or AX = DX:AX / source ;операнд source - слово DX = remainder . Эта команда выполняет деление без учета знака. Если опе- ранд source является байтом, то DIV делит значение слова в AX на операнд source, засылая частное в AL и остаток (remainder) в AH. Если же операнд source является словом, то DIV делит значе- ние двойного слова из DX:AX на операнд source, засылая частное в AX и остаток в DX. - 62 - _____________________________________________________________ Операнды Такты Обращения Байты Пример байт(слово) регистр8 0-90 - 2 DIV BL регистр16 4-162 - 2 DIV BX память8 (86-96)+EA 1 2-4 DIV VYUP память16 (154-172)+EA 1 2-4 DIV NCONQUER[SI] ______________________________________________________________ Примечания: Если результат слишком велик и не умещается в AL (соотв. AX), то генерируется прерывание INT 0 (деление на ноль), и тог- да частное с остатком не определены. Когда генерируется преры- вание INT 0, то для процессоров 80286 и 80386 запоминаемое зна- чение CS:IP указывает на неудавшуюся команду (т.е. на команду DIV). Для процессоров 8088/8086 CS:IP указывает, однако, на ко- манду, следующую за неудавшейся командой DIV. 2.2.14 IDIV Деление с учетом знака Признаки: O D I T S Z A P C ? ? ? ? ? ? . Команда: IDIV source . Логика: AL = AX / source ;операнд source - байт AH = remainder or AX = DX:AX / source ;операнд source - слово DX = remainder . Эта команда выполняет деление с учетом знака. Если операнд source является байтом, то IDIV делит значение слова в AX на операнд source, засылая частное в AL и остаток (remainder) в AH. Если же операнд source является словом, то IDIV делит зна- чение двойного слова из DX:AX на операнд source, засылая част- ное в AX и остаток в DX. - 63 - --------------------------------------------------------------- Операнды Такты Обращения Байты Пример байт(слово) регистр8 101-112 - 2 IDIV CL регистр16 165-184 - 2 IDIV CX память8 (107-118)+EA 1 2-4 IDIV BYTE[SI] память16 (175-194)+EA 1 2-4 IDIV [BX].WORD_ARRAY --------------------------------------------------------------- Примечания: Если результат слишком велик и не умещается в AL (соотв. AX), то генерируется прерывание INT 0 (деление на ноль), и тог- да частное с остатком не определены. Микропроцессоры 80286 и 80386 могут в качестве частного после выполнения этой команды генерировать наибольшее (по абсолютной величине) негативное число (80h или 8000h), однако, 8088/8086 сгенерируют в такой ситуации прерывание INT 0. Когда генерируется прерывание INT 0, то для процессоров 80286 и 80386 запоминаемое значение CS:IP указывает на неудавшуюся команду (т.е. на команду IDIV). Для процессоров 8088/8086 CS:IP указывает, однако, на команду, сле- дующую за неудавшейся командой IDIV. 2.2.15 IMUL Умножение с учетом знака Признаки: O D I T S Z A P C * ? ? ? ? * . Команда: IMUL source . Логика: AX = AL * source ;операнд source - байт or DX:AX = AX * source ;операнд source - слово. Эта команда выполняет умножение с учетом знака. Если опе- ранд source является байтом, то IMUL умножает операнд source на AL, засылая произведение в AX. Если же операнд source является словом, то IMUL умножает операнд source на AX, засылая произве- дение в DX:AX. Признаки переноса и переполнения CF и OF уста- - 64 - навливаются (=1), если старшая половина результата (т.е. AH для случая, когда source - байт, и DX, когда source - слово) содер- жит какую-либо значащую цифру произведения, иначе они сбрасыва- ются (=0). ------------------------------------------------------------- Операнды Такты Обращения Байты Пример байт(слово) регистр8 80-98 - 2 IMUL CL регистр16 128-154 - 2 IMUL BX память8 (86-104)+EA 1 2-4 IMUL BYTE память16 (138-164)+EA 1 2-4 IMUL WORD[BP][DI] ------------------------------------------------------------- 2.2.16 INC Инкремент Признаки: O D I T S Z A P C * * * * * . Команда: INC destination . Логика: destination = destination + 1 . Эта команда прибавляет к операнду destination единицу. Операнд destination, который может быть словом или байтом, ин- терпретируется как двоичное число без знака. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример байт(слово) регистр16 2 1 INC BX регистр8 3 2 INC BL память 15(23)+EA 2 2-4 INC MATRIX[SI] ------------------------------------------------------------- Примечания : При выполнении этой команды признак переноса CF не изменя- ется, поэтому если Вы хотите инкрементировать число, записанное несколькими словами, то лучше воспользоваться командами ADD и - 65 - ADC. 2.2.17 MUL Умножение без учета знака Признаки: O D I T S Z A P C * ? ? ? ? * . Команда: MUL source . Логика: AX = AL * source ;операнд source - байт or DX:AX = AX * source ;операнд source - слово . Эта команда выполняет умножение без учета знака. Если опе- ранд source является байтом, то MUL умножает операнд source на AL, засылая произведение в AX. Если же операнд source является словом, то MUL умножает операнд source на AX, засылая произве- дение в DX:AX. Признаки переноса и переполнения CF и OF уста- навливаются (=1), если старшая половина результата (т.е. AH для случая, когда source - байт, и DX, когда source - слово) содер- жит какую-либо значащую цифру произведения, иначе они сбрасыва- ются (=0). ----------------------------------------------------------- Операнды Такты Обращения Байты Пример байт(слово) регистр,8 70-77 - 2 MUL CH регистр,16 118-133 - 2 MUL BX память,8 (76-83)+EA 1 2-4 MUL A_BYTE память,16 (128-143)+EA 1 2-4 MUL A_WORD ----------------------------------------------------------- 2.2.18 NEG Получение дополнительного кода Признаки: O D I T S Z A P C * * * * * * . Команда: NEG destination . - 66 - Логика: destination = -destination; дополнительный код. Команда NEG вычитает операнд destinstion из 0 и засылает результат обратно в destination. Эта команда является реализа- цией выполнения операции нахождения дополнительного кода опе- ранда. Операндом может быть как байт, так и слово. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример байты(слова) регистр 3 - 2 NEG DL память 16(24)+EA 2 2-4 NEG COEFFICIENT ------------------------------------------------------------- Примечания: Если операнд равен нулю, то признак переноса CF сбрасыва- ется (=0); во всех остальных случаях он устанавливается (=1). Попытка применения операции NEG к байту -128 или слову -32,768 не приводит к изменению операнда, а только устанавливает приз- нак переполнения (OF=1). 2.2.19 SBB Вычитание с заемом Признаки: O D I T S Z A P C * * * * * * . Команда: SBB destination,source. Логика: destination = destination - source - CF. Команда SBB вычитает операнд source из операнда destination, вычитает 1 из результата, если признак переноса установлен (т.е. если CF = 1), и засылает результат по адресу destination. Оба операнда могут быть байтами или словами, и оба операнда могут быть двоичными числами со знаком или без знака. - 67 - ------------------------------------------------------------- Операнды Такты Обращения Байты Пример байты (слова) регистр,регистр 3 - 2 SBB DX,AX регистр,непоср.операнд 4 - 3-4 SBB BH,4 аккумулятор,непоср.оп. 4 - 2-3 SBB AX,8 регистр,память 9(13)+EA 1 2-4 SBB DX,FEE память,регистр 16(24)+EA 2 2-4 SBB SIGH,SI память,непоср.операнд 17(25)+EA 2 3-6 SBB TOTAL,10 ------------------------------------------------------------- Примечания: Команда SBB полезна для вычитания чисел, которые длиннее 16 битов, поскольку она вычитает заем (находящийся в CF) от предыдущего вычитания. Вы можете вычитать непосредственный операнд размером в байт из операнда destination, даже если он размером в слово; в этом случае перед вычитанием байт растягивается до 16 битов, занося в новые биты значение бита знака. 2.2.20 SUB Вычитание Признаки: O D I T S Z A P C * * * * * * . Команда: SUB destination,source . Логика: destination = destination - source. Команда SUB вычитает операнд source из операнда destination и засылает результат по адресу destination. Оба операнда могут быть байтами или словами, и оба операнда могут быть двоичными числами со знаком или без знака. - 68 - ------------------------------------------------------------ Операнды Такты Обращения Байты Пример байты (слова) регистр,регистр 3 - 2 SUB DX,BX регистр,непоср.операнд 4 - 3-4 SUB DX,5280 аккумулятор,непоср.оп. 4 - 2-3 SUB AH,25 регистр,память 9(13)+EA 1 2-4 SUB DX,TOTAL память,регистр 16(24)+EA 2 2-4 SUB RATE,CL память,непоср.операнд 17(25)+EA 2 3-6 SUB TOTAL,10 ------------------------------------------------------------ Примечания: Если Вы хотите произвести вычитание чисел,которые длиннее 16 битов, то Вы можете воспользоваться командой SBB, которая вычитает также заем от предыдущего вычитания. Вы можете вычитать непосредственный операнд размером в байт из операнда destination, даже если он размером в слово; в этом случае перед вычитанием байт растягивается до 16 битов, занося в новые биты значение бита знака. 2.3 Логические операции 2.3.1 AND Логическое умножение Признаки: O D I T S Z A P C 0 * * ? * 0 . Команда: AND destination,source . Логика: destination = destination AND source . AND выполняет логическое умножение побитно над своими опе- рандами и засылает результат по назначению (destination). Оба операнда могут быть словами или байтами. - 69 - Логика команды AND Destination Source Результат 0 0 0 0 1 0 1 0 0 1 1 1 Команда AND устанавливает каждый бит результата в 1, если соответствующие биты операндов равны 1. -------------------------------------------------------------- Операнды Такты Обращения Байты Пример байты (слова) регистр,регистр 3 - 2 AND AL,DL регистр,непоср.операнд 4 - 3-4 AND CX,0FFh аккумулятор,непоср.оп. 4 - 2-3 AND AX,01000010b регистр,память 9(13)+EA 1 2-4 AND CX,MASK память,регистр 16(24)+EA 2 2-4 AND VALUE,BL память,непоср.операнд 17(25)+EA 2 3-6 AND GAMMA,01h -------------------------------------------------------------- 2.3.2 NOT Логическое отрицание Признаки не меняются . Команда: NOT destination . Логика: destination = NOT(destination); обратный код . Логика команды NOT destination результат 0 1 1 0 - 70 - ------------------------------------------------------------ Операнды Такты Обращения Байты Пример байты(слова) регистр 3 - 2 NOT DX память 16(24)+EA 2 2-4 NOT MASK ------------------------------------------------------------ 2.3.3 OR Логическое сложение Признаки: O D I T S Z A P C 0 * * ? * 0 . Команда: OR destination,source. Логика: destination = destination OR source . OR выполняет логическое сложение побитно над своими опе- рандами и засылает результат по назначению (destination). Оба операнда могут быть словами или байтами. Логика команды OR Destination Source Результат 0 0 0 0 1 1 1 0 1 1 1 1 Команда OR устанавливает каждый бит результата в 1, если хотя бы один из соответствующих битов операндов равен 1. --------------------------------------------------------------- Операнды Такты Обращения Байты Пример байты (слова) регистр,регистр 3 - 2 OR CH,DL регистр,непоср.операнд 4 - 3-4 OR CX,00FFh аккумулятор,непоср.оп. 4 - 2-3 OR AL,01000010b регистр,память 9(13)+EA 1 2-4 OR CX,MASK память,регистр 16(24)+EA 2 2-4 OR MASK,CX память,непоср.операнд 17(25)+EA 2 3-6 OR GAMMA,01h --------------------------------------------------------------- - 71 - 2.3.4 RCL Циклический сдвиг влево через CF Признаки: O D I T S Z A P C * * . Команда: RCL destination,count. Команда RCL сдвигает слово или байт, находящийся по адресу destination, влево на число битовых позиций, определяемое вто- рым операндом, COUNT. Бит, который выскакивает за левый предел операнда destination, заносится в признак переноса CF, а старое значение CF осуществляет ротацию, в том смысле, что оно зано- сится в освободившийся крайний правый бит операнда destination. Число таких "битовых ротаций" определяется операндом COUNT. Ес- ли COUNT не равен 1, то признак переполнения OF не определен. Если же COUNT равен 1, тогда в OF заносится результат выполне- ния операции исключающего или, примененной к 2 старшим битам исходного значения операнда destination. ------------------------------------------------------------ Операнды Такты Обращения Байты Пример байт(слово) регистр, 1 2 - 2 RCL CX,1 регистр, CL 8 + 4/бит - 2 RCL BL,CL память, 1 15(23) + EA 2 2-4 RCL MULTIPL,1 память, CL 20(28)+EA+4/бит 2 2-4 RCL MOVE_AR,CL ------------------------------------------------------------ Примечания: В качестве операнда COUNT берется обычно значение в ре- гистре CL. Если, однако, Вы хотите осуществить сдвиг лишь на одну позицию, то замените второй операнд (CL) на число 1, как показано выше в первом примере. Микропроцессоры 80286 и 80386 ограничивают значение COUNT числом 31. Если COUNT больше, чем 31, то эти микропроцессоры используют COUNT MOD 32, чтобы получить новый COUNT в пределах 0-31. Эта верхняя граница имеет своей целью сократить тот пери- од времени, на который будет задерживаться ответ на прерывание - 72 - из-за ожидания конца выполнения команды. Несколько команд RCL, использующих 1 в качестве второго операнда, выполняются быстрее и требуют меньшего об'ема памяти, чем одна команда RCL, использующая CL в качестве операнда COUNT. Признак переполнения не определен, если операнд COUNT больше 1. 2.3.5 RCR Циклический сдвиг вправо через CF Признаки: O D I T S Z A P C * * . Команда: RCR destination,count . Команда RCR сдвигает слово или байт, находящийся по адресу destination, вправо на число битовых позиций, определяемое вто- рым операндом, COUNT. Бит, который выскакивает за правый предел операнда destination, заносится в признак переноса CF, а старое значение CF осуществляет ротацию, в том смысле, что оно зано- сится в освободившийся крайний левый бит операнда destination. Число таких "битовых ротаций" определяется операндом COUNT. Если COUNT не равен 1, то признак переполнения OF не опре- делен. Если же COUNT равен 1, тогда в OF заносится результат выполнения операции исключающего или, примененной к 2 старшим битам результата. ------------------------------------------------------------ Операнды Такты Обращения Байты Пример байт(слово) регистр, 1 2 - 2 RCR CX,1 регистр, CL 8 + 4/бит - 2 RCR DL,CL память, 1 15(23) + EA 2 2-4 RCR DIVIDE,1 память, CL 20(28)+EA+4/бит 2 2-4 RCR MOVE_AR,CL ------------------------------------------------------------ Примечания: В качестве операнда COUNT берется обычно значение в ре- гистре CL. Если, однако, Вы хотите осуществить сдвиг лишь на одну позицию, то замените второй операнд (CL) на число 1, как - 73 - показано выше в первом примере. Микропроцессоры 80286 и 80386 ограничивают значение COUNT числом 31. Если COUNT больше, чем 31, то эти микропроцессоры используют COUNT MOD 32, чтобы получить новый COUNT в пределах 0-31. Эта верхняя граница имеет своей целью сократить тот пери- од времени, на который будет задерживаться ответ на прерывание из-за ожидания конца выполнения команды. Несколько команд RCR, использующих 1 в качестве второго операнда, выполняются быстрее и требуют меньшего об'ема памяти, чем одна команда RCR, использующая CL в качестве операнда COUNT. Признак переполнения не определен, если операнд COUNT больше 1. 2.3.6 ROL Циклический сдвиг влево Признаки: O D I T S Z A P C * * . Команда: ROL destination,count. Команда ROL сдвигает слово или байт, находящийся по адресу destination, влево на число битовых позиций, определяемое вто- рым операндом, COUNT. Бит, который выскакивает за левый предел операнда destination, заносится в него снова с правого края. Значение CF совпадает со значением бита, который последним был вытеснен за левый край операнда. Если COUNT не равен 1, то признак переполнения OF не опре- делен. Если же COUNT равен 1, тогда в OF заносится результат выполнения операции исключающего или, примененной к 2 старшим битам исходного значения операнда destination. - 74 - ----------------------------------------------------------- Операнды Такты Обращения Байты Пример байт(слово) регистр, 1 2 - 2 ROL DI,1 регистр, CL 8 + 4/бит - 2 ROL BX,CL память, 1 15(23) + EA 2 2-4 ROL BYTE,1 память, CL 20(28)+EA+4/бит 2 2-4 ROL WORD,CL ----------------------------------------------------------- Примечания: В качестве операнда COUNT берется обычно значение в ре- гистре CL. Если, однако, Вы хотите осуществить сдвиг лишь на одну позицию, то замените второй операнд (CL) на число 1, как показано выше в первом примере. Микропроцессоры 80286 и 80386 ограничивают значение COUNT числом 31. Если COUNT больше, чем 31, то эти микропроцессоры используют COUNT MOD 32, чтобы получить новый COUNT в пределах 0-31. Эта верхняя граница имеет своей целью сократить тот пери- од времени, на который будет задерживаться ответ на прерывание из-за ожидания конца выполнения команды. Несколько команд ROL, использующих 1 в качестве второго операнда, выполняются быстрее и требуют меньшего об'ема памяти, чем одна команда ROL, использующая CL в качестве операнда COUNT. Признак переполнения не определен, если операнд COUNT больше 1. 2.3.7 ROR Циклический сдвиг вправо Признаки: O D I T S Z A P C * * . Команда: ROR destination,count . Команда ROR сдвигает слово или байт, находящийся по адресу destination, вправо на число битовых позиций, определяемое вто- рым операндом, COUNT. Бит, который выскакивает за правый предел операнда destination, заносится в него снова с левого края. - 75 - Значение CF совпадает со значением бита, который последним был вытеснен за правый край операнда. Если COUNT не равен 1, то признак переполнения OF не опре- делен. Если же COUNT равен 1, тогда в OF заносится результат выполнения операции исключающего или, примененной к 2 старшим битам результата. ----------------------------------------------------------- Операнды Такты Обращения Байты Пример байт(слово) регистр, 1 2 - 2 ROR BL,1 регистр, CL 8 + 4/бит - 2 ROR AX,CL память, 1 15(23) + EA 2 2-4 ROR WORD,1 память, CL 20(28)+EA+4/бит 2 2-4 ROR BYTE,CL ----------------------------------------------------------- Примечания: В качестве операнда COUNT берется обычно значение в ре- гистре CL. Если, однако, Вы хотите осуществить сдвиг лишь на одну позицию, то замените второй операнд (CL) на число 1, как показано выше в первом примере. Микропроцессоры 80286 и 80386 ограничивают значение COUNT числом 31. Если COUNT больше, чем 31, то эти микропроцессоры используют COUNT MOD 32, чтобы получить новый COUNT в пределах 0-31. Эта верхняя граница имеет своей целью сократить тот пери- од времени, на который будет задерживаться ответ на прерывание из-за ожидания конца выполнения команды. Несколько команд ROR, использующих 1 в качестве второго операнда, выполняются быстрее и требуют меньшего об'ема памяти, чем одна команда ROR, использующая CL в качестве операнда COUNT. Признак переполнения не определен, если операнд COUNT больше 1. 2.3.8 SAL Арифметический сдвиг влево Признаки: O D I T S Z A P C * * * ? * * . - 76 - Команда: SAL destination,count . Команда SAL сдвигает слово или байт, находящийся по адресу destination, влево на число битовых позиций, определяемое вто- рым операндом, COUNT. По мере вытеснения битов за левый край операнда destination, справа в освободившиеся биты заносятся нули. Значение CF совпадает со значением бита, который послед- ним был вытеснен за левый край операнда. Если COUNT не равен 1, то признак переполнения OF не опре- делен. Если же COUNT равен 1, тогда OF=0, если 2 старших бита исходного значения операнда destination совпадали, иначе OF=1. ---------------------------------------------------------- Операнды Такты Обращения Байты Пример байт(слово) регистр, 1 2 - 2 SAL AL,1 регистр, CL 8 + 4/бит - 2 SAL SI,CL память, 1 15(23) + EA 2 2-4 SAL WORD,1 память, CL 20(28)+EA+4/бит 2 2-4 SAL BYTE,CL ---------------------------------------------------------- Примечания: В качестве операнда COUNT берется обычно значение в ре- гистре CL. Если, однако, Вы хотите осуществить сдвиг лишь на одну позицию, то замените второй операнд (CL) на число 1, как показано выше в первом примере. Микропроцессоры 80286 и 80386 ограничивают значение COUNT числом 31. Если COUNT больше, чем 31, то эти микропроцессоры используют COUNT MOD 32, чтобы получить новый COUNT в пределах 0-31. Эта верхняя граница имеет своей целью сократить тот пери- од времени, на который будет задерживаться ответ на прерывание из-за ожидания конца выполнения команды. Несколько команд SAL, использующих 1 в качестве второго операнда, выполняются быстрее и требуют меньшего об'ема памяти, чем одна команда SAL, использующая CL в качестве операнда COUNT. Признак переполнения не определен, если операнд COUNT больше 1. Команда SHL, логический сдвиг влево, - это та же команда, - 77 - что и SAL. 2.3.9 SAR Арифметический сдвиг вправо Признаки: O D I T S Z A P C * * * ? * * . Команда: SAR destination,count . Команда SAR сдвигает слово или байт, находящийся по адресу destination, вправо на число битовых позиций, определяемое вто- рым операндом, COUNT. По мере вытеснения битов за правый край операнда destination, слева в освободившиеся биты заносятся би- ты, совпадающие с битом знака исходного значения операнда destination. Значение CF совпадает со значением бита, который последним был вытеснен за правый край операнда. Если COUNT не равен 1, то признак переполнения OF не опре- делен. Если же COUNT равен 1, то OF=0. ---------------------------------------------------------- Операнды Такты Обращения Байты Пример байт(слово) регистр, 1 2 - 2 SAR DX,1 регистр, CL 8 + 4/бит - 2 SAR DI,CL память, 1 15(23) + EA 2 2-4 SAR WORD,1 память, CL 20(28)+EA+4/бит 2 2-4 SAR BYTE,CL ---------------------------------------------------------- Примечания: В качестве операнда COUNT берется обычно значение в ре- гистре CL. Если, однако, Вы хотите осуществить сдвиг лишь на одну позицию, то замените второй операнд (CL) на число 1, как показано выше в первом примере. Микропроцессоры 80286 и 80386 ограничивают значение COUNT числом 31. Если COUNT больше, чем 31, то эти микропроцессоры используют COUNT MOD 32, чтобы получить новый COUNT в пределах 0-31. Эта верхняя граница имеет своей целью сократить тот пери- од времени, на который будет задерживаться ответ на прерывание из-за ожидания конца выполнения команды. - 78 - Несколько команд SAR, использующих 1 в качестве второго операнда, выполняются быстрее и требуют меньшего об'ема памяти, чем одна команда SAR, использующая CL в качестве операнда COUNT. Признак переполнения не определен, если операнд COUNT больше 1. 2.3.10 SHL Логический сдвиг влево Признаки: O D I T S Z A P C * * * ? * * . Команда: SHL destination,count . Команда SHL сдвигает слово или байт, находящийся по адресу destination, влево на число битовых позиций, определяемое вто- рым операндом, COUNT. По мере вытеснения битов за левый край операнда destination, справа в освободившиеся биты заносятся нули. Значение CF совпадает со значением бита, который послед- ним был вытеснен за левый край операнда. Если COUNT не равен 1, то признак переполнения OF не опре- делен. Если же COUNT равен 1, тогда OF=0, если 2 старших бита исходного значения операнда destination совпадали, иначе OF=1. ----------------------------------------------------------- Операнды Такты Обращения Байты Пример байт(слово) регистр, 1 2 - 2 SHL AL,1 регистр, CL 8 + 4/бит - 2 SHL SI,CL память, 1 15(23) + EA 2 2-4 SHL WORD,1 память, CL 20(28)+EA+4/бит 2 2-4 SHL BYTE,CL ----------------------------------------------------------- Примечания: В качестве операнда COUNT берется обычно значение в ре- гистре CL. Если, однако, Вы хотите осуществить сдвиг лишь на одну позицию, то замените второй операнд (CL) на число 1, как показано выше в первом примере. Микропроцессоры 80286 и 80386 ограничивают значение COUNT числом 31. Если COUNT больше, чем 31, то эти микропроцессоры - 79 - используют COUNT MOD 32, чтобы получить новый COUNT в пределах 0-31. Эта верхняя граница имеет своей целью сократить тот пери- од времени, на который будет задерживаться ответ на прерывание из-за ожидания конца выполнения команды. Несколько команд SHL, использующих 1 в качестве второго операнда, выполняются быстрее и требуют меньшего об'ема памяти, чем одна команда SHL, использующая CL в качестве операнда COUNT. Признак переполнения не определен, если операнд COUNT больше 1. Команда SAL, арифметический сдвиг влево, - это та же ко- манда, что и SHL. 2.3.11 SHR Логический сдвиг вправо Признаки: O D I T S Z A P C * * * ? * * . Команда: SHR destination,count Команда SHR сдвигает слово или байт, находящийся по адресу destination, вправо на число битовых позиций, определяемое вто- рым операндом, COUNT, или содержимым CL, если второй операнд опущен. По мере вытеснения битов за правый край операнда destination, слева в освободившиеся биты заносятся нули. Если бит знака сохраняет свое значение, то признак переполнения OF равен 0, иначе он равен 1. Значение CF совпадает со значением бита, который последним был вытеснен за правый край операнда. Если COUNT не равен 1, то признак переполнения OF не опре- делен. Если же COUNT равен 1, то OF равен значению старшего би- та исходного операнда. --------------------------------------------------------------- Операнды Такты Обращения Байты Пример регистр, 1 2 - 2 SHR SI,1 регистр, CL 8 + 4/бит - 2 SHR SI,CL память, 1 15 + EA 2 2-4 SHR ID_BYTE[SI][BX],1 память, CL 20 + EA + 4/бит 2 2-4 SHR INPUT_WORD,CL --------------------------------------------------------------- - 80 - Примечания: В качестве операнда COUNT берется обычно значение в ре- гистре CL. Если, однако, Вы хотите осуществить сдвиг лишь на одну позицию, то замените второй операнд (CL) на число 1, как показано выше в первом примере. Микропроцессоры 80286 и 80386 ограничивают значение COUNT числом 31. Если COUNT больше, чем 31, то эти микропроцессоры используют COUNT MOD 32, чтобы получить новый COUNT в пределах 0-31. Эта верхняя граница имеет своей целью сократить тот пери- од времени, на который будет задерживаться ответ на прерывание из-за ожидания конца выполнения команды. Несколько команд SHR, использующих 1 в качестве второго операнда, выполняются быстрее и требуют меньшего об'ема памяти, чем одна команда SHR, использующая CL в качестве операнда COUNT. Признак переполнения не определен, если операнд COUNT больше 1. 2.3.12 TEST Тест Признаки: O D I T S Z A P C 0 * * ? * 0 . Команда: TEST destination,source . Логика: (destination AND source); Только изменение признаков CF = 0 OF = 0 . Команда TEST выполняет операцию AND над своими операндами и меняет значения признаков. Сами операнды не изменяются. --------------------------------------------------------------- Операнды Такты Обращения Байты Пример байты (слова) регистр,регистр 3 - 2 TEST AL,DL регистр,непоср.операнд 5 - 3-4 TEST CX,0FFh аккумулятор,непоср.оп. 4 - 2-3 TEST AX,01000010b регистр,память 9(13)+EA 1 2-4 TEST CX,MASK память,непоср.операнд 11+EA - 3-6 TEST GAMMA,01h --------------------------------------------------------------- - 81 - Команда TEST полезна при проверке значения конкретного би- та. Например, следующий кусок программы передает управление в ONE_FIVE_OFF, если биты 1 и 5 регистра AL сброшены. Значения остальных битов во внимание не принимаются. TEST AL,00100010b ;Маскируем все биты, кроме 1 и 5 JZ ONE_FIVE_OFF ;Если хотя бы один установлен, ;то ZF=1 NOT_BOTH: . . ONE_FIVE_OFF: . ;Биты 1 и 5 сброшены . . 2.3.13 XOR Исключающее ИЛИ Признаки: O D I T S Z A P C 0 * * * * 0 . Команда: XOR destination,source . Логика: destination = destination XOR source . XOR выполняет операцию исключающего или побитно над своими операндами и засылает результат по назначению (destination). Оба операнда могут быть словами или байтами. Логика команды XOR Destination Source Результат 0 0 0 0 1 1 1 0 1 1 1 0 Команда XOR устанавливает каждый бит результата в 1, если в точности один из соответствующих битов операндов равен 1. - 82 - -------------------------------------------------------------- Операнды Такты Обращения Байты Пример байты (слова) регистр,регистр 3 - 2 XOR CX,BX регистр,непоср.операнд 4 - 3-4 XOR SI,00C2h аккумулятор,непоср.оп. 4 - 2-3 XOR AL,01000010b регистр,память 9(13)+EA 1 2-4 XOR CL,MASK память,регистр 16(24)+EA 2 2-4 XOR MASK,DX память,непоср.операнд 17(25)+EA 2 3-6 XOR GAMMA,01h -------------------------------------------------------------- 2.4. Обработка блоков данных 2.4.1 CMPS Сравнение строк Признаки: O D I T S Z A P C * * * * * * . Команда: CMPS destination-string,source_string . Логика: CMP (DS:SI), (ES:DI) ; только устанавливает признаки if DF = 0 SI = SI + n ; n = 1 для байта, 2 для слова DI = DI + n else SI = SI - n DI = DI - n . Эта команда сравнивает два значения, вычитая байт или сло- во, на которое указывает ES:DI, из байта или слова, на которое указывает DS:SI, и устанавливает признаки в соответствии с ре- зультатами сравнения. Сами операнды не изменяются. После срав- нения, SI и DI увеличиваются на 1 (для байтов) или 2 (для слов), если признак направления сброшен, или уменьшаются на 1 или 2, если признак направления установлен. Тем самым подготав- ливаются к сравнению следующие элементы обеих строк. - 83 - --------------------------------------------------------------- Операнды Такты Обращения Байты Пример байты (слова) dest,source 22(30) 2 1 CMPS STR1,STR2 (повтор) dest,source 9+22(30)/rep 2/rep 1 REPE CMPS STR1,STR2 --------------------------------------------------------------- Примечания: Эта команда всегда переводится ассемблером или в CMPSB, сравнение строк из байтов, или в CMPSW, сравнение строк из слов, в зависимости от того, являются ли операнды строками из байтов или из слов. В обоих случаях Вы должны в явном виде заг- рузить в регистры SI и DI смещения обеих строк. Пусть имеют место следующие определения : buffer1 db 100 dup (?) buffer2 db 100 dup (?) . Тогда следующий пример выполняет сравнение элементов строк BUFFER1 и BUFFER2 до первого их несовпадения (mismatch) : cld ;сканируя в прямом направлении mov cx, 100 ;100 байтов (CX используется ; в REPE), lea si, buffer1 ;начиная с 1го элемента BUFFER1 lea di, buffer2 ;и с 1го элемента BUFFER2, repe cmps buffer1,buffer2;сравниваем их. jne mismatch ;признак ZF = 0, если сравниваемые ;строки не совпадают (mismatch) match: . ;если мы попали сюда, значит, они . ;совпадают (match) . mismatch: . dec si ;если мы попали сюда, то мы нашли dec di ;несовпадение, и возвращаем указатели . ;SI и DI обратно, чтобы они указывали . ;на первые несовпадающие элементы. После выхода из цикла REPE CMPS признак ZF будет сбро- шен,если несовпадение было найдено, и установлен в противопо- - 84 - ложном случае. Если несовпадение было найдено, то DI и SI будут указывать на байты, следующие непосредственно за байтами, кото- рые не совпали; DEC DI и DEC SI уменьшают значения в этих ре- гистрах таким образом, чтобы они указывали на сами несовпадаю- щие байты. 2.4.2 CMPSB Сравнение строк из байтов Признаки: O D I T S Z A P C * * * * * * . Команда: CMPSB. Логика: CMP (DS:SI), (ES:DI) ; только устанавливает признаки if DF = 0 SI = SI + 1 DI = DI + 1 else SI = SI - 1 DI = DI - 1 . Эта команда сравнивает два значения, вычитая байт, на ко- торый указывает ES:DI, из байта, на который указывает DS:SI, и устанавливает признаки в соответствии с результатами сравнения. Сами операнды не изменяются. После сравнения, SI и DI увеличи- ваются на 1, если признак направления сброшен, или уменьшаются на 1, если признак направления установлен. Тем самым подготав- ливаются к сравнению следующие элементы обеих строк. ---------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 22 2 1 CMPSB (повтор) 9+22/rep 2/rep 1 REPE CMPSB ---------------------------------------------------------- - 85 - Пусть имеют место следующие определения : buffer1 db 100 dup (?) buffer2 db 100 dup (?) . Тогда следующий пример выполняет сравнение элементов строк BUFFER1 и BUFFER2 до первого их несовпадения (mismatch) : cld ;сканируя в прямом направлении mov cx, 100 ;100 байтов (CX используется в REPE), lea si, buffer1 ;начиная с 1го элемента BUFFER1 lea di, buffer2 ;и с 1го элемента BUFFER2, repe cmpsb ;сравниваем их. jne mismatch ;признак ZF = 0, если сравниваемые ;строки не совпадают (mismatch) match: . ;если мы попали сюда, значит, они . ;совпадают (match) . mismatch: . dec si ;если мы попали сюда, то мы нашли dec di ;несовпадение, и возвращаем указатели . ;SI и DI обратно, чтобы они указывали . ;на первые несовпадающие байты. После выхода из цикла REPE CMPSB признак ZF будет сброшен, если несовпадение было найдено, и установлен в противоположном случае. Если несовпадение было найдено, то DI и SI будут указы- вать на байты, следующие непосредственно за байтами, которые не совпали; DEC DI и DEC SI уменьшают значения в этих регистрах таким образом, чтобы они указывали на сами несовпадающие байты. 2.4.3 CMPSW Сравнение строк из слов Признаки: O D I T S Z A P C * * * * * * . Команда: CMPSW . - 86 - Логика: CMP (DS:SI), (ES:DI) ; только устанавливает признаки if DF = 0 SI = SI + 2 DI = DI + 2 else SI = SI - 2 DI = DI - 2 . Эта команда сравнивает два значения, вычитая слово, на ко- торое указывает ES:DI, из слова, на которое указывает DS:SI, и устанавливает признаки в соответствии с результатами сравнения. Сами операнды не изменяются. После сравнения, SI и DI увеличи- ваются на 2, если признак направления сброшен, или уменьшаются на 2, если признак направления установлен. Тем самым подготав- ливаются к сравнению следующие элементы обеих строк. ---------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 30 2 1 CMPSW (повтор) 9+30/rep 2/rep 1 REPE CMPSW ---------------------------------------------------------- Пусть имеют место следующие определения : buffer1 dw 50 dup (?) buffer2 dw 50 dup (?) Тогда следующий пример выполняет сравнение элементов строк BUFFER1 и BUFFER2 до первого их несовпадения (mismatch) : cld ;сканируя в прямом направлении mov cx, 50 ;50 слов (CX используется в REPE), lea si, buffer1 ;начиная с 1го элемента BUFFER1 lea di, buffer2 ;и с 1го элемента BUFFER2, repe cmpsw ;сравниваем их. jne mismatch ;признак ZF = 0, если сравниваемые ;строки не совпадают (mismatch) match: . ;если мы попали сюда, значит, они . ;совпадают (match) . mismatch: . dec si ;если мы попали сюда, то мы нашли dec si ;несовпадение, и возвращаем указатели - 87 - dec di ;SI и DI обратно, чтобы они указывали dec di ;на первые несовпадающие слова. После выхода из цикла REPE CMPSW признак ZF будет сброшен, если несовпадение было найдено, и установлен в противоположном случае. Если несовпадение было найдено, то DI и SI будут указы- вать на слова (по два байта), следующие непосредственно за сло- вами, которые не совпали; пары команд DEC DI и DEC SI уменьшают значения в этих регистрах таким образом, чтобы они указывали на сами несовпадающие слова. 2.4.4 LODS Загрузка строки (из байтов или слов) Признаки не меняются. Команда: LODS source-str . Логика: Accumulator = (DS:SI) if DF = 0 SI = SI + n ; n = 1 для байта, 2 - для слова else SI = SI - n . Команда LODS передает байт или слово, расположенное по ад- ресу DS:SI в AX или AL, а также инкрементирует или декременти- рует SI (в зависимости от состояния признака направления DF), чтобы указатель переместился на следующий элемент. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример байты (слова) source-str 12(16) - 1 LODS LIST (повтор) source-str 9+13(17)/rep 1/rep 1 REP LODS LIST ------------------------------------------------------------- Примечания: Эта команда всегда ассемблируется или как LODSB, загрузка строки из байтов, или как LODSW, загрузка строки из слов, в за- - 88 - висимости от того, указывает ли source-str на строку байтов или на строку слов. Однако, в обоих случаях Вы должны в явном виде загрузить в регистр SI смещение строки. Хотя и разрешется использовать эту команду в повторном ре- жиме, это почти никогда не делается, т.к. это привело бы к пос- тоянному изменению значения в AL. Следующий пример иллюстрирует пересылку восьми байтов иэ INIT_PORT в порт 250. (Не пробуйте делать этого на вашей маши- не, если Вы не знаете о назначении порта 250.) INIT_PORT: DB '$CMD0000' ;Строка, которую мы хотим переслать . . CLD ;Будем передвигаться в прямом ;направлении LEA SI,INIT_PORT ;Засылаем в SI стартовый адрес ;строки MOV CX,8 ;CX является счетчиком ;для команды LOOP AGAIN: LODS INIT_PORT ;В имени INIT_PORT ассемблер OUT 250,AL ;нуждается только для того, чтобы ; определить, имеет ли он дело LOOP AGAIN ; с байтами или со словами 2.4.5 LODSB Загрузка строки из байтов Признаки не меняются . Команда: LODSB . Логика: AL = (DS:SI) if DF = 0 SI = SI + 1 else SI = SI - 1 . - 89 - Команда LODSB передает байт, расположенный по адресу DS:SI в AL, а также инкрементирует или декрементирует SI (в зависи- мости от состояния признака направления DF), чтобы указатель переместился на следующий байт строки. ------------------------------------------------------------ Операнды Такты Обращения Байты Пример нет операндов 12 - 1 LODSB (повтор) 9+13/rep 1/rep 1 REP LODSB ------------------------------------------------------------ Примечания: Хотя и разрешется использовать эту команду в повторном ре- жиме, это почти никогда не делается, т.к. это привело бы к пос- тоянному изменению значения в AL. Следующий пример иллюстрирует пересылку восьми байтов из INIT_PORT в порт 250. (Не пробуйте делать этого на вашей маши- не, если Вы не знаете о назначении порта 250.) INIT_PORT: DB '$CMD0000' ;Строка, которую мы хотим . ;переслать . CLD ;Будем передвигаться ;в прямом направлении LEA SI,INIT_PORT ;Засылаем в SI стартовый ;адрес строки MOV CX,8 ;CX является счетчиком ;для команды LOOP AGAIN: LODSB ;Загружаем байт в AL... OUT 250,AL ; ...и высылаем его в порт LOOP AGAIN 2.4.6 LODSW Загрузка строки из слов Признаки не меняются . Команда: LODSW . Логика: AX = (DS:SI) if DF = 0 SI = SI + 2 else SI = SI - 2 . - 90 - Команда LODSW передает слово, расположенное по адресу DS:SI в AX, а также инкрементирует или декрементирует SI (в за- висимости от состояния признака направления DF), чтобы указа- тель переместился на следующее слово строки. ------------------------------------------------------------ Операнды Такты Обращения Байты Пример нет операндов 16 - 1 LODSW (повтор) 9+17/rep 1/rep 1 REP LODSW ------------------------------------------------------------ Примечания: Хотя и разрешется использовать эту команду в повторном ре- жиме, это почти никогда не делается, т.к. это привело бы к постоянному изменению значения в AX. Следующий пример иллюстрирует пересылку восьми байтов иэ INIT_PORT в порт 250. (Не пробуйте делать этого на вашей маши- не, если Вы не знаете о назначении порта 250.) INIT_PORT: DB '$CMD0000' ;Строка, которую мы хотим ;переслать . CLD ;Будем передвигаться в прямом ;направлении LEA SI,INIT_PORT ;Засылаем в SI стартовый ;адрес строки MOV CX,4 ;Будем пересылать 4 слова ;(8 байтов) AGAIN: LODSW ;Загружаем слово в AX... OUT 250,AX ; ...и высылаем его в порт LOOP AGAIN 2.4.7 MOVS Пересылка строки (из байтов или слов) Признаки не меняются . Команда: MOVS destination,source . - 91 - Логика: (ES:DI) = (DS:SI) if DF = 0 SI = SI + n ; n = 1 для байта, 2 - для слова DI = DI + n else SI = SI - n DI = DI - n . Эта команда пересылает байт или слово, расположенное по адресу DS:SI, по адресу ES:DI. После пересылки SI и DI инкре- ментируются (если признак направления сброшен) или декременти- руются (если признак направления установлен),чтобы указатель переместился на следующий элемент строки. ---------------------------------------------------------------- Операнды Такты Обращения Байты Пример байты (слова) dest,source 18(26) 2 1 MOVS WD_BF,INPUT (повтор) dest,source 9+17(25)/rep 2/rep 1 REP MOVS W,I ---------------------------------------------------------------- Примечания: Эта команда всегда ассемблируется или как MOVSB, пересылка строки из байтов, или как MOVSW, пересылка строки из слов, в зависимости от того, является ли source ссылкой на строку из байтов или строку из слов. В обоих случаях Вы должны в явном виде загрузить в регистры SI и DI смещения строк source и destination. Пример. Предположим, что строка BUFFER1 была где-то в программе описана следующим образом: BUFFER1 DB 100 DUP (?) Тогда следующий пример описывает пересылку 100 байтов из BUFFER1 в BUFFER2: CLD ;Двигаемся в прямом направлении LEA SI,BUFFER1 ;Адрес исходной строки засылаем в SI LEA DI,BUFFER2 ;Адрес строки назначения засылаем в DI - 92 - MOV CX,100 ;CX используем в префиксе REP REP MOVS BUFFER1,BUFFER2;Производим пересылку 2.4.8 MOVSB Пересылка строки из байтов Признаки не меняются . Команда: MOVSB . Логика: (ES:DI) = (DS:SI) if DF = 0 SI = SI + 1 DI = DI + 1 else SI = SI - 1 DI = DI - 1 . Эта команда пересылает байт, расположенный по адресу DS:SI, по адресу ES:DI. После пересылки SI и DI инкрементируют- ся (если признак направления сброшен) или декрементируются (ес- ли признак направления установлен),чтобы указатель переместился на следующий байт. -------------------------------------------------------------- Операнды Такты Обращения Байты Пример байты(слова) нет операндов 18 2 1 MOVSB (повтор) 9+17/rep 2/rep 1 REP MOVSB -------------------------------------------------------------- Пример. Предположим, что строка BUFFER1 была где-то в программе описана следующим образом: BUFFER1 DB 100 DUP (?) Тогда следующий пример описывает пересылку 100 байтов из BUFFER1 в BUFFER2: CLD ;Двигаемся в прямом направлении LEA SI,BUFFER1 ;Адрес исходной строки засылаем в SI LEA DI,BUFFER2 ;Адрес строки назначения засылаем в DI - 93 - MOV CX,100 ;CX используем в префиксе REP REP MOVSB ;Производим пересылку 2.4.9 MOVSW Пересылка строки из слов Признаки не меняются . Команда: MOVSW . Логика: (ES:DI) = (DS:SI) if DF = 0 SI = SI + 2 DI = DI + 2 else SI = SI - 2 DI = DI - 2 . Эта команда пересылает слово, расположенное по адресу DS:SI, по адресу ES:DI. После пересылки SI и DI инкрементируют- ся (если признак направления сброшен) или декрементируются (ес- ли признак направления установлен),чтобы указатель переместился на следующее слово. -------------------------------------------------------------- Операнды Такты Обращения Байты Пример байты(слова) нет операндов 26 2 1 MOVSW (повтор) 9+25/rep 2/rep 1 REP MOVSW -------------------------------------------------------------- Пример. Предположим, что строка BUFFER1 была где-то в программе описана следующим образом: BUFFER1 DB 100 DUP (?) . Тогда следующий пример описывает пересылку 50 слов (100 байтов) из BUFFER1 в BUFFER2: CLD ;Двигаемся в прямом направлении LEA SI,BUFFER1 ;Адрес исходной строки засылаем в SI LEA DI,BUFFER2 ;Адрес строки назначения засылаем в DI - 94 - MOV CX,50 ;CX используем в префиксе REP ; пересылаем 50 слов REP MOVSW ;Производим пересылку 2.4.10 REP Повтор Признаки не меняются . Команда: REP КОС (команда обработки строк) . Логика: while CX <> 0 ; для КОС MOVS, LODS или STOS выполнить КОС CX = CX - 1 ___________________________________________________ while CX <> 0 ; для КОС CMPS или SCAS CX = CX - 1 if ZF = 0 то заканчиваем цикл REP - это префикс, который может быть употреблен перед лю- бой КОС (CMPS, LODS, MOVS, SCAS и STOS). Префикс REP заставляет выполняться следующую за ним КОС в повторном режиме до тех пор, пока CX не станет равным 0; CX уменьшается на 1 после каждого выполнения КОС. (Для КОС CMPS и SCAS циклический повтор преры- вается также, если признак нулевого результата ZF оказывается сброшенным после очередного выполнения КОС.) ------------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 2 - 1 REP MOVS TO,FROM ------------------------------------------------------------- Примечания: Если CX с самого начала равно 0, то КОС не выполняется ни разу. Проверка о равенстве CX нулю проводится перед выполнением КОС. Проверка о равенстве ZF нулю проводится только для команд CMPS и SCAS, причем лишь после очередного выполнения КОС. Префиксы REP, REPE (повтор пока равно) и REPZ (повтор пока ноль) - все являются синонимами одного и того же префикса. Префикс REPNZ (повтор пока не ноль) похож на REP и отлича- - 95 - ется лишь тем, что для команд CMPS и SCAS повтор прекращается, когда ZF установлен, а не когда сброшен (как в REP). Префикс REP используется обычно с КОС MOVS (пересылка строки) и STOS (запись строки), его можно интерпретировать как "повторяй, пока не кончится строка". У Вас нет необходимости инициализировать ZF перед исполь- зованием повторяющихся КОС. Повторяющаяся КОС, которая была прервана между повторами, будет корректно возобновлена после возврата из прерывания. Од- нако, если перед КОС находятся также другие префиксы (например, LOCK) в добавление к REP, то все префиксы, кроме того, который непосредственно предшествует команде, будут потеряны. Поэтому, если Вам нужно использовать команду с несколькими префиксами одновременно, то Вам следует запретить прерывания на время вы- полнения команды (и снова разрешить из после ее выполнения). Обратите Ваше внимание на то, что даже такая мера предосторож- ности не предохраняет от немаскированных прерываний и что обра- ботка длинных строк может существенно задерживать обработку прерываний. Следующий пример иллюстрирует пересылку 100 байтов из BUFFER1 в BUFFER2 : CLD ;двигаться будем в прямом направлении LEA SI, BUFFER1 ;засылаем в SI и DI стартовые адреса LEA DI, BUFFER2 ;строк (исходной и назначения) MOV CX, 100 ;префикс REP использует CX как счетчик REP MOVSB ;осуществляем пересылку 2.4.11 REPE Повторять пока равно Признаки не меняются . Команда: REPE . Эта команда является синонимом REP. Смотрите описание REP. - 96 - 2.4.12 REPNE Повторять пока не равно Признаки не меняются. Команда: REPNE КОС (команда обработки строк). Логика: while CX <> 0 ; для КОС MOVS, LODS или STOS выполнить КОС CX = CX - 1 _______________________________________________ while CX <> 0 ; для КОС CMPS или SCAS CX = CX - 1 if ZF <> 0 то заканчиваем цикл ; это единственное ; отличие от REP REPNE - это префикс, который может быть употреблен перед любой КОС (CMPS, LODS, MOVS, SCAS и STOS). Префикс REPNE зас- тавляет выполняться следующую за ним КОС в повторном режиме до тех пор, пока CX не станет равным 0; CX уменьшается на 1 после каждого выполнения КОС. (Для КОС CMPS и SCAS циклический повтор прерывается также, если признак нулевого результата ZF оказыва- ется установленным после очередного выполнения КОС. Ср. с пре- фиксом REP, при котором циклический повтор прерывается, если ZF оказывается, наоборот, сброшенным.) ------------------------------------------------------------ Операнды Такты Обращения Байты Пример нет операндов 2 - 1 REPNE SCASB ------------------------------------------------------------ Примечания: Если CX с самого начала равно 0, то КОС не выполняется ни разу. Проверка о равенстве CX нулю проводится перед выполнением КОС. Проверка о равенстве ZF единице проводится только для ко- манд CMPS и SCAS, причем лишь после очередного выполнения КОС. Префиксы REPNE и REPNZ являются синонимами одного и того же префикса. У Вас нет необходимости инициализировать ZF перед исполь- зованием повторяющихся КОС. - 97 - Повторяющаяся КОС, которая была прервана между повторами, будет корректно возобновлена после возврата из прерывания. Од- нако, если перед КОС находятся также другие префиксы (например, LOCK) в добавление к REPNE, то все префиксы, кроме того, кото- рый непосредственно предшествует команде, будут потеряны. Поэ- тому, если Вам нужно использовать команду с несколькими префик- сами одновременно, то Вам следует запретить прерывания на время выполнения команды (и снова разрешить из после ее выполнения). Обратите Ваше внимание на то, что даже такая мера предосторож- ности не предохраняет от немаскированных прерываний и что обра- ботка длинных строк может существенно задерживать обработку прерываний. Следующий пример иллюстрирует поиск первого байта, равного 'A' в стобайтовой строке STRING : CLD ;будем двигаться в прямом направлении MOV AL,'A' ;будем сравнивать с 'A' LEA DI, STRING ;засылаем в DI стартовый адрес строки MOV CX,100 ;сравнивать будем 100 байтов REPNE SCASB ;сравниваем 'A' с очередным байтом DEC DI ;возвращаем указатель DI на 'A' После окончания выполнения команды REPNE SCASB, CX будет равен нулю, если байтовое значение 'A' не было обнаружено в строке STRING, и CX будет больше 0, в противном случае. 2.4.13 REPNZ Повторять пока не ноль Признаки не меняются. Команда: REPNZ . Эта команда является синонимом REPNE. Смотрите описание REPNE. - 98 - 2.4.14 SCAS Просмотр строки (из байтов или слов) Признаки: O D I T S Z A P C * * * * * * . Команда: SCAS destination-string . Логика: CMP Accumulator,(ES:DI) ; только устанавливает признаки if DF = 0 DI = DI + n ; n = 1 для байта, 2 для слова else DI = DI - n . Эта команда сравнивает аккумулятор (AL или AX) с байтом или словом, на которое указывает ES:DI, и устанавливает призна- ки в соответствии с результатами сравнения. Сами операнды не изменяются. После сравнения, DI увеличивается на 1 (для байтов) или 2 (для слов), если признак направления сброшен, или умень- шается на 1 или 2, если признак направления установлен. Тем са- мым подготавливается к сравнению следующий элемент строки. -------------------------------------------------------------- Операнды Такты Обращения Байты Пример байты(слова) dest-str 15(19) 1 1 SCAS WORD_TABLE dest-str 9+15(19)/rep 1/rep 1 REPNE SCAS BYTE_TABLE (повтор) -------------------------------------------------------------- Примечания: Эта команда всегда ассемблируется или как SCASB, просмотр строки из байтов, или как SCASW, просмотр строки из слов, в за- висимости от того, является ли операнд строкой из байтов или из слов. В обоих случаях Вы должны в явном виде загрузить в ре- гистр DI смещение строки. Команда SCAS полезна в тех случаях, когда требуется найти ячейку с заданным байтом или словом. Если Вы хотите сравнить - 99 - две строки из памяти поэлементно, то используйте команду CMPS. ример. Пусть имеет место следующее определение : LOST_A DB 100 dup (?) . Тогда следующий пример описывает поиск символа 'A' в блоке памяти длиной 100 байтов, начинающемся с LOST_A : MOV AX,DS MOV ES,AX ;SCAS использует ES:DI, ;поэтому копируем DS в ES CLD ;сканировать будем в прямом направлении MOV AL,'A' ;ищем "потерянное" 'A' MOV CX,100 ;сканировать будем 100 байтов ;(CX используется в REPNE) LEA DI,LOST_A ;засылаем стартовый адрес в DI REPNE SCAS LOST_A ;ищем 'A' JE FOUND ;признак ZF равен 1, если мы нашли 'A' NOTFOUND: . ;если мы попали сюда, то 'A' не обнаружено . . FOUND:DEC DI ;возвращаем указатель DI на первое . ;обнаруженное вхождение 'A' . После выхода из цикла REPNE SCAS, ZF=1, если вхождение 'A' было обнаружено, и ZF=0, иначе. В первом случае DI указыва- ет на байт, следующий за байтом, где находится 'A', поэтому мы производим коррекцию указателя DI с помощью DEC DI. 2.4.15 SCASB Просмотр строки из байтов Признаки: O D I T S Z A P C * * * * * * . Команда: SCASB . - 100 - Логика: CMP AL, (ES:DI) ;только устанавливает признаки if DF = 0 DI = DI + 1 else DI = DI - 1 . Эта команда сравнивает AL с байтом на который указывает ES:DI, и устанавливает признаки в соответствии с результатами сравнения. Сами операнды не изменяются. После сравнения, DI увеличивается на 1, если признак направления сброшен, или уменьшается на 1, если признак направления установлен. Тем са- мым подготавливается к сравнению следующий байт. ------------------------------------------------------------ Операнды Такты Обращения Байты Пример нет операндов 15 1 1 SCASB (повтор) 9+15/rep 1/rep 1 REPNE SCASB ------------------------------------------------------------ Примечание : Команда SCASB полезна в тех случаях, когда требуется найти ячейку с заданным байтом. Если Вы хотите срав- нить две строки из памяти поэлементно, то используйте команду CMPSB. Пример. Пусть имеет место следующее определение : LOST_A DB 100 dup (?) . Тогда следующий пример описывает поиск символа 'A' в блоке памяти длиной 100 байтов, начинающемся с LOST_A : MOV AX,DS MOV ES,AX ;SCASB использует ES:DI, ;поэтому копируем DS в ES CLD ;сканировать будем в прямом направлении MOV AL,'A' ;ищем "потерянное" 'A' MOV CX,100 ;сканировать будем 100 байтов ;(CX используется в REPNE) LEA DI,LOST_A ;засылаем стартовый адрес в DI REPNE SCASB ;ищем 'A' JE FOUND ;признак ZF равен 1, если мы нашли 'A' - 101 - NOTFOUND: . ;если мы попали сюда, . ;то 'A' не обнаружено . FOUND:DEC DI ;возвращаем указатель DI на первое . ;обнаруженное вхождение 'A' . После выхода из цикла REPNE SCASB, ZF=1, если вхождение 'A' было обнаружено, и ZF=0, иначе. В первом случае DI указыва- ет на байт, следующий за байтом, где находится 'A', поэтому мы производим коррекцию указателя DI с помощью DEC DI. 2.4.16 SCASW просмотр строки из слов Признаки: O D I T S Z A P C * * * * * * . Команда: SCASW . Логика: CMP AX, (ES:DI) ;только устанавливает признаки if DF = 0 DI = DI + 2 else DI = DI - 2 . Эта команда сравнивает AX со словом на которое указывает ES:DI, и устанавливает признаки в соответствии с результатами сравнения. Сами операнды не изменяются. После сравнения, DI увеличивается на 2, если признак направления сброшен, или уменьшается на 2, если признак направления установлен. Тем са- мым подготавливается к сравнению следующее слово. ------------------------------------------------------------ Операнды Такты Обращения Байты Пример нет операндов 19 1 1 SCASW (повтор) 9+19/rep 1/rep 1 REPNE SCASW ------------------------------------------------------------ Примечания: Команда SCASW полезна в тех случаях, когда требуется найти - 102 - ячейку с заданным словом. Если Вы хотите сравнить две строки из памяти поэлементно, то используйте команду CMPSW. Пример. Пусть имеет место следующее определение : LOST_A DB 100 dup (?) . Тогда следующий пример описывает поиск символа 'A' в блоке памяти длиной 100 байтов, начинающемся с LOST_A : MOV AX,DS MOV ES,AX ;SCASW использует ES:DI, ;поэтому копируем DS в ES CLD ;сканировать будем в прямом направлении MOV AL,'A' ;ищем "потерянное" 'A' MOV CX,50 ;сканировать будем 50 слов ;(CX используется в REPNE) LEA DI,LOST_A ;засылаем стартовый адрес в DI REPNE SCASW ;ищем 'A' JE FOUND ;признак ZF равен 1, если мы нашли 'A' NOTFOUND: . ;если мы попали сюда, . ;то 'A' не обнаружено . FOUND:DEC DI ;возвращаем указатель DI ;на первое обнаруженное DEC DI ;вхождение 'A' . . После выхода из цикла REPNE SCASW, ZF=1, если вхождение 'A' было обнаружено, и ZF=0, иначе. В первом случае DI указыва- ет на слово, следующее за словом, где находится 'A', поэтому мы производим коррекцию указателя DI с помощью двух DEC DI. 2.4.17 STOS Запись в строку (из байтов или слов) Признаки не меняются. Команда: STOS destination-string. - 103 - Логика: (ES:DI) = Accumulator if DF = 0 DI = DI + n ; n = 1 для байта, 2 - для слова else DI = DI - n . Команда STOS копирует байт или слово, расположенное в AL или AX, в место памяти, на которое указывает (ES:DI), а также инкрементирует или декрементирует DI (в зависимости от состоя- ния признака направления DF), чтобы подготовиться к копированию аккумулятора в следующую ячейку (байт или слово) памяти. -------------------------------------------------------------- Операнды Такты Обращения Байты Пример байты(слова) dest-str 11(15) 1 1 STOS WORD_ARRAY dest-str 9+10(14)/rep 1/rep 1 REP STOS WORD_ARRAY (повтор) -------------------------------------------------------------- Примечания: Эта команда всегда ассемблируется или как STOSB, запись в строку из байтов, или как STOSW, запись в строку из слов, в за- висимости от того, указывает ли destination-string на строку байтов или на строку слов. Однако, в обоих случаях Вы должны в явном виде загрузить в регистр DI смещение строки. Пример. Если команду записи в строку использовать в сочетании с префиксом REP, то такая команда будет полезна для инициализации блока памяти; следующий пример иллюстрирует инициализацию сто- байтового блока памяти, расположенного по адресу BUFFER, в 0 : MOV AL,0 ;значение,которое присваиваем ;при инициализации LEA DI,BUFFER ;загружаем стартовый адрес блока памяти MOV CX,100 ;размер блока памяти CLD ;будем двигаться в прямом направлении REP STOS BUFFER ;сравните эту строку с ПРИМЕРом для STOSB - 104 - 2.4.18 STOSB Запись в строку из байтов Признаки не меняются. Команда: STOSB логика: (ES:DI) = AL if DF = 0 DI = DI + 1 else DI = DI - 1 . Команда STOSB копирует байт, расположенный в AL, в место памяти, на которое указывает ES:DI, а также инкрементирует или декрементирует DI (в зависимости от состояния признака направ- ления DF), чтобы подготовиться к копированию AL в следующий байт памяти. ------------------------------------------------------------ Операнды Такты Обращения Байты Пример нет операндов 11 1 1 STOSB (повтор) 9+10/rep 1/rep 1 REP STOSB ------------------------------------------------------------ Пример. Если команду записи в строку использовать в сочетании с префиксом REP, то такая команда будет полезна для инициализации блока памяти; следующий пример иллюстрирует инициализацию сто- байтового блока памяти, расположенного по адресу BUFFER, в 0 : MOV AL,0 ;значение,которое присваиваем ;при инициализации LEA DI,BUFFER ;загружаем стартовый адрес блока памяти MOV CX,100 ;размер блока памяти CLD ;будем двигаться в прямом направлении REP STOSB ;сравните эту строку с ПРИМЕРом для STOS 2.4.19 STOSW Запись в строку из слов Признаки не меняются. Команда: STOSW. - 105 - логика: (ES:DI) = AX if DF = 0 DI = DI + 2 else DI = DI - 2 . Команда STOSW копирует слово, расположенное в AX, в место памяти, на которое указывает ES:DI, а также инкрементирует или декрементирует DI (в зависимости от состояния признака направ- ления DF), чтобы подготовиться к копированию AX в следующее слово памяти. ------------------------------------------------------------ Операнды Такты Обращения Байты Пример нет операндов 15 1 1 STOSW (повтор) 9+14/rep 1/rep 1 REP STOSW ------------------------------------------------------------ Пример. Если команду записи в строку использовать в сочетании с префиксом REP, то такая команда будет полезна для инициализации блока памяти; следующий пример иллюстрирует инициализацию сто- байтового блока памяти, расположенного по адресу BUFFER, в 0 : MOV AL,0 ;значение,которое присваиваем ;при инициализации LEA DI,BUFFER ;загружаем стартовый адрес блока памяти MOV CX,50 ;размер блока памяти (в словах) CLD ;будем двигаться в прямом направлении REP STOSW ;сравните эту строку с ПРИМЕРом для STOS 2.5 Команды передачи управления 2.5.1 CALL Вызов подпрограммы Признаки не меняются. Команда: CALL procedure_name . - 106 - Логика: if FAR CALL (внешний сегмент) PUSH CS CS = dest_seg PUSH IP IP = dest_offset . CALL передает управление подпрограмме, которая может нахо- диться как внутри текущего сегмента (NEAR-proc), так и вне его (FAR-proc). Этим двум типам CALL соответствуют две различные машинные команды, и команда RET возврата из подпрограммы должна соответствовать типу команды CALL (потенциальная возможность несоответствия возникает, когда подпрограмма и команда CALL ас- семблируются раздельно). --------------------------------------------------------------- Операнды Такты Обращения Байты Пример байты (слова) near-proc 19(23) 1 3 CALL NEAR_PROC far-proc 28(36) 2 5 CALL FAR_PROC память-указатель16 21(29)+EA 2 2-4 CALL PROC[SI] регистр-указатель16 16(24) 1 2 CALL AX память-указатель32 37(57)+EA 4 2-4 CALL [BX].ROUTINE --------------------------------------------------------------- Примечания: Если подпрограмма находится в другом сегменте, то процес- сор засылает в стек сначала текущее значение CS, затем текущее значение IP (IP указывает на команду, следующую за командой CALL), а затем передает управление в подпрограмму. Если же подпрограмма находится в том же сегменте, то процессор засылает в стек сначала текущее значение IP (которое опять же указывает на команду, следующую за командой CALL), а затем передает уп- равление в подпрограмму. CALL также может считать адрес подп- рограммы из регистра или из памяти. Эта форма команды CALL на- зывается косвенным вызовом. - 107 - 2.5.2 JMP Безусловный переход Признаки не меняются . Команда: JMP target . Условие перехода: переход осуществляется всегда. Команда JMP всегда передает управление в место, определяе- мое операндом target. В отличие от команды CALL, JMP не запоми- нает значение IP, т.к. появление команды возврата RET не ожида- ется. Переход внутри сегмента может быть задан как операндом типа память, так и через 16-битный регистр. Переход во внешний сегмент может быть задан только через операнд типа память. --------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 15 - 2 JMP ROPE_NEAR near-label 15 - 3 JMP SAME_SEGMENT far-label 15 - 5 JMP FAR_LABEL пам.-указатель16 18 + EA - 2-4 JMP SAME_SEG рег.-указатель16 11 - 2 JMP BX пам.-указатель32 24 + EA - 2-4 JMP NEXT_SEG --------------------------------------------------------------- Примечания: Если ассемблер может определить, что в случае перехода внутри сегмента цель перехода находится в пределах 127 байтов от места расположения текущей команды, то ассемблер автомати- чески сгенерирует двухбайтовую команду (короткий переход); в противном случае сгенерируется трехбайтовый NEAR JMP. В целях генерации двухбайтовой команды Вы можете сделать "подсказку" ассемблеру, используя специальный оператор "short" : JMP short near_by - 108 - 2.5.3 RET Возврат из подпрограммы Признаки не меняются . Команда: RET optional-pop-value . Логика: POP IP if FAR RETURN (внешний сегмент) POP CS SP = SP + optional-pop-value (если оно имеется) . Команда RET передает управление из вызванной подпрограммы команде, следовавшей непосредственно за CALL, и делает это сле- дующим образом : - пересылает слово из верхушки стека в IP; - если возврат осуществляется во внешний сегмент, то пересылает слово из новой верхушки стека в CS; - увеличивает SP на значение операнда optional-pop-value, если оно задано. Ассемблер сгенерирует возврат во внутренний сегмент, если подпрограмма, содержащая RET, будет обозначена программистом как NEAR, и возврат во внешний сегмент, - если как FAR. Операнд optional-pop-value определяет значение, которое надо прибавить к SP, что имеет смысл "освобождения" стека от "лишних" байтов (например, от входных параметров, когда они передаются подпрог- рамме через стек). ----------------------------------------------------------- Операнды Такты Обращения Байты Пример (внутр.сегм.,без pop) 20 1 1 RET (внутр.сегм., с pop) 24 1 3 RET 4 (внешн.сегм.,без pop) 32 2 1 RET (внешн.сегм., с pop) 31 2 3 RET 2 ----------------------------------------------------------- - 109 - 2.6. Команды условного перехода 2.6.1 JA Переход если выше Признаки не меняются . Команда: JA short-label . Условие перехода: Jump if CF = 0 and ZF = 0 . Команда JA используется после команд CMP и SUB и передает управление по метке short-label, если первый операнд (который должен быть числом без знака) был больше, чем второй операнд (также без знака). Цель перехода должна лежать в пределах от -128 до 127 байтов от следующей команды. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 16 или 4 - 2 JA ABOVE ------------------------------------------------------------- Примечания: Команда JNBE, переход если не ниже и не равно, - это та же команда, что и JA. Команду JA, переход если выше, следует использовать при сравнении чисел без знака. Команду JG, переход если больше, следует использовать при сравнении чисел со знаком. 2.6.2 JAE Переход если выше или равно Признаки не меняются . Команда: JAE short-label . Условие перехода: Jump if CF = 0 Команда JAE используется после команд CMP или SUB и пере- дает управление по метке short-label, если первый операнд был - 110 - больше или равен второму. (Оба операнда рассматриваются как числа без знака.) Цель перехода должна лежать в пределах от -128 до 127 байтов от следующей команды. ------------------------------------------------------------ Операнды Такты Обращения Байты Пример short-label 16 или 4 - 2 JAE ABOVE_EQUAL ------------------------------------------------------------ Примечания: Команда JNB, переход если не ниже, - это та же команда, что и JAE. Команду JAE, переход если выше или равно, следует исполь- зовать при сравнении чисел без знака. Команду JGE, переход если больше или равно, следует ис- пользовать при сравнении чисел со знаком. 2.6.3 JB Переход если ниже Признаки не меняются. Команда: JB short-label. Условие перехода: Jump if CF = 1 . Команда JB используется после команд CMP и SUB и передает управление по метке short-label, если первый операнд был мень- ше, чем второй. (Оба операнда рассматриваются как числа без знака.) Цель перехода должна лежать в пределах от -128 до 127 байтов от следующей команды. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 16 или 4 - 2 JB BELOW ------------------------------------------------------------- Примечания: Команды JC (переход если перенос), JB и JNAE (переход если не выше и не равно) все являются синонимами одной и той же ко- манды. - 111 - Команду JB, переход если ниже, следует использовать при сравнении чисел без знака. Команду JL, переход если меньше, следует использовать при сравнении чисел со знаком. 2.6.4 JBE Переход если ниже или равно Признаки не меняются. Команда: JBE short-label. Условие перехода: Jump if CF = 1 or ZF = 1 . Команда JBE используется после команд CMP и SUB и передает управление по метке short-label, если первый операнд был меньше или равен второму. (Оба операнда рассматриваются как числа без знака.) Цель перехода должна лежать в пределах от -128 до 127 байтов от следующей команды. -------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 16 или 4 - 2 JBE NOT_ABOVE -------------------------------------------------------------- Примечания: Команда JNA, переход если не выше, - это та же команда, что и JBE. Команду JBE, переход если ниже или равно, следует исполь- зовать при сравнении чисел без знака. Команду JLE, переход если меньше или равно, следует ис- пользовать при сравнении чисел со знаком. 2.6.5 JC Переход если перенос Признаки не меняются . Команда: JC short-label . Условие перехода: Jump if CF = 1 . - 112 - Команда JC передает управление по метке short-label, если признак переноса CF установлен (т.е. =1). Цель перехода должна лежать в пределах от -128 до 127 байтов от следующей команды. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 16 или 4 - 2 JС CARRY_SET ------------------------------------------------------------- Примечания: Команды JB (переход если ниже), JC и JNAE (переход если не выше и не равно) все являются синонимами одной и той же коман- ды. Пользуйтесь командой JNC, переход если нет переноса, для перехода в том случае, когда признак переноса CF сброшен (т.е. =0). 2.6.6 JCXZ Переход если CX = 0 Признаки не меняются . Команда: JCXZ short-label . Условие перехода: Jump if CX = 0 . Команда JCXZ передает управление по метке short-label, ес- ли регистр CX равен 0. Цель перехода должна лежать в пределах от -128 до 127 байтов от следующей команды. -------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 18 или 6 - 2 JСXZ COUNT_DOWN -------------------------------------------------------------- Примечание: Эта команда обычно применяется в начале цикла, чтобы пропустить тело цикла, когда переменная счетчика (CX) равна нулю. - 113 - 2.6.7 JE Переход если равно Признаки не меняются . Команда: JE short-label. Условие перехода: Jump if ZF = 1 . Команда JE используется после команд CMP и SUB и передает управление по метке short-label, если первый операнд был равен второму. Цель перехода должна лежать в пределах от -128 до 127 байтов от следующей команды. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 16 или 4 - 2 JE ZERO ------------------------------------------------------------- Примечания: Команда JZ, переход если ноль, - это та же команда, что и JE. 2.6.8 JG Переход если больше Признаки не меняются. Команда: JG short-label . Условие перехода: Jump if ZF = 0 and SF = OF . Команда JG используется после команд CMP или SUB и переда- ет управление по метке short-label, если первый операнд был больше, чем второй. (Оба операнда рассматриваются как числа со знаком.) Цель перехода должна лежать в пределах от -128 до 127 байтов от следующей команды. - 114 - -------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 16 или 4 - 2 JG GREATER -------------------------------------------------------------- Примечания: Команда JNLE, переход если не меньше и не равно, - это та же команда, что и JG. Команду JA, переход если выше, следует использовать при сравнении чисел без знака. Команду JG, переход если больше, следует использовать при сравнении чисел со знаком. 2.6.9 JGE Переход если больше или равно Признаки не меняются . Команда: JGE short-label . Условие перехода: Jump if SF = OF . Команда JGE используется после команд CMP или SUB и пере- дает управление по метке short-label, если первый операнд был больше или равен второму. (Оба операнда рассматриваются как числа со знаком.) Цель перехода должна лежать в пределах от -128 до 127 байтов от следующей команды. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 16 или 4 - 2 JGE GREATER_EQUAL ------------------------------------------------------------- Примечания: Команда JNL, переход если не меньше, - это та же команда, что и JGE. Команду JAE, переход если выше или равно, следует исполь- зовать при сравнении чисел без знака. Команду JGE, переход если больше или равно, следует ис- пользовать при сравнении чисел со знаком. - 115 - 2.6.10 JL Переход если меньше Признаки не меняются. Команда: JL short-label . Условие перехода: Jump if SF <> OF . Команда JL используется после команд CMP или SUB и переда- ет управление по метке short-label, если первый операнд был меньше, чем второй. (Оба операнда рассматриваются как числа со знаком.) Цель перехода должна лежать в пределах от -128 до 127 байтов от следующей команды. -------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 16 или 4 - 2 JL LESS -------------------------------------------------------------- Примечания: Команда JNGE, переход если не больше и не равно, - это та же команда, что и JL. Команду JB, переход если ниже, следует использовать при сравнении чисел без знака. Команду JL, переход если меньше, следует использовать при сравнении чисел со знаком. 2.6.11 JLE Переход если меньше или равно Признаки не меняются . Команда: JLE short-label . Условие перехода: Jump if SF <> OF or ZF = 1 . Команда JLE используется после команд CMP или SUB и пере- дает управление по метке short-label, если первый операнд был меньше или равен второму. (Оба операнда рассматриваются как числа со знаком.) Цель перехода должна лежать в пределах от - 116 - -128 до 127 байтов от следующей команды. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 16 или 4 - 2 JLE NOT_GREATER ------------------------------------------------------------- Примечания: Команда JNG, переход если не больше, - это та же команда, что и JLE. Команду JBE, переход если ниже или равно, следует исполь- зовать при сравнении чисел без знака. Команду JLE, переход если меньше или равно, следует ис- пользовать при сравнении чисел со знаком. 2.6.12 JNA Переход если не выше Признаки не меняются . Команда: JNA short-label . JNA - синоним JBE. См. описание JBE. 2.6.13 JNAE Переход если не выше и не равно Признаки не меняются . Команда: JNAE short-label . JNAE - синоним JB. См. описание JB. 2.6.14 JNB Переход если не ниже Признаки не меняются. Команда: JNB short-label . JNB - синоним JAE. См. описание JAE. - 117 - 2.6.15 JNBE Переход если не ниже и не равно Признаки не меняются. Команда: JNBE short-label . JNBE - синоним JA. См. описание JA. 2.6.16 JNC Переход если нет переноса Признаки не меняются. Команда: JNC short-label . Условие перехода: Jump if CF = 0 . Команда JNC передает управление по метке short-label, если признак переноса CF сброшен (т.е. =0). Цель перехода должна ле- жать в пределах от -128 до 127 байтов от следующей команды. -------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 16 или 4 - 2 JNС CARRY_CLEAR -------------------------------------------------------------- Примечание: Пользуйтесь командой JC, переход если перенос, для перехо- да в том случае, когда признак переноса CF установлен (т.е. =1). 2.6.17 JNE Переход если не равно Признаки не меняются . Команда: JNE short-label . Условие перехода: Jump if ZF = 0 Команда JNE используется после команд CMP и SUB и передает - 118 - управление по метке short-label, если первый операнд не был ра- вен второму. Цель перехода должна лежать в пределах от -128 до 127 байтов от следующей команды. ----------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 16 или 4 - 2 JNE NOT_EQUAL ----------------------------------------------------------------- Примечание: Команда JNZ, переход если не ноль, - это та же команда, что и JNE. 2.6.18 JNG Переход если не больше Признаки не меняются . Команда: JNG short-label . JNG - синоним JLE. См. описание JLE. 2.6.19 JNGE Переход если не больше и не равно Признаки не меняются . JNGE short-label . JNGE - синоним JL. См. описание JL. 2.6.20 JNL Переход если не меньше Признаки не меняются . Команда: JNL short-label . JNL - синоним JGE. См. описание JGE. - 119 - 2.6.21 JNLE переход если не меньше и не равно Признаки не меняются . Команда: JNLE short-label . JNLE - синоним JG. См. описание JG. 2.6.22 JNO Переход если нет переполнения Признаки не меняются. Команда: JNO short-label . Условие перехода: Jump if OF = 0 . Команда JNO передает управление по метке short-label, если признак переполнения OF сброшен (т.е. =0). Цель перехода должна лежать в пределах от -128 до 127 байтов от следующей команды. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 16 или 4 - 2 JNO NO_OVERFLOW ------------------------------------------------------------- Примечание: Пользуйтесь командой JO, переход если переполнение, для перехода в том случае, когда признак переполнения OF установлен (т.е. =1). 2.6.23 JNP Переход если нечетно Признаки не меняются . Команда: JNP short-label . Условие перехода: Jump if PF = 0 . Команда JNP передает управление по метке short-label, если - 120 - признак четности PF сброшен (т.е. =0). Цель перехода должна ле- жать в пределах от -128 до 127 байтов от следующей команды. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 16 или 4 - 2 JNP ODD_PARITY ------------------------------------------------------------- Примечание: Команда JPO, переход если нечетно, - это та же команда, что и JNP. Пользуйтесь командой JP, переход если чет- но, для перехода в том случае, когда признак четности PF уста- новлен (т.е. =1). 2.6.24 JNS Переход если положительный результат Признаки не меняются. Команда: JNS short-label . Условие перехода: Jump if SF = 0 . Команда JNS передает управление по метке short-label, если признак знака SF сброшен (т.е. =0). Цель перехода должна лежать в пределах от -128 до 127 байтов от следующей команды. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 16 или 4 - 2 JNS AQUARIUS ------------------------------------------------------------- Примечание: Пользуйтесь командой JS, переход если отрицательный ре- зультат, для перехода в том случае, когда признак знака SF ус- тановлен (т.е. =1). 2.6.25 JNZ Переход если не ноль Признаки не меняются . Команда: JNZ short-label . - 121 - JNZ - синоним JNE. См. описание JNE. 2.6.26 JO Переход если есть переполнение Признаки не меняются . Команда: JO short-label . Условие перехода: Jump if OF = 1 . Команда JO передает управление по метке short-label, если признак переполнения OF установлен (т.е. =1). Цель перехода должна лежать в пределах от -128 до 127 байтов от следующей ко- манды. -------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 16 или 4 - 2 JO SIGNED_OVERFLOW -------------------------------------------------------------- Примечание: Пользуйтесь командой JNO, переход если нет переполнения, для перехода в том случае, когда признак переполнения OF сбро- шен (т.е. =0). 2.6.27 JP Переход если четно Признаки не меняются . Команда: JP short-label . Условие перехода: Jump if PF = 1 . Команда JP передает управление по метке short-label, если признак четности PF установлен (т.е. =1). Цель перехода должна лежать в пределах от -128 до 127 байтов от следующей команды. - 122 - ------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 16 или 4 - 2 JP EVEN_PARITY ------------------------------------------------------------- Примечание: Команда JPE, переход если четно, - это та же команда, что и JP. Пользуйтесь командой JNP, переход если нечетно, для пере- хода в том случае, когда признак четности PF сброшен (т.е. =0). 2.6.28 JPE Переход если четно Признаки не меняются . Команда: JPE short-label . JPE - синоним JP. См. описание JP. 2.6.29 JPO Переход если нечетно Признаки не меняются . Команда: JPO short-label . JPO - синоним JNP. См. описание JNP. 2.6.30 JS Переход если отрицательный результат Признаки не меняются . Команда: JS short-label . Условие перехода: Jump if SF = 1 . Команда JS передает управление по метке short-label, если признак знака SF установлен (т.е. =1). Цель перехода должна ле- жать в пределах от -128 до 127 байтов от следующей команды. - 123 - ------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 16 или 4 - 2 JS NEGATIVE ------------------------------------------------------------- Примечания: Пользуйтесь командой JNS, переход если положительный ре- зультат, для перехода в том случае, когда признак знака SF сброшен (т.е. =0). 2.6.31 JZ Переход если ноль Признаки не меняются . Команда: JZ short-label . JZ - синоним JE. См. описание JE. 2.6.32 LOOP Переход по счетчику Признаки не меняются . LOOP short-label . логика: CX = CX - 1 if (CX <> 0) JMP short-label . Команда LOOP уменьшает CX на 1, затем передает управление по метке short-label, если CX не равно 0. Операнд short-label должен находиться в пределах от -128 до +127 байтов от следую- щей команды. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 17/5 - 2 LOOP AGAIN ------------------------------------------------------------- - 124 - 2.6.33 LOOPE Переход пока равно Признаки не меняются. Команда: LOOPE short-label . Логика: CX = CX - 1 if (CX <> 0) and (ZF = 1) JMP short-label . Команда LOOPE используется после команд CMP или SUB. Она уменьшает CX на 1, затем передает управление по метке short-label, если CX не равно нулю и если первый операнд команд CMP или SUB был равен второму операнду. Операнд short-label должен находиться в пределах от -128 до +127 байтов от следую- щей команды. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 18 или 6 - 2 LOOPE AGAIN ------------------------------------------------------------- Примечание: Команда LOOPZ, переход пока ноль, - это та же команда, что и LOOPE. 2.6.34 LOOPNE Переход пока не равно Признаки не меняются . Команда: LOOPNE short-label . Логика: CX = CX - 1 if (CX <> 0) and (ZF = 0) JMP short-label . Команда LOOPNE используется после команд CMP или SUB. Она уменьшает CX на 1, затем передает управление по метке short-label, если CX не равно нулю и если первый операнд команд CMP или SUB не равен второму операнду. Операнд short-label дол- - 125 - жен находиться в пределах от -128 до +127 байтов от следующей команды. ------------------------------------------------------------- Операнды Такты Обращения Байты Пример short-label 18 или 6 - 2 LOOPNE AGAIN ------------------------------------------------------------- Примечания: Команда LOOPNZ, переход пока не ноль, - это та же команда, что и LOOPNE. 2.6.35 LOOPNZ Переход пока не ноль Признаки не меняются . Команда: LOOPNZ short-label . LOOPNZ - синоним LOOPNE. См. описание LOOPNE. 2.6.36 LOOPZ Переход пока ноль Признаки не меняются . Команда: LOOPZ short-label . LOOPZ - синоним LOOPE. См. описание LOOPE. 2.7 Команды прерывания 2.7.1 INT Прерывание Признаки: O D I T S Z A P C 0 0 . Команда: INT interrupt-num . - 126 - Логика : PUSHF ;загрузка регистра FLAGS в стек TF = 0 ;сброс разряда трассировки IF = 0 ;запрещаем прерывания CALL FAR (INT*4) ;вызываем обработчик прерываний Команда INT загружает регистр FLAGS в стек, сбрасывает признаки трассировки и разрешения прерывания, загружает CS и IP в стек, затем передает управление обработчику прерываний, кото- рый определяется по значению операнда interrupt-num. Если обра- ботчик прерываний производит возврат по команде IRET, то исход- ное значение регистра FLAGS восстанавливается. ---------------------------------------------------------- Операнды Такты Обращения Байты Пример байт(слово) непоср.8 (тип=3) 52 5 1 INT 3 непоср.8 (тип<>3) 51 5 2 INT 21 ---------------------------------------------------------- Примечания : Регистр FLAGS хранится в том же формате, который использу- ется в команде PUSHF. Адрес вектора прерывания определяется ум- ножением операнда interrupt-num на 4. Первое слово, находящееся по полученному адресу, загружается в IP, а второе слово - в CS. Все номера interrupt-num, кроме типа 3, вырабатывают двухбайто- вый код операции; interrupt-num, равный 3, вырабатывает одно- байтовую команду, называемую прерыванием по контрольной точке (Breakpoint interrupt). 2.7.2 INTO Прерывание по переполнению Признаки: O D I T S Z A P C 0 0 . Команда: INTO. - 127 - Логика: if (OF = 1) PUSHF ;загрузка регистра FLAGS в стек TF = 0 ;сброс разряда трассировки IF = 0 ;запрещаем прерывания CALL FAR (10h) ;вектор прерывания INTO расположен ;по адресу 0000:0010h Команда INTO активизирует прерывание типа 4, если признак переполнения OF равен 1; если OF = 0, то эта команда не выпол- няет никаких действий. Если OF = 1, то прерывание выполняется аналогично команде INT 4; в этом случае INTO загружает регистр FLAGS в стек, сбрасывает признаки трассировки и разрешения пре- рывания, загружает CS и IP в стек, затем передает управление обработчику прерываний, соответствующему типу 4 и на который указывает вектор по адресу 10h. Если обработчик прерываний про- изводит возврат по команде IRET, то исходное значение регистра FLAGS восстанавливается. ---------------------------------------------------------- Операнды Такты Обращения Байты Пример байт(слово) нет операндов 53 или 4 5 1 INTO ----------------------------------------------------------- Примечание : Регистр FLAGS хранится в том же формате, ко- торый используется в команде PUSHF. INTO может быть использован после операции, которая могла бы привести к переполнению, в це- лях вызова подпрограммы восстановления. 2.7.3 IRET Возврат после обработки прерывания Признаки: O D I T S Z A P C r r r r r r r r r . Команда: IRET . Логика : POP IP POP CS POPF ;пересылка слова из стека в регистр FLAGS - 128 - Команда IRET передает управление из подрограммы обработки прерываний в место возникновения прерывания, восстанавливая из стека значения регистров IP, CS и FLAGS. -------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 32 3 1 IRET -------------------------------------------------------- 2.8 Управление состоянием процессора 2.7.1 CLC Сброс признака переноса Признаки: O D I T S Z A P C 0 . Команда: CLC . Логика: CF = 0 . CLC сбрасывает признак переноса. Другие признаки не меня- ются. ----------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 2 - 1 CLC ----------------------------------------------------------- 2.7.2 CLD Сброс признака направления Признаки: O D I T S Z A P C 0 . Команда: CLD . Логика: DF = 0 (Разрешает инкремент в командах обрабо- тки строк) . - 129 - CLD сбрасывает (устанавливает равным нулю) признак направ- ления. Другие признаки не меняются. Сброшенный признак направления влечет увеличение SI и DI на единицу в командах об- работки строк. ----------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 2 - 1 CLD ----------------------------------------------------------- Примечание: Команды обработки строк увеличивают SI и DI на единицу, когда DF=0. 2.7.3 CLI Сброс признака разрешения прерывания Признаки: O D I T S Z A P C 0 . Команда: CLI . Логика: IF = 0 . CLI сбрасывает (устанавливает равным нулю) признак разре- шения прерывания, вследствие чего процессор не распознает за- маскированные прерывания. Другие признаки не меняются. (Немаскированные прерывания распознаются процессором всегда, независимо от значения признака IF.) ---------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 2 - 1 CLI ---------------------------------------------------------- 2.7.4 CMC Инвертирование признака переноса Признаки: O D I T S Z A P C * . Команда: CMC . - 130 - Логика: CF = -CF . CMC меняет текущее значение признака переноса на противо- положное. ---------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 2 - 1 CMC ---------------------------------------------------------- 2.7.5 ESC Выборка кода операции и операнда Признаки не меняются . Команда: ESC opcode,source . Команда ESC используется для передачи управления от мик- ропроцессора внешнему процессору, такому как 8087 или 80287. В ответ на ESC микропроцессор выбирает код операции для внешнего процессора (opcode) и код операнда source и помещает их в шину BUS. Внешний процессор поджидает команду ESC и выполняет коман- ду, размещенную в шине, используя исполнительный адрес source. ----------------------------------------------------------- Операнды Такты Обращения Байты Пример байт(слово) непоср.,память 8(12)+EA 1 2-4 ESC 6,ADR[SI] непоср.,регистр 2 - 2 ESC OPCODE,AH ----------------------------------------------------------- Примечания: В целях синхронизации с внешним процессором программист должен перед каждой командой ESC помещать команду WAIT. Процес- соры 80288 и 80386 обладают средствами автоматической синхрони- зации команд, поэтому для них команды WAIT можно опустить. - 131 - 2.7.6 HLT Останов Признаки не меняются . Команда: HLT . Эта команда производит останов ЦП и переводит его в состо- яние ожидания сигнала сброса или сигнала немаскированного пре- рывания. -------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 2 - 1 HLT -------------------------------------------------------- 2.7.7 LOCK Блокирование шины BUS Признаки не меняются. Команда: LOCK . LOCK - это однобайтный префикс, который может предшество- вать любой команде. LOCK заставляет процессор выработать сигнал блокировки шины на время выполнения последующей команды. Ис- пользование сигнала блокировки делает шину недоступной для лю- бого внешнего устройства или события, включая прерывания и пе- редачу данных. ----------------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 2 - 1 LOCK XCHG FLAG,AL ----------------------------------------------------------------- Примечание: Эта команда была предусмотрена для поддержки мультипроцессорных систем с разделенными ресурсами. В такого рода системах доступ к этим ресурсам контролируется обычно че- рез аппаратное и программное обеспечение с использованием сема- форов. Эту команду следует использовать только с целью предотвра- - 132 - щения прерывания операций по пересылке данных. Поэтому ее следует употреблять только перед командами XCHG, MOV и MOVS. 2.7.8 NOP Нет операции Признаки не меняются. Команда: NOP . Логика: нет . Команда NOP является пустым оператором. Она часто исполь- зуется в целях подгонки времени, для выравнивания памяти и как "держатель места". ---------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 3 - 1 NOP ---------------------------------------------------------- 2.7.9 STC Установка признака переноса Признаки: O D I T S Z A P C 1 . Команда: STC . Логика: CF = 1 STC устанавливает признак переноса CF в единицу. Другие признаки не меняются. ---------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 2 - 1 STC ---------------------------------------------------------- - 133 - 2.7.10 STD Установка признака направления ризнаки: O D I T S Z A P C 1 . Команда: STD . Логика: DF = 1 (декремент в командах обработки строк) STD устанавливает признак направления DF в единицу. Другие признаки не меняются. Установление DF в 1 влечет изменение SI и DI в сторону уменьшения в командах обработки строк. --------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 2 - 1 STD --------------------------------------------------------- 2.7.11 STI Установка признака разрешения прерывания Признаки: O D I T S Z A P C 1 . Команда: STI . Логика: IF = 1 . STI устанавливает признак разрешения прерывания в единицу, разрешая процессору распознавать маскированные прерывания. Дру- гие признаки не меняются. (Немаскированные прерывания распозна- ются процессором всегда, независимо от значения признака IF.) --------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 2 - 1 STI --------------------------------------------------------- Примечание: Ожидающее прерывание не будет распознано, пока не выпол- - 134 - нится команда, следующая сразу за STI. 2.7.12 WAIT Ожидание Признаки не меняются . Команда: WAIT . Команда WAIT переводит процессор в состояние ожидания. Процессор будет оставаться в неактивном состоянии, пока на входной линии TEST микропроцессора не появится сигнал. -------------------------------------------------------- Операнды Такты Обращения Байты Пример нет операндов 3+5n - 1 WAIT -------------------------------------------------------- Примечание: Эта команда позволяет "синхронизировать" микропроцессор внешними сигналами без использования запросов на прерывание. - 135 - 3. ПРОГРАММИРОВАНИЕ НА АССЕМБЛЕРЕ 3.1 Общие сведения Текст исходной программы состоит из операторов ассемблера, каждый из которых занимает отдельную строку этого текста. Раз- личают два типа операторов: инструкции и директивы. Первые при трансляции преобразуются в команды процессора, которые исполня- ются после загрузки в память загрузочного модуля программы, имеющего расширение .COM или .EXE . Операторы второго типа уп- равляют процессом ассемблирования - преобразования текста ис- ходной программы в коды объектного модуля (расширение .OBJ). Ассемблер интерпретирует и обрабатывает операторы один за дру- гим, генерируя последовательность из команд процессора и байтов данных. Особо следует остановиться на использовании макрокоманд. При программировании на макроассемблере можно формировать обра- щение к часто повторяющейся последовательности команд при помо- щи одного оператора. Этот прием несколько напоминает вызов подпрограмм в языках высокого уровня, но между ними лежит зна- чительное различие, заключающееся в том, что подпрограмма, за- нимающая некоторый участок памяти, может быть исполнена неогра- ниченное число раз путем передачи ей управления из вызывающей программы, в которую подпрограмма сама затем возвращает управ- ление. В ассемблере используются макровызовы макроопределений. Макроопределение - это последовательность операторов, которые могут содержать формальные параметры. Макроопределение и коман- да обращения к макроопределению (макровызов) образуют макроко- манду. Макровызов - это оператор вызова макроопределения. Если макроопределение содержит формальные параметры, то макровызов обязан содержать фактические значения этих параметров, которые будут подставлены вместо соответствующих формальных. В резуль- тате макровызовва формируется реальная последовательность ко- манд - макрорасширение. Макрорасширение вставляется в исходный текст программы на место оператора макровызова. Таким образом, в исходный текст программы макрорасширение одного и того же макроопределения может быть вставлено несколько раз, по числу макровызовов. Каждое макрорасширение после трансляции естест- - 136 - венно занимает свой участок памяти. В ассемблере имеется три вида вызова подпрограмм. - CALL NEAR (короткий вызов); - CALL FAR (длинный вызов); - INT (прерывание), но ни одн из них не содержит явного механизма передачи па- раметров. Этот механизм определяется внутренней организацией вызываемой подпрограммы. Ниже приведен список слов зарезервированных для ассембле- ра, использование которых в иных целях запрещено. .186 DI .ERRNZ LENGTH .SALL .286c DL ES .LFCOND SEG .286p DQ EVEN .LIST SEGMENT .287 DS EXITM LOCAL .SFCOND .8086 DT EXTRN LOW SHL .8087 DW FAR LT SHORT = DWORD GE MACRO SHR AH DX GROUP MASK SI AL ELSE GT MOD SIZE AND END HIGH NAME SP ASSUME ENDIF IF NE SS AX ENDM IF1 NEAR STRUC BH ENDP IF2 NOT SUBTTL BL ENDS IFB OFFSET TBYTE BP EQ IFDEF OR .TFCOND BX EQU IFDIF ORG THIS BYTE .ERR IFE %OUT TITLE CH .ERR1 IFIDN PAGE TYPE CL .ERR2 IFNB PROC .TYPE COMMENT .ERRB IFNDEF PTR WIDTH .CREF .ERRDEF INCLUDE PUBLIC WORD CS .ERRDIF IRP PURGE .XALL CX .ERRE IRPC QWORD .XCREF DB .ERRIDN LABEL .RADIX .XLIST DD .ERRNB .LALL RECORD XOR DH .ERRNDEF LE REPT - 137 - Примечания: Данный список не включает мнемонических обозначений, ис- пользуемых для набора команд. Данные слова не зависят от типа букв, это означает, что и PURGE, и purge являются зарезервированными словами. Общий формат оператора ассемблера имеет следующий вид: [Метка:]Код_операции[Операнд1[,Операнд2]][;Комментарий], где элементы, указанные в квадратных скобках, могут отсутство- вать. Пробелы вводятся произвольно, но минимум один пробел дол- жен быть после кода операции. Метка - это идентификатор, присваевыемый первому байту того оператора, в котором она появляется. Код_операции - это мнемоническое обозначение соответствую- щих команд процессора. Операнды оператора ассемблера описываются выражениями. Вы- ражения конструируются на основе операций над числовыми и текс- товыми константами, метками и идентификаторами переменных с использованием знаков операций и некоторых зарезервированных слов. Ниже приведены все определенные в ассемблере операции. - 138 - Порядок старшинства операций от высшей к низшей: LENGTH, SIZE, WIDTH, MASK, (), [], <> . : PTR, OFFSET, SEG, TYPE, THIS HIGH, LOW + (unary), - (unary) *, /, MOD, SHL, SHR +, - EQ, NE, LT, LE, GT, GE NOT AND OR, XOR SHORT, .TYPE Старшинство операций определяет порядок, по которому будет вычисляться выражение. Более старшие операции будут произво- диться раньше операций, имеющих меньшее старшинство. Примечания: Операции, стоящие в одной строке, имеют равный приоритет. Операции равного старшинства вычисляются слева направо. Операции, стоящие в скобках, выполняются первыми. Пример оператора ассемблера: l0c_1: mov ax,(DAT_1+4) SHR 4, здесь использованы следующие операции ассемблера: ( ), + и SHR. - 139 - 3.2 Арифметические операторы 3.2.1 + Сложение или унарный плюс expression1 + expression2 (сложение) или + expression (унарный плюс) Бинарный "+" суммирует значения двух выражений. Унарный "+" сохраняет знак и значение выражения. Примечания: Оператор сложения ('+') может использоваться для прибавле- ния целого числа к операнду, перемещаемому в памяти. Операндом, перемещаемым в памяти, может быть только одно из выражений. Оба выражения могут быть целыми числами. Унарная операция '+' обладает более высоким приоритетом, чем оператор сложения. Смотри 'Старшинство операций', где опи- сан порядок старшинства операций. 3.2.2 - Вычитание или унарный минус expression1 - expression2 (вычитание) или - expression (унарный минус). Бинарный "-" вычитает одно выражение из другого.Унарный "-" изменяет знак выражения. Примечания: Операндами оператора вычитания могут быть целые числа или операнды, перемещаемые в памяти. Если оба операнда являются ад- ресами памяти, то они должны располагаться в одном и том же сегменте. Унарная операция '-' обладает более высоким приоритетом, чем оператор вычитания. Смотри 'Старшинство операций', где опи- сан порядок старшинства операций. - 140 - 3.2.3 * Умножение expression1 * expression2 . Перемножает значения двух выражений. Примечания: Выражения должны быть целыми числами. Они не могут быть адресами, перемещаемыми в памяти. 3.2.4 / Деление expression1 / expression2 Делит одно выражение на другое. Примечания: Выражения должны быть целыми числами. Они не могут быть адресами, перемещаемыми в памяти. 3.2.5 MOD Деление по модулю выражение1 MOD выражение2 Выдает остаток от деления. Примечания: Оба выражения должны быть целыми числами. Они не должны быть настраиваемыми адресами. Например, 14 MOD 4 = 2, т.к. 14 / 4 дает остаток 2. - 141 - 3.3 . Оператор доступа к полю структуры structvariable.field . Используется для доступа к полю переменной структурного типа. Примечания: Structvariable - это имя переменной, описанной ранее как переменная структурного типа, а field - это имя поля внутри структуры. Исполнительный адрес, формируемый данным оператором (.), является суммой смещения переменной structvariable и смещения поля field внутри структуры. Этот адрес является относительным внутри той группы или сегмента, где определена переменная structvariable. Этот оператор эквивалентен использованию оператора сложе- ния (+) с индексными или базовыми операндами. 3.4 [] Оператор индексации expression1[expression2] Прибавляет значение выражения expression1 к значению выра- жения expression2. Этот оператор такой же, как и '+', за тем исключением, что здесь выражение expression1 не является обяза- тельным. Примечания: Если выражение expression1 задано, оно может быть целым значением, перемещаемым операндом или абсолютным символом. Expression2 может быть целым значением или абсолютным символом, а также перемещаемым операндом, в том случае, когда выражение expression1 не задано. Этот оператор используется как правило для доступа к от- дельным элементам массива. Например, в следующей команде в ре- гистр AL помещается 3-й байт строки символов: MOV AL, STRING [2] - 142 - 3.5 Операторы сдвига 3.5.1 SHL Сдвиг влево выражение SHL count Сдвигает выражение влево на count битов. Примечания: Биты, сдвинутые за конец, теряются. При сдвиге вводятся нули. Если count больше или равен 16, результат равен 0. Если сдвигаемое значение - слово, все 16 бит будут сдвину- ты. Однако, если значение - байт, сдвигаются только 8 бит. 3.5.2 SHR Сдвиг вправо выражение SHR count Сдвигает выражение вправо на count битов. Примечания: Биты, сдвинутые за конец, теряются. При сдвиге вводятся нули. Если count больше или равен 16, результат равен 0. Если сдвигаемое значение - слово, все 16 бит будут сдвину- ты. Однако, если значение - байт, сдвигаются только 8 бит. 3.6 Побитовые логические операции 3.6.1 NOT Побитовое отрицание NOT выражение Производит над выражением побитовую операцию отрицания (инвертирования). Следующая таблица показывает результат приме- нения операции NOT к одному биту: - 143 - Бит Результат 0 1 1 0 3.6.2 AND Побитное логическое "И" expression1 AND expression2 . Производит по битам операцию логического умножения над операндами expression1 и expression2. Следующая таблица показы- вает результаты применения операции AND к двум битам: Бит Бит Результат 0 0 0 0 1 0 1 0 0 1 1 1 3.6.3 OR Побитовая логическая операция "ИЛИ" expression1 OR expression2 Производит по битам операцию логического ИЛИ над операнда- ми expression1 и expression2. Следующая таблица показывает ре- зультаты применения операции OR к двум битам: Бит Бит Результат 0 0 0 0 1 1 1 0 1 1 1 1 3.6.4 XOR Побитовое логическое "исключающее ИЛИ" expression1 XOR expression2 Производит по битам операцию логического исключающего ИЛИ - 144 - над операндами expression1 и expression2. Следующая таблица по- казывает результаты применения операции XOR к двум битам: Бит Бит Результат 0 0 0 0 1 1 1 0 1 1 1 0 3.7 Операторы отношений 3.7.1 EQ Оператор отношения "равно" expression1 EQ expression2 Возвращает значение истина (0FFFFh), если выражения expression1 и expression2 равны, иначе возвращает ложь (0000h). Примечания: Оба выражения должны приводиться к абсолютным значениям. Этот оператор трактует операнды, как 16-битные числа. Вы- ражения, у которых 16-ый бит равен 1, являются отрицательными. Так, -1 EQ 0FFFFh есть истина. 3.7.2 NE Операция отношения "не равно" expression1 NE expression2 Возвращает значение истина (0FFFFh), если выражение expression1 не равно выражению expression2, иначе возвращает ложь (0000h). Примечания: Оба выражения должны приводиться к абсолютным значениям. Этот оператор трактует операнды, как 16-битные числа. Вы- ражения с ненулевым 16-м битом считаются отрицательными. Так -1 NE 0FFFFh дает ложь. - 145 - 3.7.3 LT Операция отношения "меньше чем" expression1 LT expression2 Возвращает значение истина (0FFFFh), если выражение expression1 меньше выражения expression2, иначе возвращает ложь (0000h). Примечания: Оба выражения должны приводиться к абсолютным значениям. Этот оператор трактует операнды, как 17-битные числа. 17-й бит задает знак операнда. Так что максимально возможное значе- ние операнда есть 0FFFFh (65535). 3.7.4 GT Оператор отношения "больше" expression1 GT expression2 Возвращает значение истина (0FFFFh), если выражение expression1 больше выражения expression2, иначе возвращает ложь (0000h). Примечания: Оба выражения должны приводиться к абсолютным значениям. Этот оператор трактует операнды, как 17-битные числа. 17-й бит задает знак операнда. Так что максимально возможное значе- ние операнда есть 0FFFFh (65535). 3.7.5 LE Оператор отношения "меньше или равно" expression1 LE expression2 Возвращает значение истина (0FFFFh), если выражение expression1 меньше или равно выражению expression2, иначе возв- ращает ложь (0000h). Примечания: Оба выражения должны приводиться к абсолютным значениям. Этот оператор трактует операнды, как 17-битные числа. 17-й бит задает знак операнда. Так что максимально возможное значе- - 146 - ние операнда есть 0FFFFh (65535). 3.7.6 GE Оператор отношения "больше или равно" expression1 GE expression2 Возвращает значение истина (0FFFFh), если выражение expression1 больше или равно выражению expression2, иначе возв- ращает ложь (0000h). Примечания: Оба выражения должны приводиться к абсолютным значениям. Этот оператор трактует операнды, как 17-битные числа. 17-й бит задает знак операнда. Так что максимально возможное значе- ние операнда есть 0FFFFh (65535). 3.8 Оператор явного задания сегмента : Оператор явного задания сегмента Оператор MASM сегментный_регистр:выражение или имя_сегмента:выражение или имя_группы:выражение . Этот оператор заставляет вычислять метку или адрес пере- менной, используя начало сегмента, задаваемого сегментным регистром, сегментным именем или именем группы. Примечания: Сегментным регистром может быть один из регистров CS, SS, ES или DS. Имя сегмента и имя группы должны быть определены командами SEGMENT и GROUP. Они должны быть также присвоены какому-либо сегментному регистру командой ASSUME. Выражение может быть как перемещаемым операндом, так и аб- - 147 - солютным символом. В зависимости от команды и от типов операндов, используе- мый адрес операнда вычисляется относительно одного из регистров ES, DS и SS. Когда же регистр задается в явном виде оператором ':', то эти стандарты не принимаются во внимание. 3.9 Операторы типа 3.9.1 PTR Изменение типа переменной type PTR выражение . Временно изменяет тип выражения (которое может быть меткой или переменной) с его стандартного типа на тип type. Параметр type может иметь одно из следующих значений или имен: Имя Значение BYTE 1 WORD 2 DWORD 4 QWORD 8 TBYTE 10 NEAR 0FFFFh FAR 0FFFEh BYTE (байт), WORD (слово), DWORD (двойное слово) могут ис- пользовать только с операндами из памяти. NEAR и FAR могут ис- пользоваться только с метками. Примечания: Оператор PTR обычно используется для способа доступа к пе- ременной, отличного от указанного при ее определении. Например, для доступа к старшему байту переменной типа WORD (слово). PTR также используется для явного описания типа переменной или мет- ки, являющейся ссылкой вперед. Пример. - 148 - MOV AL, BYTE PTR WORDVAR CALL FAR PTR ROUTINE SHORT Установка метки на тип SHORT (оператор MASM) 3.9.2 SHORT метка Устанавливает тип метки SHORT (короткий). Примечания: Если расстояние между меткой и переходом, ссылающимся на нее, меньше 128 байтов, метка может быть объявлена как метка типа SHORT. Команды, использующие метки SHORT, содержат в себе на 1 байт меньше, чем команды, использующие метки NEAR. 3.9.3 THIS Создание операнда по текущей позиции THIS type . Создает операнд типа type, с адресом (сегмент и смещение), равным текущему указателю на размещение в памяти. Параметр type может быть следующим: BYTE WORD DWORD QWORD TBYTE NEAR FAR . Этот оператор используется для создания меток и перемен- ных, использующих операцию EQU или знак равенства '=', также как и команда LABEL. - 149 - Пример. byteLabel equ THIS BYTE аналогично byteLabel LABEL BYTE. 3.9.4. HIGH Возврат старших 8 бит HIGH expression . Этот оператор возвращает старшие 8 бит выражения expression. Пример. MOV BL, HIGH 1234h Эта команда поместит 12h в BL. 3.9.5 LOW Получение восьми младших битов LOW expression . Этот оператор выдает младший байт (8 бит) выражения expression. Пример. MOV BL, LOW 1234h Эта команда поместит 34h в BL. 3.9.6 SEG Выдача значения сегмента SEG выражение . - 150 - Выдает значение сегмента, в котором расположено выражение. Примечания: Выражение может быть переменной, меткой, именем сегмента, именем группы либо другим символом. 3.9.7 OFFSET Смещение выражения OFFSET выражение . Выдает число байт между выражением и началом сегмента, в котором оно определено. Примечания: Выражение может быть меткой, именем сегмента или перемен- ной. Для получения правильного смещения при доступе к перемен- ным в сегментах или в группах, используйте префикс переопреде- ления сегмента ':' для того, чтобы команда OFFSET вычисляла смещение относительно начала группы или сегмента. 3.9.8 .TYPE Выдача режима и контекста для выражения .TYPE выражение . Выдает байт, описывающий состояние и область доступности (видимости) выражения. Примечания: Байт выдается в следующем формате: Биты 7 6 5 4 3 2 1 0 % . . . . . . . 1=External;0=Local или Public . % . . . . . . Всегда 0 . . % . . . . . Определено - 151 - . . . % % % . . Всегда 0 . . . . . . % . В зависимости от данных . . . . . . . % В зависимости от программы Если выражение неправильное, весь байт равен 0. Этот оператор обычно используется с условными командами, в которых для управления программой используется состояние пере- менной. 3.9.9 TYPE Получение размера типа TYPE выражение . Выдает число байт, необходимых для хранения переменной то- го типа, каким является выражение; для метки NEAR выдает 0FFFFh, а для метки FAR - 0FFFEh. Примечания: Выдаваемые значения аналогичны приведенным в описании опе- ратора PTR. Заметьте, что число выдаваемых байт равно числу байт, занимаемых типом выражения. Следовательно, переменная ти- па слово всегда дает 2, даже если она повторяется 10 раз. 3.9.10 LENGTH Возврат длины переменной LENGTH переменная . Возвращает число единиц типа BYTE, WORD, DWORD, QWORD или TBYTE, занимаемых переменной. Примечания: Тип переменной определяет, в каких единицах измерения возвращается ее длина. Значение, возвращаемое этим оператором, есть число, пред- шествующее оператору DUP в описании переменной. Поэтому, только для переменных, описанных с помощью оператора DUP, будет возв- ращено значение, отличное от 1. Строковые константы также возв- ратят 1. - 152 - 3.9.11 SIZE Выдача количества байт, используемых под переменную SIZE переменная Выдает число байт, занимаемых переменной. Примечания: Значение, возвращаемое этим оператором, равно длине (LENGTH) переменной, повторенной TYPE (тип) раз: SIZE переменная=(LENGTH переменная)*(TYPE переменная) 3.10 Использование специальных операторов макрокоманд 3.10.1 & Оператор подстановки &dummyparameter или dummyparameter& . Заставляет ассемблер заменить подставной параметр dummyparameter на значение фактического параметра в тексте мак- роопределения. - 153 - Примечания: Рассмотрим смысл этого оператора на следующем примере: Пример. newlabel MACRO x label&x db &x ENDM newlabel 0 newlabel 1 . 3.10.2 <> Оператор буквального прочтения текста <текст> . Трактует текст как единое целое, независимо от того, со- держит ли он пробелы, запятые или другие разделители. Примечания: Этот оператор используется в макросах или в повторных бло- ках, чтобы быть уверенным в том, что вызов макрокоманды будет трактоваться как единый параметр. Этот оператор может также применяться в целях использова- ния спецсимволов, таких как точка с запятой, в качестве литер. Например, точка с запятой сама по себе обозначает комментарий, а <;> обозначает сам символ "точка с запятой". Каждый раз, когда макрокоманде передается параметр, макро- ассемблер снимает один слой угловых скобок. При использовании вложенных макросов нужно убедиться в наличии достаточного коли- чества угловых скобок. 3.10.3. ! Оператор буквальной интерпретации символа !символ Заставляет ассемблер интерпретировать символ буквально. - 154 - Примечания: Этот оператор может быть использован только в макроопреде- лениях (включая повторные блоки) или с командами условного ас- семблирования. !символ эквивалентно <символ>; позволяет Вам использовать специальные символы, имеющие особое значение, такие как ';' и '&', просто как некоторые абстрактные символы, равноправные со всеми остальными символами. 3.10.4 % Оператор преобразования в выражение %текст . Интерпретирует текст как выражение. Макроассемблер вычис- лит значение этого выражения в текущей системе счисления и за- менит текст на это значение. Примечания: Этот оператор редко используется просто для подсчета значения некоторого непосредственно используемого выражения; обычно он используется при вызове макросов, когда передаваемое макрокоманде значение является результатом вычисления значения выражения. Текст должен быть правильно заданным выражением в текущей системе счисления. 3.10.5 ;; Макрокомментарий ;;текст_комментария . Позволяет включать комментарий в макроопределение таким образом, что он удаляется при макрорасширении. - 155 - 3.11 Размещение сегментов, имеющих одинаковые имена в области памяти. Комбинирование сегментов 3.11.1 PUBLIC Соединение одноименных сегментов segname SEGMENT PUBLIC . Заставляет компоновщик соединить все сегменты с одинаковым именем сегмента. Примечания: Новый соединенный сегмент будет целым и непрерывным. Все команды и адреса данных в этом сегменте будут вычислены относи- тельно начала этого нового сегмента. Если не указано никакого комбинированного типа, сегмент при загрузке в память получит свой собственный физический сег- мент. 3.11.2 STACK Определение стекового сегмента segname SEGMENT STACK . Заставляет компоновщик соединять все одноименные сегменты и вычислять все адреса в этих сегментах относительно регистра SS. Примечания: Комбинированный тип STACK (стек) аналогичен комбинирован- ному типу PUBLIC, за исключением того, что регистр SS является стандартным сегментным регистром для сегментов типа STACK. Ре- гистр SP устанавливается на конец данного объединенного сегмен- та типа STACK. Если не указано ни одного сегмента типа STACK, компоновщик выдаст предупреждение, что стековый сегмент не найден. Если стековый сегмент создан, а комбинированный тип STACK не используется, пользователь должен явно загрузить в регистр SS адрес сегмента. - 156 - Если комбинированный тип не указан, сегмент при загрузке в память получает свой собственный физический сегмент. 3.11.3 COMMON Определение совмещаемых сегментов segname SEGMENT COMMON . Заставляет редактор связей (linker) помещать все сегменты, имена которых совпадают, по одному и тому же адресу, так что адреса данных и команд в каждом из таких сегментов являются смещениями по отношению к общему стартовому адресу. Примечания: Для совмещенных структур, получающихся вследствие описания комбинированного типа COMMON, справедливо: если данные описыва- ются в нескольких местах под общим именем, то самое последнее описание "забивает" все предыдущие описания. Длина нового совмещенного сегмента равна длине максималь- ного из сегментов комбинированного типа COMMON. Если этот комбинированный тип не был задан, то сегмент не совмещается ни с каким другим сегментом. 3.11.4 MEMORY Размещает сегмент как последний возможный segname SEGMENT MEMORY. Заставляет компоновщик (Linker) Microsoft воспринимать этот сегмент как PUBLIC. Компоновщик Microsoft не поддерживает смешанного типа MEMORY в той форме, как отмечено в описании смешанного типа MEMORY фирмы Intel. Вместо этого все сегменты MEMORY воспринимаются как PUBLIC. Примечания: В соответствии с положениями фирмы Intel, комбинированный тип памяти предлагался для того, чтобы компоновщик помещал его - 157 - после всех связывающих сегментов. Первый сегмент MEMORY будет размещен в памяти как наивысший сегмент. Последующие сегменты, содержащие сегмент MEMORY, будут восприниматься как сегменты COMMON. Если смешанный (комбинированный) тип не указан, сегмент не смешивается с другими сегментами и при загрузке в память ему отводится отдельный физический сегмент. 3.11.5 AT Определение абсолютного сегмента segname SEGMENT AT address . Задает абсолютный стартовый адрес сегмента. Все метки и адреса в сегменте являются относительными по отношению к задан- ному адресу. Примечания: Параметр address является 16-тибитным адресом начала па- раграфа для сегмента. Он может также являться выражением, но не должен содержать ссылок на последующие строки. Этот комбинированный тип используется обычно для данных или кодов, которые должны располагаться по адресам, не завися- щим от распределения памяти; например, для областей данных ПЗУ БСВВ, векторов прерывания или буфера экрана. Комбинированный тип AT нельзя использовать для насильст- венной загрузки кодов или данных в заданный участок памяти. 3.12. Управление размещением сегментов в области памяти. Типы размещения 3.12.1 BYTE Располагает сегмент по адресу некоторого байта segname SEGMENT BYTE . Указывает, что сегмент должен начинаться на границе байта. - 158 - Примечания: Реальный стартовый адрес не вычисляется до тех пор, пока программа не загружена. 3.12.2 WORD Выравнивание на 2-байтовую границу segname SEGMENT WORD . Указывает, что сегмент должен начинаться с адреса памяти, кратного 2, т.е. последний значащий бит равен 0. (Такой адрес памяти называется также границей слова). Примечания: Действительный начальный адрес не вычисляется до загрузки программы. 3.12.3 PARA Выравнивание на 16-байтовую границу segname SEGMENT PARA . Указывает, что сегмент должен начинаться с адреса памяти, кратного 16, т.е. последняя шестнадцатеричная цифра должна быть 0h (Такой адрес памяти называется также границей параграфа). Примечания: Действительный начальный адрес не вычисляется до загрузки программы. Если тип расположения не указан, по умолчанию принимается тип расположения PARA. 3.12.4 PAGE Выравнивание на 256-байтовую границу segname SEGMENT PAGE . Указывает, что сегмент должен начинаться с адреса памяти, кратного 256, т.е. две последние шестнадцатеричные цифры должны быть 00h ( Такой адрес памяти называется также границей страни- - 159 - цы). Примечания: Действительный начальный адрес не вычисляется до загрузки программы. 3.13 Привязка сегментов к сегментным регистрам ASSUME сегментный_регистр:имя_сегмента,,, или ASSUME NOTHING. Задает сегментный регистр, который будет использоваться для вычисления исполнительных адресов всех меток и переменных, определенных под заданным именем сегмента или группы ("имя сег- мента"). Примечания: Аргументом "сегментный_регистр" может быть CS, DS, ES или SS. Аргументом "имя_сегмента" должно быть имя сегмента, опре- деленное заранее директивой SEGMENT, или имя группы, определен- ное директивой GROUP, или ключевое слово NOTHING. Если исполь- зуется ключевое слово NOTHING, то предшествующий выбор сегмента анулируется. ASSUME NOTHING аннулирует выбор сегмента для всех 4-х сег- ментных регистров. Если для формирования исполнительного адреса используется оператор задания сегмента в явном виде (:), то сегментный ре- гистр, заданный директивой ASSUME, во внимание не принимается. 3.14 Определение меток и переменных 3.14.1 Спецификация типов данных 3.14.1.1 BYTE Тип данных для 1 байта - 160 - Используется для определения типа переменной как байт (8 бит). Примечания: Этот тип данных используется: - директивой EXTRN; - оператором PTR; - директивой LABEL; - оператором THIS. Для описания переменной типа BYTE используется команда DB. 3.14.1.2 WORD Тип данных в 2 байта Используется для задания переменной типа данных в виде слова (2 байта). Примечания: Этот тип данных используется: - директивой EXTRN; - оператором PTR; - директивой LABEL; - оператором THIS. DW используется для определения переменной типа WORD. 3.14.1.3 DWORD Тип данных для 4 байтов Используется для определения типа переменной как двойное слово(4 байта). - 161 - Примечания: Этот тип данных используется: - директивой EXTRN; - оператором PTR; - директивой LABEL; - оператором THIS. Для описания переменной типа DWORD используется команда DD. 3.14.1.4 QWORD Тип данных в 8 байт Используется для определения типа переменной как четверное слово(8 байт). Примечания: Этот тип данных используется: - директивой EXTRN; - оператором PTR; - директивой LABEL; - оператором THIS. Смотри DQ для определения переменной типа QWORD. 3.14.1.5 TBYTE Тип данных в 10 байтов Используется для определения типа переменной в 10 байт. Примечания: Этот тип данных используется: - директивой EXTRN; - оператором PTR; - директивой LABEL; - оператором THIS. Смотри DT для определения переменной типа TBYTE. - 162 - 3.14.2 Спецификация типов меток 3.14.2.1 FAR Тип данных для метки из другого сегмента Используется для определения типа метки как дальней (из другого сегмента). Примечания: Этот тип данных используется: - директивой EXTRN; - оператором PTR; - директивой LABEL; - оператором THIS; - директива PROC. 3.14.2.2 NEAR Тип данных в том же сегменте Используется для описания типа данных и метки как near (ближайший, тот же сегмент). Примечания: Этот тип данных используется: - директивой EXTRN; - оператором PTR; - директивой LABEL; - оператором THIS; - директивой PROC. Метка, за которой стоит двоеточие, например: Address: является меткой типа near. - 163 - 3.14.3 $ Операнд счетчика размещения Этот спецсимвол обозначает текущее значение счетчика раз- мещения. Под счетчиком размещения понимается значение текущего смещения внутри текущего сегмента в процессе ассемблирования. Примечания: Этот операнд обладает такими же атрибутами, как и метка near label. Счетчик размещения - это адрес, увеличивающийся в процессе ассемблирования; он отражает текущий адрес оператора исходного файла, который ассемблируется. Пример. helpMessage DB 'This is help for the program' helpLength = $ - helpMessage . После ассемблирования этих двух строк значение 'helpLength' будет равно длине вспомогательного сообщения, по- мещенного в строке helpMessage. 3.14.4 Массивы и буферы. Оператор DUP DUP - дублирование начального значения. count DUP (initialvalue,,,). Используется вместе с директивами DB, DW, DD, DQ и DT для задания нескольких одинаковых начальных значений. Примечания: Начальных значений initialvalue может быть одно или более, тогда их нужно отделить запятыми. Каждое начальное значение должно быть выражением, которое преобразуется в целое, в сим- вольную константу или в другой оператор DUP. Обратите Ваше вни- мание на то, что начальные значения ДОЛЖНЫ быть заключены в скобки. - 164 - Аргумент count задает число раз, которое нужно продублиро- вать начальное значение. Пример. DB 200 DUP (1) ;Определяет 200 байтов,инициализированных в ;1 DB 50 DUP (1,0) ;Определяет 100 байтов со значениями ; 1,0,1,0 и т.д. DB 2 DUP (3 DUP (1)) ;Определяет 6 байтов, ;инициализированных в 1 . 3.15 Специальные операторы для работы с записями 3.15.1 MASK Получение битовой маски MASK recordFieldName или MASK record . Выдает последовательность битов, представляющих биты, ис- пользуемые в отдельных полях записи. Биты, используемые в поле, должны быть единичными, тогда неиспользуемые - нулевыми. Примечания: recordFieldName должно быть именем поля записи. Record должно быть именем записи. 3.15.2 WIDTH Получение ширины в битах WIDTH recordFieldName или WIDTH record . Выдает число бит, занимаемых полем записи или всей за- писью. - 165 - Примечания: recordFieldName должно быть именем поля записи. Record должно быть именем записи. - 166 - 4. ДИРЕКТИВЫ АССЕМБЛЕРА При трансляции исходного модуля программы (расширение .ASM) в объектный файл (расширение .OBJ) с помощью транслятора MASM используются приведенные ниже директивы, определяющие ре- жимы трансляции. 4.1 .186 Разрешает команды процессора 80186 Разрешает ассемблирование команд процессоров 80186 и 8086. Примечания: Эту директиву следует использовать для программ, которые будут выполняться только на системах 80186. Помещайте все директивы, разрешающие ассемблирование тех или иных команд, в начало исходного файла, чтобы быть уверенны- ми в том, что все команды файла проассемблировались с использо- ванием набора команд одного и того же микропроцессора. 4.2 .286c Разрешает команды реального режима процессора 80286 Разрешает ассемблирование команд реального режима процес- сора 80286, а также команд процессоров 80186 и 8086 (команды 80186 идентичны командам реального режима 80286). Примечания: Эту директиву следует использовать для программ, которые будут выполняться только в реальном режиме на 80286 (или 80386). Помещайте все директивы, разрешающие ассемблирование тех или иных команд, в начало исходного файла, чтобы быть уверенны- ми в том, что все команды файла проассемблировались с использо- ванием набора команд одного и того же микропроцессора. Смотри также директиву .286p, которая разрешает команды защищенного режима процессора 80286. - 167 - 4.3 .286p Разрешает команды защищенного режима процессора 80286 Разрешает ассемблирование команд защищенного режима 80286, а также команд незащищенного (реального) режима 8086, 80186, 80286. Примечания: Эту директиву следует использовать для программ, которые будут выполняться только в защищенном режиме на 80286. Помещайте все директивы, разрешающие ассемблирование тех или иных команд, в начало исходного файла, чтобы быть уверенны- ми в том, что все команды файла проассемблировались с использо- ванием набора команд одного и того же микропроцессора. Смотри также директиву .286c, которая разрешает лишь ко- манды реального режима процессора 80286. 4.4 .287 Разрешает команды процессора 80287 Разрешает ассемблирование команд процессора 80287. Примечания: Смотри описание по .8087, где содержится дополнительная информация по использованию этой директивы. Эту директиву следует использовать в программах, которые используют операции с плавающей точкой и будут выполняться только на системах 80287. Помещайте все директивы, разрешающие ассемблирование тех или иных команд, в начало исходного файла, чтобы быть уверенны- ми в том, что все команды файла проассемблировались с использо- ванием набора команд одного и того же микропроцессора. 4.5 .8086 Разрешает команды процессора 8086 Разрешает ассемблирование команд процессора 8086(8088), при этом запрещает ассемблирование команд, которые имеются только на 80186 и 80286. - 168 - Примечания: Помещайте все директивы, разрешающие ассемблирование тех или иных команд, в начало исходного файла, чтобы быть уверенны- ми в том, что все команды файла проассемблировались с использо- ванием набора команд одного и того же микропроцессора. Если не задана ни одна из директив разрешающих использова- ние команд того или иного процессора, то по умолчанию берутся директивы .8086 и .8087. 4.6 .8087 Разрешает команды процессора 8087 Разрешает ассемблирование команд 8086 и запрещает ассемб- лирование команд 80287. Примечания: При использовании директив .8087 или .287 добавляйте в ко- мандную строку макроассемблера /R или /E для задания режима об- работки ассемблером команд с плавающей точкой: /R - ассемблер генерирует действительный код команды для команд с плавающей точкой; /E - ассемблер вырабатывает код, который может быть ис- пользован программой-эмулятором арифметики с плаваю- щей точкой. Помещайте все директивы, разрешающие ассемблирование тех или иных команд, в начало исходного файла, чтобы быть уверенны- ми в том, что все команды файла проассемблировались с использо- ванием набора команд одного и того же микропроцессора. Если не задана ни одна из директив разрешающих использова- ние команд того или иного процессора, то по умолчанию берутся директивы .8086 и .8087. - 169 - 4.7 = Создание абсолютного символа name=expression . Присваивает значение выражения expression абсолютному сим- волу name. Примечания: Размещения абсолютного символа в памяти не происходит. Ас- семблер заменяет каждый вход абсолютного символа name на 16-тибитное числовое значение выражения. Выражение expression может быть целым, константным выраже- нием, адресным выражением, строковой константой, состоящей из 1 или 2 символов. Значение выражения не должно превышать 65535. Имя name должно использоваться впервые или уже быть ранее введено командой '='. Абсолютный символ МОЖЕТ быть переопределен в любое время. 4.8 COMMENT Ввод комментария в несколько строк COMMENT разделитель text разделитель [text] . Предоставляет возможность включать комментарии длиной в несколько строк в исходный текст, заключая комментарий между 2- мя разделителями (оба разделителя должны совпадать). Примечания: Под разделителем понимается любой символ, отличный от про- бела, следующий за словом COMMENT. Весь текст, следующий за разделителем до следующего появления того же разделителя, игно- рируется. Кроме того, любой текст, следующий за вторым разделителем в той же строке, также игнорируется. - 170 - 4.9 .CREF Разрешает листинг перекрестных ссылок .CREF . Разрешает генерацию листингов перекрестных ссылок для ме- ток, переменных и символов. Примечания: Эта директива не дает указания ассемблеру составить лис- тинг перекрестных ссылок, но, если листинг перекрестных ссылок задан, то эта директива делает возможным генерацию меток, пере- менных и символов с перекрестными ссылками; в то время, как после директивы .XCREF все ссылки (метки, переменные и символы) не будут перекрестными ссылками, пока снова не встретится .CREF. 4.10 DB Описание байта [name] DB initialvalue,,, . Размещает и инициализирует один или более байтов (по 8 бит) памяти. Аргумент initialvalue может быть задан одним из следующих способов: - целое число (например, 12); - строка (например, 'message'); - константное выражение (например, 2 * 5); - оператор DUP (например, 10 DUP (?)); - знак вопроса (?) (например, 0,1,?,2). Примечания: Когда имеется аргумент name (он не является обязательным), то ассемблер создает переменную, значение смещения которой рав- но текущему значению счетчика размещения. Эта переменная будет иметь тип BYTE. Знак вопроса ? дает указание ассемблеру оставить начальное значение неопределенным. Для того, чтобы задать более одного начального значения, отделите их запятыми. - 171 - Начальное значение строковой константы может быть любой длины, при условии, что она умещается на одной строке. Строчные переменные хранятся таким образом, чтобы первому символу соот- ветствовал меньший адрес, чем последнему. 4.11 DD Описание двойного слова [name] DD initialvalue,,, . Размещает и инициализирует одно или более двойных слов (по 4 байта) памяти. Примечания: Когда имеется аргумент name (он не является обязательным), то ассемблер создает переменную, значение смещения которой рав- но текущему значению счетчика размещения. Эта переменная будет иметь тип DWORD. Аргумент initialvalue может быть задан одним из следующих способов: - целое число, например, 1234; - вещественное число, например, 2.3; - строковая константа, одно- или двухсимвольная, например, 'gh'; - закодированное вещественное число, например, 2F00000r; - константное выражение ,например, 2 * 12; - адресное выражение, например, farArrayPtr; - оператор DUP, например, 10 DUP (?) . Знак вопроса ? дает указание ассемблеру оставить начальное значение неопределенным. Для того, чтобы задать более одного начального значения, отделите их запятыми. Строчные переменные типа DWORD должны содержать не более 2 -х символов. Последний символ помещается в младший байт младше- го слова, а первый символ (если их 2) или 0 (если символ всего один) помещается в следующий байт. Остальные байты заполняются нулями. - 172 - 4.12 DQ Описание учетверенного слова [name] DQ initialvalue,,, . Размещает и инициализирует одно или более учетверенных слов (по 8 байтов) памяти. Примечания: Когда имеется аргумент name (он не является обязательным), то ассемблер создает переменную, значение смещения которой рав- но текущему значению счетчика размещения. Эта переменная будет иметь тип QWORD. Аргумент initialvalue может быть задан одним из следующих способов: - целое число, например, 1234; - вещественное число, например, 2.3; - строковая константа, одно- или двухсимвольная, например, 'gh'; - закодированное вещественное число, например, 2F0000000000000r; - константное выражение, например, 2 * 12; - оператор DUP, например, 10 DUP (?); - знак вопроса (?), например, 0,1,?,2. Знак вопроса ? дает указание ассемблеру оставить начальное значение неопределенным. Для того, чтобы задать более одного начального значения, отделите их запятыми. Строчные переменные типа QWORD должны содержать не более 2-х символов. Последний символ помещается в младший байт млад- шего слова, а первый символ (если их 2) или 0 (если символ все- го один) помещается в следующий байт. Остальные байты заполня- ются нулями. 4.13 DT Описание 10-байтной единицы [name] DT initialvalue,,, . Размещает и инициализирует одну или более десятибайтных - 173 - единиц памяти. Примечания: Когда имеется аргумент name (он не является обязательным), то ассемблер создает переменную, значение смещения которой рав- но текущему значению счетчика размещения. Эта переменная будет иметь тип TBYTE. Аргумент initialvalue может быть задан одним из следующих способов: - целочисленное выражение (например, 12334d); - упакованное десятичное число (например, 0123456789); - строковая константа, одно- или двухсимвольная, например, 'gh'; - закодированное вещественное число, например, 2F0000000000000r); - оператор DUP, например, 10 DUP (?); - знак вопроса (?), например, 0,1,?,2 . Знак вопроса ? дает указание ассемблеру оставить начальное значение неопределенным. Для того, чтобы задать более одного начального значения, отделите их запятыми. Строчные переменные типа TBYTE должны содержать не более 2 -х символов. Последний символ помещается в младший байт млад- шего слова, а первый символ (если их 2) или 0 (если символ все- го один) помещается в следующий байт. Остальные байты заполня- ются нулями. Константы с десятичными цифрами трактуются как упакованные десятичные числа, а не как целые. Чтобы с помощью DT задать це- лую константу, добавьте в конце числа букву, задающую систему счисления, в которой это число задается. Например, добавьте 'D' в конце десятичного числа, 'H' - в конце числа, записанного в шестнадцатеричной системе счисления. 4.14 DW Описание слова [name] DW initialvalue,,, . Размещает и инициализирует одно или более слов (по 2 бай- - 174 - та) памяти. Аргумент initialvalue может быть задан одним из следующих способов: - целое число, например, 1234; - строковая константа, одно- или двухсимвольная, например, 'gh'; - константное выражение, например, 2 * 12; - адресное выражение, например, arrayAddress; - оператор DUP, например, 10 DUP (?); - знак вопроса (?), например, 0,1,?,2. Примечания: Когда имеется аргумент name (он не является обязательным), то ассемблер создает переменную, значение смещения которой рав- но текущему значению счетчика размещения. Эта переменная будет иметь тип WORD. Знак вопроса ? дает указание ассемблеру оставить начальное значение неопределенным. Для того, чтобы задать более одного начального значения, отделите их запятыми. Строчные переменные типа WORD должны содержать не более 2- х символов. Последний символ помещается в младший байт слова, а первый символ (если их 2) или 0 (если символ всего один) поме- щается в старший байт. 4.15 ELSE Ассемблирование, если условие не выполнено IF условие команды [ELSE команды] ENDIF . Дает указание ассемблеру сгенерировать коды одной или бо- лее команд, если условие IF не выполнено. Команды, заключенные между директивами IF и ELSE выполняются, если условие IF удов- летворено. Если же условие IF не удовлетворено, то ассемблиру- - 175 - ются команды, заключенные между директивами ELSE и ENDIF. Примечания: Вложенная директива ELSE соответствует ближайшей из дирек- тив IF, у которой нет директивы ELSE. 4.16 END Конец модуля END [expression] . Помечает конец модуля. Все команды, следующие за этой директивой, игнорируются. Примечания: Аргумент expression, если присутствует, задает точку вхож- дения программы, т.е. адрес, с которого начинается выполнение программы. Программа может содержать более одного модуля, но только в одном модуле разрешается задавать точку вхождения. Мо- дуль, в котором задана точка вхождения, называется главным. 4.17 ENDIF Конец условного блока IF... условие команды [ELSE команды] ENDIF . Завершает условный блок, начинающийся одной из директив IF, IF1, IF2, IFB, IFDEF, IFDIF, IFE, IFIDN, IFNB или IFNDEF. 4.18 ENDIF Конец условного блока IF... условие команды [ELSE команды] - 176 - ENDIF . Завершает условный блок, начинающийся одной из директив IF, IF1, IF2, IFB, IFDEF, IFDIF, IFE, IFIDN, IFNB или IFNDEF. 4.19 ENDM Конец макроопределения или повторного блока 1. имя MAKRO [формальный_параметр,,,] команды ENDM 2. REPT выражение команды ENDM 3. IRP формальное_имя,<параметр,,,> команды ENDM 4. IRPC формальное_имя,строка команды ENDM . Завершает макроопределение (MACRO) и повторные блоки (REPT, IRP, IRPC). 4.20 ENDP Конец описания процедуры имя PROC [расстояние] команды имя ENDP . Отмечает конец процедуры. Примечания: Перед директивой ENDP должно стоять имя процедуры. Процедура должна содержать хотя бы одну директиву RET, поскольку в конце процедуры директива RET не вырабатывается ав- томатически, как в других языках программирования. - 177 - Аргументом "расстояние" может быть NEAR или FAR. 4.21 ENDS Конец описания сегмента или структуры 1. имя SEGMENT [типрасположения] [типкомбинирования] ['класс'] имя ENDS 2. имя STRUC описания_полей имя ENDS . Отмечает конец описания сегмента или структуры. 4.22 EQU Создание символа name EQU expression . Создает абсолютные символы (имена, которые представляют 16 -битные значения), "прозвища" (имена, которые представляют дру- гие символы) или текстовые символы (имена, которые представляют строки) путем присвоения имени name значения выражения expression. Параметром expression может быть: - целое число (234); - вещественное число (3.23); - строковая константа ('abc'); - закодированное вещественное число (2F0000000000000r); - мнемокод команды (mov ax, 1); - константное выражение (23*4); - адресное выражение (arrayPtr). Примечания: Параметр name не должен быть ранее определен и не может быть переопределен. Если значение выражения есть число между 0 и 65535, то ас- семблер заменяет имя name на это число. Во всех остальных слу- чаях ассемблер заменяет имя name на текст. - 178 - 4.23 .ERR Симуляция ошибки .ERR . Симулирует фатальную ошибку во время первого или второго прохода ассемблера. Примечания: Эта директива может быть использована в блоках условного ассемблирования или в макросах в целях отладки. Сообщение об ошибке, генерируемое этой директивой, имеет номер 89 и гласит 'Forced error' (Принудительная ошибка). Когда встречается эта директива, то объектный модуль уда- ляется, и происходит выход из ассемблера с кодом выхода 7. 4.24 .ERR1 Симуляция ошибки при первом проходе .ERR1 . Симулирует предупреждающую ошибку во время первого прохода ассемблером программы, при условии, что был использован перек- лючатель /D в командной строке (для выдачи листинга первого прохода). Примечания: Эта директива может быть использована в блоках условного ассемблирования или в макросах в целях отладки. Сообщение об ошибке, генерируемое этой директивой, имеет номер 87 и гласит 'Forced error - pass1' (Принудительная ошибка на первом проходе). Эта директива не окажет никакого воздействия на программу, если в командной строке не будет использован переключатель /D. Эта директива сгенерирует только предупреждающую ошибку, а не фатальную. - 179 - 4.25 .ERR2 Симуляция ошибки при втором проходе .ERR2 . Если эта директива встречается во время 2-го прохода ас- семблером программы, то она генерирует фатальную ошибку. Примечания: Эта директива может быть использована в блоках условного ассемблирования или в макросах в целях отладки. Сообщение об ошибке, генерируемое этой директивой, имеет номер 88 и гласит 'Forced error - pass2' (Принудительная ошибка на втором проходе). Когда встречается эта директива, то объектный модуль уда- ляется, и происходит выход из ассемблера с кодом выхода 7. 4.26 .ERRB Ошибка, если строка пустая .ERRB <строка> . Симулирует фатальную ошибку, если строка пуста. Примечания: Обратите Ваше внимание на то, что строка должна быть зак- лючена в угловые скобки. Строкой может быть любое имя, число или выражение. Сообщение об ошибке, генерируемое этой директивой, имеет номер 94 и гласит 'Forced error - string blank' (Принудительная ошибка - строка пуста). Если ошибка генерируется, то объектный модуль удаляется и происходит выход из ассемблера с кодом 7. Директивы .ERRB и .ERRNB используются обычно для выявления наличия или отсутствия параметров в макро. - 180 - 4.27 .ERRDEF Ошибка, если имя определено .ERRDEF name . Симулирует фатальную ошибку, если имя name определено. Примечания: Если имя name определено как ссылка вперед программы, то оно считается неопределенным на первом проходе и определенным на втором. Сообщение об ошибке, генерируемое этой директивой, имеет номер 93 и гласит 'Forced error - symbol defined' (Принудитель- ная ошибка - символ определен). Если ошибка генерируется, то объектный модуль удаляется и происходит выход из ассемблера с кодом 7. 4.28 .ERRDIF Ошибка, если строки различаются .ERRDIF |