ПРИДНЕПРОВСКИЙ ФИЛИАЛ 
               СОВЕТСКО-БОЛГАРО-ФИНСКОГО ПРЕДПРИЯТИЯ
                 "Новые информационные технологии"



               
               
               







                         СИСТЕМА  ПРОГРАММИРОВАНИЯ 
                      
                         НА МАКРОАССЕМБЛЕРЕ MS-DOS






                           Справочное руководство




                     Часть 1. Пакет макроассемблера MS-DOS 
                     

                         (редакция 1, декабрь 1989)
                   
                   
                   
                   
                   
                   
                   

                   
               
               
                   
                   
                   
                   
                   
                   
                   
                   
                          Днепропетровск 1989г.
                                       
                                         
                                     -  2 -
                                     
                                     
                                     
                                     
                                     
         
         
         
 
 
 
               
               
               
               
               
               
           Ф А Й Л О В А Я   С Т Р У К Т У Р А  Д О К У М Е Н Т А :
               
               
         - Файл  A1P0.DOC  содержит  титульный лист,  настоящую
                           авторскую справку и содержание.
               
         - Файл  A1P1.DOC  содержит Главу 1:
                           Введение.
               
         - Файл  A1P2.DOC  содержит Главу 2:
                           MASM: макроассемблер.
         
         - Файл  A1P3.DOC  содержит Главу 3:
                           LINK: линкер модулей.
         
         - Файл  A1P4.DOC  содержит Главу 4:
                           SYMDEB: символьный отладчик программ.
         
         - Файл  A1P5.DOC  содержит Главу 5:
                           CREF: утилита перекрестных ссылок.
         
         - Файл  A1P6.DOC  содержит Главу 6:
                           LIB: утилита обслуживания библиотек.
         
         - Файл  A1P7.DOC  содержит Главу 7:
                           MAKE: утилита сопровождения программ.
         
         - Файл  A1A1.GFX  содержит Приложение 1:
                           Технология работы на макроассемблере
                           в системе MS-DOS.

                                         
                                     -  3 -
                             
                                                           

                                   Содержание


         1. Введение................................................ 5
         2. MASM: макроассемблер.................................... 7
         2.1. Общие сведения........................................ 7
         2.2. Запуск макроассемблера................................ 8
         2.3. Опции макроассемблера................................. 9
         3. LINK: линкер модулей....................................13
         3.1. Общие сведения........................................13
         3.2. Запуск LINK...........................................14
         3.3. Опции LINK............................................17
         3.4. Особенности работы LINK...............................20
         3.4.1. Выравнивание сегментов..............................21
         3.4.2. Номер кадра.........................................21
         3.4.3. Последовательность сегментов........................21
         3.4.4. Комбинированные сегменты............................22
         3.4.5. Группы..............................................23
         3.4.6. Согласования........................................23
         3.4.7. Поиск библиотек.....................................24
         4. SYMDEB: символьный отладчик программ....................25
         4.1. Общие сведения........................................25
         4.2. Подготовка символьной отладки.........................25
         4.2.1. Исходная информация для символьной отладки..........26
         4.2.2. Формирование символьного файла при помощи MAPSYM....28
         4.3. Запуск SYMDEB.........................................28
         4.3.1. Запуск SYMDEB для символьной отладки................29
         4.3.2. Запуск SYMDEB только с исполнительным файлом........29
         4.3.3. Запуск SYMDEB без файлов............................30
         4.4. Опции SYMDEB..........................................30
         4.5. Команды SYMDEB........................................32
         4.5.1. Команда ассемблирования.............................34
         4.5.2. Точки выхода........................................35
         4.5.3. Комментарии.........................................36
         4.5.4. Команда сравнения...................................37
         4.5.5. Команда "выдать"....................................37
         4.5.6. Команды дампа.......................................37
         4.5.7. Команды ввода с клавиатуры..........................39
         4.5.8. Просмотр символьного плана..........................41
         4.5.9. Команда "наполнения"................................42
         4.5.10. Команда Go.........................................42
         4.5.11. Справка о командах SYMDEB..........................43
         4.5.12. HEX-команда........................................43
         4.5.13. Команда ввода из порта.............................43
         4.5.14. Команда загрузки файла.............................44
         4.5.15. Команда перемещения................................44
         4.5.16. Команда установки имени............................45
         4.5.17. Команда открытия символьного плана.................45
         4.5.18. Команда вывода в порт..............................46
         4.5.19. P-трассировка......................................46

                                     -  4 -
           
           
         4.5.20. Команда выхода из SYMDEB...........................46
         4.6.21. Команды переназначения ввода/вывода................47
         4.5.22. Выдача регистров...................................47
         4.5.23. Смена экрана.......................................49
         4.5.24. Команда поиска.....................................49
         4.5.25. Команда установки режима индикации.................49
         4.5.26. Временный выход в DOS..............................50
         4.5.27. Команда выдачи кода исходной линии.................51
         4.5.28. Команда трассировки стека..........................51
         4.5.29. Команда установки символа..........................52
         4.5.30. T-трассировка......................................52
         4.5.31. Команда реассемблирования..........................52
         4.5.32. Команда выдачи исходной линии......................53
         4.5.33. Команда записи на диск.............................54
         5. CREF: утилита перекрестных ссылок.......................56
         5.1. Общие сведения........................................56
         5.2. Запуск CREF...........................................56
         6. LIB: утилита обслуживания библиотек.....................58
         6.1. Общие сведения........................................58
         6.2. Запуск LIB............................................58
         6.3. Функции и команды LIB.................................61
         6.3.1. Создание новой библиотеки...........................61
         6.3.2. Проверка содержимого библиотеки.....................61
         6.3.3. Листинг перекрестных ссылок библиотеки..............61
         6.3.4. Команды LIB.........................................62
         7. MAKE: утилита сопровождения программ....................64
         7.1. Общие сведения........................................64
         7.2. Запуск и особенности работы MAKE......................64
         7.3. Опции MAKE............................................66
         7.4. Макроопределения......................................66
         7.5. Правила вывода........................................67
            
         Приложение 1. Технология работы на макроассемблере  

                                         
                                      - 5 -
                             
                             
                           
                                 1. Введение.
               
               
               Настоящее  руководство  содержит  сведения  о том, как
         создавать и  отлаживать  программы  на  языке  ассемблера  с
         использованием MASM и утилит пакета макроассемблера. 
               Пакет макроассемблера фирмы  MICROSOFT включает в себя
         основные  программы,  необходимые  для  создания,  отладки и
         сопровождения программ на языке ассемблера.
               В   состав  пакета  макроассемблера  входят  следующие
         программные компоненты:
               MASM    -  макроассемблер
               LINK    -  объектный линкер 8086
               SYMDEB  -  символьный отладчик программ
               MAPSYM  -  генератор символьного файла
               CREF    -  утилита перекрестных ссылок
               LIB     -  утилита обслуживания библиотек
               MAKE    -  утилита сопровождения программ
               
               Обобщенная  схема   взаимодействия   программ   пакета
         приведена в Приложении 1. 
               Макроассемблер MASM создает  программы,  которые могут 
         быть выполнены микропроцессорами 8086, 8088, 80186 и  80286,
         а также может ассемблировать  программы  для  компьютеров  с
         сопроцессорами 8087 и 80287. 
               Линкер  LINK  обрабатывает выработанную MASM объектную
         программу  с  целью  разрешения  ссылок  к  другим   модулям
         и приведения  программы  к виду,  пригодному  для загрузки в
         память.
               Утилита LIB обеспечивает формирование  и  обслуживание
         библиотек объектных модулей, которые могут быть использованы
         LINK для разрешения внешних ссылок.
               Отладчик  SYMDEB  реализует   отладку   сформированной
         программы на двух уровнях: на уровне символических имен и на
         уровне абсолютных адресов.
               Программа   MAPSYM    предназначена    для    создания    
         символьного файла для SYMDEB. Символьный файл формируется на
         основе  информации,  полученной  от  MASM,  и  необходим для
         символьной отладки.
               Утилита CREF может быть использована для  формирования
         листинга  перекрестных  ссылок  программы,  наличие которого
         облегчает отладку. 
               При помощи утилиты MAKE  процесс  разработки  программ
         может быть автоматизирован. В файле описаний MAKE могут быть
         заданы различные алгоритмы вызовов и взаимодействия программ
         пакета (и не только их).
               Кроме  указанных  программ,  для создания ассемблерных
         исходных файлов необходим также редактор текстов, работающий
         в   коде  ASCII  без  управляющего  кода.  Многие  редакторы
         текстов, которые  обычно  используют  управляющие  коды  или

                                     -  6 -
           
           
         другие  специальные форматы в документах, обеспечивают также
         программирование   или   недокументированный    режим    для
         формирования ASCII-файлов. 
               Пакет макроассемблера работает в операционной  системе
         MS-DOS  или  PC-DOS  версии  2.0  и  выше  и требует наличия
         минимум 128К памяти (использование команды  !  SYMDEB  может
         потребовать  дополнительной памяти). 
               Программы    пакета    макроассемблера    описаны    в
         последующих разделах настоящего руководства.
               В  настоящем  руководстве  приняты  следующие условные
         обозначения.
               Конструкция, заключенная в одинарные квадратные скобки
         [ ], может отсутствовать.
               Из нескольких  конструкций,  разделенных символом  | ,
         может быть выбрана только одна.
               Символы,  ограниченные  знаками  <  слева  и > справа,
         являются   поясняющим  текстом  и  при  кодировании   должны
         замещаться требуемыми по смыслу конструкциями.
               Многоточие  ...  обозначает  возможность многократного
         повторения предшествующей конструкции.
               Обозначаемые  буквами терминальные символы конструкций
         даны в изображении регистра заглавных букв. При  кодировании
         это  не  является обязательным, кроме тех случаев, когда это
         оговорено особо.
                               
                                     -  7 -  
                         
                         
                         2. MASM: макроассемблер.
                         ------------------------
               
               
               
                          2.1. Общие сведения.
               
               
               Макроассемблер  MASM  фирмы   MICROSOFT   ассемблирует
         программы  на  языке  ассемблера  для микропроцессоров 8086,
         8088, 80186 и 80286 и создает переместимые объектные  файлы,
         которые  могут  редактироваться и выполняться в операционной
         системе MS-DOS.
               Макроассемблер   обеспечивает   выполнение   следующих
         функций:
               1. Анализ исходного  текста  на  языке  ассемблера  на
                  предмет   наличия    в    нем   макрокоманд   и/или
                  макроопределений и  обработка  этих  конструкций  с
                  соответствующей коррекцией исходного текста.
               2. Синтаксический анализ  полученного  текста и  вывод
                  необходимой диагностической информации.
               3. Формирование объектного модуля.
               
               Воспринимая в  качестве входа  один  файл  с  исходным
         текстом,  макроассемблер  может формировать до трех выходных
         файлов, как показано на рис. 2.1.
                                                      _____________
                                                      |           |
                                                  ____| имя.LST   |
                                                 |    | (листинг) |
                                                 |    |___________|
         ____________________   _____________    |    _____________
         |                  |   |           |    |    |           |
         |    имя.ASM       |___|  макроас- |____|____| имя.CRF   |
         | (исходный текст) |   |  семблер  |    |    | (перекр.  | 
         |__________________|   |___________|    |    |  ссылки)  |
                                                 |    |___________|
                                                 |    _____________
                                                 |    |           |
                                                 |____| имя.OBJ   |
                                                      | (объектн. |
                                                      |  модуль)  |
                                                      |___________|
                                                      
                                                    
                   Рис. 2.1. Работа макроассемблера.
               
               
               Расширения   имен  файлов,   показанные   на  рисунке,
         принимаются по умолчанию.
               Файл листинга содержит распечатку исходного  текста  в

                                     -  8 -
           
           
         соответствии со  специфицированными  директивами  ассемблера
         режимами  и  диагностическими   сообщениями  о   результатах
         синтаксического  анализа.  Эти  же сообщения  дублируются на
         консоли.
               Файл перекрестных ссылок содержит все используемые  во
         входном  тексте  идентификаторы.  В дальнейшем он может быть
         использован утилитой CREF.
               В файле объектного кода формируется объектный модуль.
         Этот файл не формируется, если в тексте обнаружены ошибки.
               
               
               
               
                      2.2. Запуск макроассемблера.
               
               
               Ассемблирование исходного файла может производиться  в
         двух режимах:
               1. С использованием подсказок.
               2. Посредством командной строки.
               
               Для запуска макроассемблера с использованием подсказок
         необходимо ввести командную строку,  содержащую  только  имя
         макроассемблера  MASM  со  спецификацией подоглавления, если
         она требуется. MASM перейдет в  диалоговый  режим  и  серией
         подсказок  запросит  у  пользователя  информацию о следующих
         файлах (ответ заключается  в  наборе  требуемых  символов  и
         нажатии клавиши ENTER): 
               1. Имя  исходного  файла.   Если при ответе не указано
                  расширение, предполагается ASM. 
               2. Имя объектного файла. Если при  ответе  не  указано
                  расширение,   предполагается   OBJ.   Базовое   имя
                  объектного  файла  по умолчанию совпадает с базовым
                  именем исходного файла. 
               3. Имя файла листинга.  Если  при  ответе  не  указано
                  расширение,  предполагается  LST. Базовое имя файла
                  листинга по умолчанию NUL.
               4. Имя файла перекрестных ссылок. Если при  ответе  не
                  указано расширение, предполагается CRF. Базовое имя
                  файла листинга по умолчанию NUL.
               
               В конце любого ответа после символов  /  или  -  могут
         быть заданы опции макроассемблера, которые описаны в п.2.3.
               Если в каком-либо ответе  специфицирован  символ  ;  ,
         MASM  выйдет  из  диалогового  режима и установит оставшиеся
         имена по умолчанию из следующего списка:
               <имя исходного файла>.OBJ 
               NUL.LST                      
               NUL.CRF   
               
               В любом ответе  также  могут  быть  заданы  ответы  на
         несколько  следующих  подсказок. В этом случае один ответ от
         другого отделяется запятой. 
               
               Для   запуска  MASM   посредством   командной   строки 


                                     -  9 -
           
           
         необходимо ввести командую строку следующего вида:
               
         MASM <имя исходного файла>[,[<имя объектного файла>]
         [,[<имя файла листинга>][,[<имя файла перек. ссылок>]]]]
         [<опции>][;]
               
               Символ ;  может  быть  специфицирован  в  любом  месте
         командной  строки  до того, как были определены все файлы. В
         этом  случае   имена   оставшихся   неопределенными   файлов
         принимаются  по  умолчанию  из  приведенного выше списка. Из
         этого же  списка  принимаются  по  умолчанию  имена  файлов,
         спецификация которых в командной строке опущена (посредством
         лишней запятой). 
               Если в командной строке  обнаружена  ошибка,  об  этом
         сообщается  через  консоль,  и  MASM  переходит в диалоговый
         режим. 
               Опции MASM могут располагаться в любом месте командной
         строки.
               
               Следующие  базовые  имена  выходных  файлов MASM имеют
         фиксированный смысл (независимо  от  того,  как  запускается
         MASM):
               NUL  - соответствующий файл не формируется
               PRN  - соответствующий файл направляется на печать
               
               Имя  каждого файла  может сопровождаться информацией о
         подоглавлении,  содержащем этот  файл, иначе поиск исходного
         файла или создание выходного файла будет  осуществляться   в
         текущем подоглавлении.
               Работа  MASM  может  быть  в  любой  момент прекращена
         нажатием клавиш CONTROL-C. 
               

               
               
                           2.3. Опции MASM.
                
                
               Опции  MASM  позволяют  в  некоторой степени управлять
         работой макроассемблера вне связи с исходной программой.
               Каждая опция обозначается  предшествующим  символом  /
         или  -  и может кодироваться как строчными, так и заглавными
         буквами.
               Опции могут  располагаться  в  любом  месте  командной
         строки или ответа на подсказку.
               Ниже  приведен   список   опций   MASM   с   описанием
         выполняемых ими функций.
               
               
         /A         - Сегменты  в  объектном  файле  располагаются  в
                      алфавитном   порядке.   При  отсутствии   опции
                      расположение сегментов соответствует порядку  в
                      исходном файле.
         
         /S         - Сегменты  в  объектном   файле  располагаются в

                                     - 10 -
           
           
                      порядке следования в исходном файле. Эта  опция
                      введена для совместимости с XENIX.
                     
         /B<число>  - Установить  размер  буфера  исходного  файла (в
                      килобайтах). Увеличение размера буфера ускоряет
                      ассемблирование,   но  требует  больше  памяти.
                      Размер буфера может варьироваться от  1  до  63
                      (К). Если опция не задана, полагается 32 (32К).
                     
         /D         - Диагностические  сообщения после  1-го  прохода
                      поместить в  листиг  программы.  Многие  ошибки
                      1-го  прохода  исправляются на 2-ом проходе, и,
                      если не  задано  /D,  в  листинг  не  попадают.
                      Задание   этой   опции   дает   более  глубокую
                      диагностику исходного текста. При  спецификации
                      /D   ошибки  как  1-го,  так  и  2-го  проходов
                      выдаются на консоль, даже если файл листинга не
                      создается.  
                     
         /D<символ> - Определить символ. Указанный символ вводится  в
                      исходный  текст как пустая  строка  (аналогично
                      использованию   директивы  EQU)  и  может  быть
                      использован     в     директивах      условного
                      ассемблирования.
                      
         /I<путь>   - Задание  пути  поиска  файлов,  подключаемых  в
                      исходный текст директивой  INCLUDE  без  явного
                      указания  пути.  Указание  пути в INCLUDE более
                      приоритетно, чем в опции /I.
                      
         /ML        - Установить   различие   между    строчными    и
                      заглавными   буквами  в  метках,  переменных  и
                      именах.  При  отсутствии  этой  опции  строчные
                      буквы  автоматически преобразуются в заглавные.
                      Опция может потребоваться для  совместимости  с
                      программами на регистро-чувствительных языках. 
                      
         /MX        - Установить   различие   между    строчными    и
                      заглавными    буквами   в   общих   и   внешних
                      переменных. Опция подобна /ML, но  ее  действие
                      распространяется  лишь на имена, используемые в
                      директивах PUBLIC или EXTRN.
                      
         /MU        - Преобразовать в общих и внешних именах строчные
                      буквы  в заглавные. Опция включена по умолчанию
                      и введена для совместимости с XENIX.
                      
         /N         - Запретить вывод в файл листинга  таблиц  макро,
                      структур,   записей,   сегментов   и  имен.  На
                      генерируемый код опция не влияет.
                      
         /P         - Контроль    запрещенного    кода.    Выполнение
                      некоторых   инструкций   микропроцессора  80286
                      может  привести  к  нежелательным  последствиям
                      (например,  загрузка  регистра CS). Кодирование
 
                                     - 11 -
           
           
                      таких инструкций может  быть  запрещено  опцией
                      /P,   наличие   которой   в    таких    случаях
                      вызывает   генерацию   ошибки   с   кодом  100.
                      Директива .286p отменяет эту опцию и  разрешает
                      кодирование запрещенных инструкций.
                      
         /R         - Генерация   кода  для  процессора  с  плавающей
                      точкой. Генерируются коды инструкций арифметики
                      с   плавающей   точкой,   которые   могут  быть
                      выполнены только при наличии сопроцессоров 8087
                      или 80287. 
                      
         /E         - Генерация  кода  для  эмуляции плавающей точки.
                      Генерируется   код,    эмулирующий   инструкции
                      арифметики  с  плавающей  точкой  сопроцессоров
                      8087 и 80287. Эта возможность используется  при
                      отсутствии    указанных    сопроцессоров.   При
                      использовании  этого  режима необходимо наличие
                      специальной  библиотеки  эмуляции,   содержащей
                      модули,   моделирующие   операции  с  плавающей
                      точкой  сопроцессоров   8087   и   80287.   Эта
                      библиотека  эмуляции  должна использоваться при
                      обработке объектного модуля с помощью LINK.
                      
         /V         - Включить в диагностику на консоль информацию  о
                      числе   обработанных   строк  и  символов.  При
                      отсутствии  этой  опции  на  консоль   выдается
                      информация об ошибках и памяти.
                                                
         /X         - Выводить  в  листинг  тела  блоков IF (IF, IFE,
                      IF1, IF2, IFDEF, IFNDEF,  IFB,  IFNB,  IFIDN  и
                      IFDIF),  для  которых  условия  ассемблирования
                      оказываются ложными  и код по этой  причине  не
                      генерируется.  Следующие  директивы  ассемблера
                      влияют на действие опции /X:
                        .SFCOND - подавляет печать "ложных" блоков;
                        .LFCOND - разрешает печать "ложных" блоков;
                        .TFCOND - каждая обработка  директивы  меняет
                                  состояние опции на противоположное.
                      
         /Z         - Выводить на  консоль  строки  исходного  файла,
                      содержащие ошибки. При отсутствии этой опции на
                      консоль выдаются только сообщение об  ошибке  и
                      номер   строки.   Кодирование  опции  замедляет
                      работу макроассемблера.
                      
         /C         - Создать   файл   перекрестных   ссылок.    Файл
                      создается,  даже  если  он  подавлен  командной
                      строкой или ответом на подсказку.  В  последнем
                      случае  имя  файла устанавлмвается по умолчанию
                      ( <имя исходного файла>.CRF ). Опция /C введена
                      для совместимости с XENIX.
                      
         /L         - Аналогично  /C,  но  относится к файлу листинга
                      (с учетом умалчиваемого имени файла).
 
                                     - 12 -
           
           
                      
         /T         - Подавить все сообщения, если в исходном  тексте
                      не встретится ошибок.
                                    
                                     - 13 - 
                                         
           
               
                           3. LINK: линкер модулей.
                           ------------------------
               
               
               
                            3.1. Общие сведения.
               
               
               Объектный    линкер    предназначен    для    создания
         исполнительных файлов  из  объектных  файлов, сформированных
         MASM или компиляторами C или PASCAL. 
               LINK   формирует   переместимый   исполнительный  код,
         снабженный  информацией  перемещения,   используя   которую,
         MS-DOS сможет загрузить в память и исполнить соответствующую
         программу. 
               LINK может формировать программы, содержащие свыше  1М
         кода и данных.
               Воспринимая в  качестве  входа  2  файла,  LINK  может
         формировать 2 выходных файла, как показано на рис.3.1.
             
      _____________                                      _____________
      |           |                                      |           |
      | имя.LIB   |----------                       ---->| имя.MAP   |
      | (библ-ка) |         |                       |    |  (план)   |
      |___________|         |                       |    |___________|
                            |                       |                 
                            |                       |                 
                            |      _____________    |                 
                            |      |           |    |                 
                            |      |           |    |                 
                            |----->|   LINK    |----|
                            |      |           |    |
                            |      |___________|    |                 
                            |                       |                
                            |                       |    
      _____________         |                       |    _____________
      |           |         |                       |    |           |
      | имя.OBJ   |         |                       |    | имя.EXE   |
      | (объектн. |----------                       ---->| (исполнит.|
      |   файл)   |                                      |   файл)   |
      |___________|                                      |___________|      
                     
               
                                                         
                         Рис. 3.1. Работа LINK.                
               
                                                         
               Расширения   имен  файлов,   показанные   на  рисунке
         принимаются по умолчанию.     
               Объектный  файл  содержит объектные модули программных
 
                                     - 14 -
           
           
         сегментов,  сформированные  MASM  или   компилятором   языка
         высокого уровня. 
               Библиотеки  содержат наборы модулей,  на которых могут
         ссылаться   программные   сегменты   в   объектном    файле.
         Библиотечные файлы формируются при помощи утилиты LIB.
               Основным     результатом    работы    LINK    является
         исполнительный файл, содержащий программу в виде,  пригодном
         для загрузки в память и  исполнения.  Некоторые  особенности
         формирования исполнительного файла описаны в п.3.4. 
               Файл плана является необязательным и содержит, если он
         формируется,   некоторую   диагностическую    и    служебную
         информацию,  которая  затем  при  посредстве  утилиты MAPSYM
         может быть использована в процессе отладки программы. 
               Файл  плана содержит имена, загрузочные адреса и длины
         всех сегментов программы. Кроме того, сюда  входят  имена  и
         загрузочные  адреса  групп в программе, адрес точки входа, а
         также сообщения о возможных ошибках. 
               Если задана опция /MAP, в файл включаются имена  общих
         символов и их загрузочные адреса.
               Если  заданы  опции  /HIGH  или  /DSALLOCATE  и  объем
         программы и данных в совокупности  не  превышает  64К,  план
         может   содержать   символы  с  необычно  большими  адресами
         сегментов. Эти  адреса  отражают  переменные,  расположенные
         ниже действительного начала сегмента. Пример:
               FFF0:0A20   TEMP
               Адрес TEMP - 00:920h.
               
               Необходимо  иметь  ввиду,  что,  кроме  двух  выходных
         файлов, LINK  может  формировать  временный  файл  с  именем
         VM.TMP.  Это  происходит  в  том  случае,  когда  линкеру не
         хватает   оперативной   памяти.   Соэдание   файла    VM.TMP
         сопровождается сообщением на консоли и всегда осуществляется
         в  текущем  подоглавлении. В этом случае нельзя использовать
         опцию /PAUSE  и  снимать  дискету,  если  она  находится  на
         активном драйве, до того, как LINK не уничтожит файл VM.TMP.
         Не рекомендуется создавать в текущем  подоглавлении  файл  с
         таким именем, который в этом случае может быть испорчен. 

               
                
                
                
               
               
               
                         3.2. Запуск LINK.
               
               
               Запуск LINK может быть осуществлен тремя способами:
               1. С использованием подсказок.
               2. При помощи командной строки DOS.
               3. С использованием файла ответа.
               
               
               Для запуска LINK с использованием подсказок необходимо
 
                                     - 15 -
           
           
         ввести командную строку, содержащую только имя линкера  LINK
         со  спецификацией  подоглавления,  если  она требуется. LINK
         перейдет в диалоговый режим и серией  подсказок  запросит  у
         пользователя    информацию   о   следующих   файлах   (ответ
         заключается в наборе требуемых символов  и  нажатии  клавиши
         ENTER): 
               1. Имя  объектного  файла.  Если при ответе не указано
                  расширение,    предполагается   OBJ.   Если   нужно
                  определить несколько файлов, их  имена  разделяются
                  символом  + . Если все имена не помещаются на одной
                  строке, ввод имен можно продолжить, поставив символ
                  +  в  последнюю  позицию  текущей  строки.  В  этом
                  случае   LINK    повторит    запрос    для    ввода
                  дополнительных имен.
               2. Имя  исполнительного  файла.  Если  при  ответе  не
                  указано расширение, предполагается EXE. Базовое имя
                  исполнительного  файла  по  умолчанию  совпадает  с
                  базовым именем объектного файла.
               3. Имя файла плана модуля. Если при ответе не  указано
                  расширение,  предполагается  MAP.  Базовое  имя  по
                  умолчанию NUL.
               4. Имя  библиотеки.  Если  при   ответе   не   указано
                  расширение,   предполагается  LIB.  Можно  задавать
                  несколько имен библиотек по аналогии с OBJ-файлами.
                  Если,   не   вводя   имени,   сразу  нажать  ENTER,
                  библиотеки использоваться не будут.
               
               В каждом ответе после  символа  /  могут  быть  заданы
         опции LINK, которые описаны в п.3.3.
               Если в каком-либо ответе  специфицирован  символ  ;  ,
         LINK  выйдет  из  диалогового  режима и установит оставшиеся
         имена по умолчанию из следующего списка:
               <имя объектного файла>.EXE 
               NUL.MAP 
               Библиотеки не используются.
               
               В любом ответе  также  могут  быть  заданы  ответы  на
         несколько  следующих  подсказок. В этом случае один ответ от
         другого отделяется запятой. 
               
               Для  запуска  LINK   посредством   командной   строки,
         необходимо ввести командую строку следующего вида:
               
         LINK <имя объектного файла>[,[<имя исполнительного файла>]
         [,[<имя файла плана>][,[<имя библиотеки>]]]][<опции>][;]
               
               Символ ;  может  быть  специфицирован  в  любом  месте
         командной  строки  до того, как были определены все файлы. В
         этом  случае   имена   оставшихся   неопределенными   файлов
         принимаются  по  умолчанию  из  приведенного выше списка. Из
         этого же  списка  принимаются  по  умолчанию  имена  файлов,
         спецификация которых в командной строке опущена (посредством
         лишней запятой). 
               Если в командной строке  обнаружена  ошибка,  об  этом
         сообщается  через  консоль,  и  LINK  переходит в диалоговый
 
                                     - 16 -
           
           
         режим.
             Если специфицирована хотя бы  одна  из  опций  /MAP  или
         /LINENUMBERS,  файл  плана  создается  независимо  от  того,
         указано ли его имя в командной строке. В этом  случае,  если
         его  имя  не специфицировано, оно принимается по умолчанию -
         <имя объектного файла>.MAP.
               При указании нескольких объектных файлов или библиотек
         их имена разделяются символами  + . 
               Если   определены   не   все   файлы  (но  не  опущены
         посредством лишней запятой, и не  специфицирована  установка
         оставшихся  имен  по  умолчанию  указанием  символа ;), LINK
         входит  в  диалоговый   режим   и   запрашивает   оставшиеся
         неопределенными имена через подсказки.
               
               Спецификации  имен  файлов  и опции могут быть заранее
         занесены в  специальный  файл  ответа.  Имя  этого  файла  с
         предшествующим  символом  @ и указанием пути поиска, если он
         нужен, может быть помещено в любом месте ответа на подсказку
         или  командной  строки  и трактуется, как если бы содержимое
         файла ответа было непосредственно  вставлено  в  это  место.
         Следует,    однако,   помнить,   что   комбинация   символов
         CARRIAGE-RETURN / LINE-FEED в файле ответа  интерпретируется
         как ENTER в подсказке или запятая в командном файле. 
               Общий вид файла ответа:
         <имя объектного файла>
         [<имя исполнительного файла>]
         [<имя файла плана>]
         [<имя библиотеки>]
               
               Каждая  группа  файлов  должна задаваться на отдельной
         строке,  а  файлы  в  группе,  если  их  несколько,   должны
         разделяться  символом + . Если группа не помещается на одной
         строке,  в последней позиции строки должен  стоять   признак
         продолжения  -  символ + . В любой строке файла ответа после
         символа / могут быть заданы опции LINK.
               В файле ответа  могут  быть  опущены  компоненты,  уже
         определенные ответами на подсказки или командной строкой. 
               При обнаружении в файле ответа симвода ; остаток файла
         игнорируется,    и    оставшиеся    неопределенными    имена
         устанавливаются по умолчанию из приведенного выше списка.
               При использовании файла ответа его содержимое выдается
         на  консоль в форме подсказок. Если определены не все имена,
         LINK переходит в диалоговый режим.
               Если  файл  ответа  не  содержит  комбинации  символов
         CARRIAGE-RETURN  /  LINE-FEED или символа ; , LINK выдает на
         консоль последнюю строку файла и ожидает нажатия ENTER.
               
               Имя  каждого файла  может сопровождаться информацией о
         подоглавлении,  содержащем этот  файл, иначе поиск исходного
         файла или создание выходного файла будет  осуществляться   в
         текущем подоглавлении.
               Работа  LINK  может  быть  в  любой  момент прекращена
         нажатием клавиш CONTROL-C.
               
               
 
                                     - 17 -
           
           
               
               
               
               
                          3.3. Опции LINK.
               
               
               Все  опции LINK обозначаются предшествующим символом /
         и могут быть сокращены произвольным образом, но  так,  чтобы
         код оставался уникальным среди опций. 
               Ниже  приведены  описания  всех  опций LINK (в скобках
         указаны минимальные сокращения):
               
         /HELP (HE)                - Выдать список действующих опций.
                                     Эту  опцию  нельзя  использовать
                                     вместе с именем файла.
                                    
         /PAUSE (P)                - Пауза  перед  записью  модуля  в
                                     EXE-файл  (и  после   записи   в
                                     MAP-файл,        если        это
                                     предусмотрено).  Во  время  этой
                                     паузы  можно  при  необходимости
                                     переставить    дискеты.     Если
                                     используется   файл  VM.TMP,  он
                                     должен  находиться  на  той   же
                                     дискете, что и EXE-файл.
                                     
         /EXEPACK (E)              - Установить   компактную   запись
                                     последовательностей   одинаковых
                                     бит.    Такой   EXE-файл   имеет
                                     меньший    объем    и    быстрее
                                     загружается  в  память,  но  его
                                     нельзя  отлаживать  при   помощи
                                     SYMDEB.  Опция дает эффект, если
                                     программа    содержит    длинные
                                     потоки    идентичных   битов   и
                                     требует  большого  числа  (более
                                     500) перемещений при загрузке.
                                     
         /MAP (M)                  - Формировать     MAP-файл.   Файл
                                     формируется,  даже  если  он  не
                                     специфицирован при запуске LINK,
                                     и   имеет    в    этом    случае
                                     умалчиваемое имя (п.3.2).
                                     
         /LINENUMBERS (LI)         - Зафиксировать в MAP-файле номера
                                     строк   исходного   файла.   Эта
                                     информация  может  в  дальнейшем
                                     использоваться MAPSYM и  SYMDEB.
                                     Запись   номеров   строк   будет
                                     производиться,  если   создается
                                     MAP-файл   и   объектный  модуль
                                     содержит   данные   о    строках
                                     исходного   текста.  Компиляторы
                                     FORTRAN и PASCAL (версии  3.0  и
 
                                     - 18 -
           
           
                                     выше)  и  C  (версии 2.0 и выше)
                                     такие    данные    автоматически
                                     формируют;   в   MASM   это   не
                                     предусмотрено. Если MAP-файл  не
                                     специфицирован,     его    можно
                                     создать  принудительно,   указав
                                     описываемую опцию в подсказке на
                                     этот файл.
                                     
         /NOIGNORECASE (NOI)       - Установить    различие     между
                                     строчными  и заглавными буквами.
                                     Различие может быть  установлено
                                     также опциями /ML и /MX MASM.
                                     
         /NODEFAULTLIBRARYSEARCH   - Игнорировать        умалчиваемые
          (NOD)                      библиотеки,  ссылки  на  которые
                                     содержатся  в  объектном  модуле
                                     (их  туда  помещают  компиляторы
                                     языков     высокого     уровня).
                                     Используются только  библиотеки,
                                     специфицированные   при  запуске
                                     LINK.
                                     
         /STACK:<число>  (ST)      - Установить   размер   стека   (в
                                     байтах).  Информация  о  размере
                                     стека, содержащаяся в  объектном
                                     модуле,   игнорируется.   Размер
                                     стека может быть  задан  в  виде
                                     десятичного,     8-ричного    (с
                                     предшествующим 0) или 16-ричного
                                     (с  предшествующими  0  и  x  на
                                     малом регистре) числа в пределах
                                     от  1  до  65535.  Размер  стека
                                     может  быть   изменен   утилитой
                                     EXEMOD.
                                     
         /CPARMAXALLOC:<число>     - Установить   максимальное  число
          (C)                        16-байтных           параграфов,
                                     необходимых     при     загрузке
                                     программы  в память. Обычно LINK
                                     устанавливает максимальное число
                                     параграфов        -       65535.
                                     Указание  этой  опции  позволяет
                                     более   эффективно  использовать
                                     память. Число  параграфов  может
                                     быть  задано в виде десятичного,
                                     8-ричного (с  предшествующим  0)
                                     или         16-ричного        (с
                                     предшествующими 0 и x  на  малом
                                     регистре)  числа в пределах от 1
                                     до 65535. Если число  параграфов
                                     недостаточно    для   размещения
                                     программы, LINK  наращивает  его
                                     до минимально подходящего. Число
                                     параграфов  может  быть изменено
 

                                     - 19 -
           
           
                                     утилитой      EXEMOD.      Кроме
                                     размещения    программы,   опция
                                     может понадобиться для команды !
                                     SYMDEB.
                                     
         /HIGH (H)                 - Установить      адрес     начала
                                     программы на наивысший возможный
                                     адрес свободной памяти. Без этой
                                     опции  установка  осуществляется
                                     на минимальный возможный адрес. 
                                     
         /DSALLOCATE (D)          -  Обработать   группу   с   именем
                                     DGROUP.  Обычно LINK присваивает
                                     младшему  байту  группы смещение
                                     0000h. При  задании  этой  опции
                                     старшему  байту  группы с именем
                                     DGROUP   присваивается  смещение
                                     FFFFh. В результате данные будут
                                     размещаться в областях программы
                                     с максимально большими адресами.
                                     Опция   /D   обычно  применяется
                                     вместе с  опцией  /H  для  более
                                     эффективного       использования
                                     незанятой   памяти   до   старта
                                     программы.   LINK  предполагает,
                                     что все свободные байты в DGROUP
                                     занимают  память непосредственно
                                     перед      программой.       Для
                                     использования  группы необходимо
                                     загрузить  в  регистр   сегмента
                                     адрес начала DGROUP.  
                                     
         /NOGROUPASSOCIATION       - Игнорировать     группы      при
          (NOG)                      присвоении   адресов   элементам
                                     данных и кода. Опция введена для
                                     совместимости с ранними версиями
                                     компиляторов  FORTRAN  и  PASCAL
                                     (версии MICROSOFT 3.13 и ранее и
                                     IBM до  2.0).  Не  рекомендуется
                                     использовать  эту опцию в других
                                     целях. 
                                     
         /OVERLAYINTERRUPT:<число> - Установить номер прерывания  при
          (O)                        загрузке   оверлейного   модуля.
                                     Указанное число  замещает  номер
                                     стандартного         оверлейного
                                     прерывания (03Fh).  Номер  может
                                     быть  задан  в виде десятичного,
                                     8-ричного (с  предшествующим  0)
                                     или         16-ричного        (с
                                     предшествующими 0 и x  на  малом
                                     регистре)  числа в пределах от 0
                                     до  255.  MASM  не  способствует
                                     созданию   оверлейных  программ.
                                     Поэтому только при помощи  опции
 
                                     - 20 -
           
           
                                     /O   ассемблерные  модули  могут
                                     быть   включены   в   оверлейные
                                     программы   на  языках  высокого
                                     уровня,   компиляторы    которых
                                     подерживают      оверлей.     Не
                                     рекомендуется      устанавливать
                                     номер,  совпадающий с каким-либо
                                     другим прерыванием.
                                     
         /SEGMENTS:<число>  (SE)   - Установить  максимальное   число
                                     сегментов,     которое     может
                                     обработать  LINK.  Число   может
                                     быть    задано   в   десятичной,
                                     8-ричной  (с  предшествующим  0)
                                     или 16-ричной (с предшествующими
                                     0 и x на малом регистре) форме в
                                     пределах   от  1  до  1024.  При
                                     отсутствии  спецификации   опции
                                     полагается      128.      Память
                                     выделяется   с   учетом    этого
                                     максимального числа сегментов.
                                     
         /DOSSEG (DO)              - Упорядочить      сегменты      в
                                     EXE-файле. При спецификации этой
                                     опции  сегменты  располагаются в
                                     следующей последовательности:
                                       - сегменты с классом CODE;
                                       - другие сегменты, не входящие
                                         в группу DGROUP;
                                       - сегменты, входящие в DGROUP.
                                     Обычная       последовательность
                                     сегментов  при  отсутствии   /DO
                                     описана в п.3.4.3.
                                     
                                     
                                     
                                     
                                     
                       3.4. Особенности работы LINK.
               
               
               LINK  создает  исполнительный  файл путем конкатенации
         кода   программы   и   сегментов   данных,   соответствующих
         корректным  инструкциям  исходного  текста.  Эта  сцепленная
         форма    сегментов    и    является    тем   "исполнительным
         представлением", которое непосредственно копируется в память
         при загрузке программы. 
               Частично    управлять    редактированием   программных
         сегментов можно заданием атрибутов в директиве  SEGMENT  или
         использованием  директивы  DGROUP  для  формирования  группы
         сегментов. Эти директивы определяют целую группу ассоциаций,
         классов и типов выравнивания, а также определяют  порядок  и
         относительные  начальные  адреса  сегментов  программы.  Эта
         информация является дополнительной к той,  которая  задается
         опциями LINK.
 
                                     - 21 -
           
           
               
               
               
               
                        3.4.1. Выравнивание сегментов.
               
               
               Для   установки   начального   адреса   сегмента  LINK
         использует задаваемый директивой SEGMENT  тип  выравнивания:
         BYTE,  WORD,  PARA или PAGE. Эти ключевые слова обеспечивают
         выравнивание  начала  сегмента  соответственно  по   границе
         байта,  слова  (2 байта), параграфа (16 байтов) или страницы
         (256 байтов). По умолчанию используется тип PARA.
               Байты, пропускаемые  из-за  выравнивания,  заполняются
         двоичными нулями.
               
               
               
               
                           3.4.2. Номер кадра.
               
               
               Вычисляемый  LINK  начальный адрес сегмента зависит от
         типа выравнивания сегмента и размеров  уже  скопированных  в
         исполнительный файл сегментов.
               Этот  адрес состоит из смещения и канонического номера
         кадра. Канонический адрес  кадра  определяет  адрес  первого
         параграфа  в  памяти,  содержащего  один  или  более  байтов
         сегмента. Номер кадра всегда кратен 16.  Смещением  является
         расстояние  в  байтах  от  начала параграфа до первого байта
         сегмента. 
               Для типов PAGE и PARA смещение всегда нулевое,  а  для
         типов BYTE и WORD может быть ненулевым.
               Номер  кадра  может  быть  получен  из  MAP-файла. Его
         содержат первые 5 16-ричных цифр start-адреса сегмента. 
               
               
               
               
               
                      3.4.3. Последовательность сегментов.
               
               
               LINK  копирует сегменты в исполнительный файл в той же
         последовательности, в какой он  их  считывает  из  объектных
         файлов. 
               Сегменты, имеющие идентичные имена классов,  считаются
         принадлежащими   к   одному  типу  классов  и  копируются  в
         исполнительный файл как непрерывный блок.
               Порядок загрузки сегментов и способы  управления  этим
         порядком  путем  присваивания  типов  классов  обсуждаются в
         п.3.4.3 MICROSOFT MACRO ASSEMBLER REFERENCE MANUAL.
               
               
                
 

                                     - 22 -
           
           
                
                
               
               
               
                        3.4.4. Комбинированные сегменты.
               
               
               Для определения того, будут ли два или более сегмента,
         имеющие  одно и то же имя, соединены в один большой сегмент,
         LINK  использует  комбинации  типов   сегментов.   В   языке
         ассемблера имеются следующие типы комбинаций: PUBLIC, STACK,  
         COMMON,  MEMORY,  AT  и  PRIVATE  (п.3.4.2  MICROSOFT  MACRO
         ASSEMBLER REFERENCE MANUAL).
               Если   сегмент   имеет  тип  комбинации  PUBLIC,  LINK
         автоматически  соединяет  его с другими сегментами, имеющими
         то  же имя и принадлежащими к тому же классу. При соединении
         сегментов предполагается,  что  сегменты  непрерывны  и  все
         адреса  в  сегментах  доступны  через  смещение относительно
         адреса кадра.  Результат получается таким же,  как  если  бы
         полученный  большой  сегмент  был определен в исходном файле
         сплошным куском.
               LINK сохраняет тип выравнивания каждого сегмента.  Это
         означает,  что,  хотя  сегменты  и  включены  в один большой
         сегмент,  код  и  данные  сегментов  сохраняют   свои   типы
         выравнивания.
               Если  размеры  соединяемых  сегментов  превышают  64К,
         выдается сообщение об ошибке.
               Если  сегмент  имеет  тип   комбинации   STACK,   LINK
         выполняет  ту  же  операцию, что и в случае PUBLIC. Различие
         заключается в том, что для STACK-сегментов в  исполнительный
         файл   записывается   начальное  значение  указателя  стека,
         которое  представляет  собой  смещение  от  конца первого по
         порядку сегмента стека или комбинированного сегмента  стека.
         В  этом  случае  при  использовании типа STACK для сегментов
         стека  программисту  нет  необходимости  предусматривать   в
         программе загрузку регистра SS.
               Если   сегмент   имеет  тип  комбинации  COMMON,  LINK
         автоматически соединяет его с другими  сегментами,  имеющими
         то  же  имя и принадлежащими к тому же классу. Однако, когда
         LINK  соединяет  общие  сегменты,  начало  каждого  сегмента
         устанавливается  на один адрес, в результате чего образуются
         серии перекрывающихся сегментов.  В  итоге  получается  один
         сегмент,  который  по  длине  не  превышает самый длинный из
         комбинируемых сегментов.
               Сегменты с типом комбинации MEMORY трактуется  LINK  в
         точности  так  же,  как и PUBLIC-сегменты. MASM обеспечивает
         тип MEMORY для совместимости с линкерами, выделяющие  MEMORY
         как особый тип комбинации.
               Сегмент  имеет  тип  комбинации  PRIVATE в том случае,
         когда в исходном файле нет точных указаний относительно  его
         типа комбинации. LINK не объединяет PRIVATE-сегменты.
               
               
               
 
                                     - 23 -
           
           
                              3.4.5. Группы.
               
               
               Объединение  нескольких  сегментов  в группу позволяет
         адресовать их относительно одного  адреса  кадра.  При  этом
         неважно,  принадлежат ли эти сегменты к одному классу. Когда
         LINK  обнаруживает  группу,   он   соответствующим   образом
         перестраивает все адресные ссылки в ней.
               Сегменты в группе не являются смежными, не принадлежат
         к одному классу и имеют разные типы комбинации. Но суммарный
         объем всех сегментов в группе не должен превышать 64К.
               Группы не  влияют  на  порядок  загрузки  сегментов  в
         память.  Даже  если  используются  имена классов и объектные
         файлы вводятся  в  соответствующей  последовательности,  нет
         гарантии,  что  сегменты  будут  смежными.  На практике LINK
         может поместить не принадлежащий группе сегмент в те же  64К
         памяти.
               Хотя в LINK и нет строгой проверки того, помещаются ли
         все  сегменты группы в 64К памяти, при обнаружении нарушения
         этого  условия  будет  выдано   сообщение   о   переполнении
         согласования.
               
    
               
               
                            3.4.6. Согласования.
               
               
               Когда  в процессе работы LINK уже известны адреса всех
         сегментов программы и организованы все комбинации  сегментов
         и  группы,  линкер имеет возможность "согласовать" некоторые
         неразрешенные ссылки к меткам и переменным. Для  этого  LINK
         вычисляет   соответствующие  адрес  сегмента  и  смещение  и
         замещает временные значения, сгенерированные ассемблером, на
         новые значения. 
               В  соответствии  с  типами   ссылок   LINK   реализует
         следующие типы согласований: 
               1. Короткие.
               2. Внутренние относительно себя.
               3. Внутренние относительно сегмента.
               4. Длинные.
               
               Размер  вычисляемого  значения зависит от типа ссылки.
         Если  LINK  обнаруживает  ошибку  в  предсказанном   размере
         ссылки,  выдается сообщение о переполнении согласования. Это
         может  произойти,   например,   когда   программа   пытается
         использовать  16-битовое смещение для доступа к инструкции в
         сегменте, имеющем другой адрес кадра. Это же сообщение может
         быть выдано, если все сегменты в группе не помещаются внутри
         блока памяти в 64К.
               Короткая  ссылка  имеет  место   в   инструкции   JMP,
         передающей  управление  на  помеченную  инструкцию  в том же
         сегменте или группе, отстоящую от JMP не более, чем  на  128
         байтов.  Для  такой ссылки LINK вырабатывает 8-битовое число
         со  знаком.   Если   инструкция,   на   которую   передается
 
                                     - 24 -
           
           
         управление,  находится  в  другом  сегменте или группе, т.е.
         имеет другой адрес кадра, или  отстоит  более,  чем  на  128
         байтов в любом направлении, формируется сообщение об ошибке.
               Внутренняя  относительно  себя  ссылка  имеет  место в
         инструкциях, адресующих данные относительно того же сегмента
         или  группы.  Для  такой  ссылки  LINK  формирует 16-битовое
         смещение. Если данные не принадлежат тому  же  сегменту  или
         группе, выдается сообщение об ошибке.
               Внутренняя относительно  сегмента ссылка имеет место в
         инструкциях, адресующих данные в определенном  сегменте  или
         группе  или  относительно  указанного регистра сегмента. Для
         этой ссылки  LINK  вырабатывает  16-битовое  смещение.  Если
         это смещение  внутри  специфицированного  кадра  оказывается
         больше 64К или меньше 0 или если начало канонического кадра,
         содержащего   требуемые   данные,   неадресуемо,    выдается
         сообщение об ощибке.
               Длинная   ссылка   имеет  место  в  инструкциях  CALL,
         передающих управление в другой сегмент или  группу.  LINK  в
         этом случае вырабатывает 16-битовый адрес кадра и 16-битовое
         смещение. Если вычисленное смещение больше 64К или меньше  0
         или  если  начало  канонического кадра, в который передается
         управление, неадресуемо, формируется сообщение об ошибке.
               
    
               
               
                          3.4.7. Поиск библиотек.
               

               
               Процедура  поиска  библиотеки,  иногда  требуемой  для
         разрешения     внешних     ссылок,    обладает    некоторыми
         особенностями.  Если  путь  поиска  указан  вместе  с именем
         библиотеки в командной строке, поиск  осуществляется  только
         там.  Если  же  путь  явно  не  указан, поиск производится в
         следующей последовательности:
               1. В текущем подоглавлении.
               2. Если в командной строке заданы один  или  несколько
                  путей    поиска   для   других   библиотек,    LINK
                  просматривает их в порядке следования в строке. 
               3. На путях, определенных переменной LIB  команды  DOS
                  SET.   При помощи команды  SET  могут  быть  заданы 
                  несколько  путей   поиска,   разделяемых  точкой   с
                  с запятой. Вид команды SET:
                     SET LIB=<список путей>

                                             
                                     - 25 -
               
               
               
                    4. SYMDEB: символьный отладчик программ.
                    ----------------------------------------
               
               
               
               
                           4.1. Общие сведения.
               
               
               
               При  помощи  символьного  отладчика  SYMDEB могут быть
         выполнены следующие функции:
               1. Просмотр и исполнение кода программы.
               2. Внесение в тело  программы  точек  выхода,  которые
                  останавливают исполнение программы.
               3. Проверка и изменение в памяти значений переменных.
               4. Ассемблирование и реассемблирование кода.
               5. Отладка  программ,  использующих  соглашения языков
                  MICROSOFT  об  эмуляции  арифметики   с   плавающей
                  точкой.  
               
               Имеется   возможность   временного   выхода  в  DOS  с
         последующим возвратом в SYMDEB и сохранением его состояния.
               SYMDEB имеет несколько  способов  адресации  данных  и
         инструкций  в памяти. К различным фрагментам программы можно
         получить доступ через адреса, глобальные символы или  номера
         строк,  что  упрощает  размещение  и  отладку  специфических
         участков кода.
               Программы на языках C, PASCAL  и  FORTRAN  могут  быть
         отлажены  как  на  уровне  исходных  файлов, так и на уровне
         исполнительного  кода.  При   этом   пользователю   доступны
         исходные предложения, реассемблированный машинный код или их
         комбинация в зависимости от режима работы SYMDEB.
               
               
               
               
               
                     4.2. Подготовка символьной отладки.
               
               
               
               Сущность символьной отладки заключается в том,  что  в
         процессе  отладки программы имеется возможность ссылаться на
         элементы  исходной  программы  (очевидно,  что   для   этого
         исходный файл должен быть доступен SYMDEB). 
               SYMDEB  является сильным отладочным средством даже без
         своих  возможностей  символьной  отладки, однако, при этом в
         значительной степени теряется наглядность работы, что  часто
         существенно  усложняет  отладку.  С  другой стороны, заметно
 
                                     - 26 -
         
         
         упрощается  процесс  подготовки  к  отладке,  особенно   для
         программ на языке ассемблера. 
               Для  символьной  отладки  при помощи SYMDEB необходимо
         предварительно  сформировать  специальный  символьный  файл,
         куда    должна   быть   занесена   информация,   позволяющая
         "привязать" элементы исходной программы (переменные,  метки,
         номера   строк   и  т.п.)  к  относительным  адресам  внутри
         программных сегментов на уровне исполнительного кода.
               Необходимо  помнить,  что  все  имена,  участвующие  в
         символьной   отладке,  должны   быть  объявлены  (средствами
         конкретного  языка)  как  общие, т.е. должны быть доступными
         программе LINK при согласовании внешних ссылок. 
               
               
               
               
               
               
               4.2.1. Исходная информация для символьной отладки. 
               
               
               
               Этапы  формирования  символьного   файла   существенно
         зависят от того,  каким транслятором обрабатывалась исходная
         программа.  Дело  в  том,  что  некоторые   компиляторы   не
         обеспечивают  информацию  о номерах строк исходного файла, и
         для такой программы допустима лишь  ограниченная  символьная
         отладка  (без  адресации  по номерам строк). Кроме того, при
         работе с макроассемблерами имеется целый ряд характерных для
         языков  типа  ассемблера  особенностей,  вносящих  в процесс
         отладки  определенную  специфику.  Сущность  этой  специфики
         станет понятной при ознакомлении с командами SYMDEB.
               По  указанным  причинам при работе с SYMDEB и особенно
         при подготовке символьной отладки следует всегда  учитывать,
         каким компилятором обрабатывалась исходная программа.
               SYMDEB совместим со следующими компиляторами:
               - MICROSOFT FORTRAN версии 3.0 и выше
               - MICROSOFT PASCAL версии 3.0 и выше
               - MICROSOFT C версии 2.0 и выше
               - MICROSOFT макроассемблер версии 1.0 и выше
               - MICROSOFT BASIC COMPILER версии 1.0 и выше
               - MICROSOFT BUSINESS BASIC COMPILER версии 1.0 и выше
               - IBM PC FORTRAN версии 2.0 и выше
               - IBM PC PASCAL версии 2.0 и выше
               - IBM PC макроассемблер версии 1.0 и выше
               - IBM PC BASIC COMPILER версии 1.0 и выше
               
               Из  них лишь следующие компиляторы поддерживают работу
         SYMDEB на уровне номеров строк исходного файла:
               - MICROSOFT FORTRAN версии 3.0 и выше
               - MICROSOFT PASCAL версии 3.0 и выше
               - MICROSOFT C версии 2.0 и выше
               - IBM PC FORTRAN версии 2.0 и выше
               - IBM PC PASCAL версии 2.0 и выше
               
 
                                     - 27 -
         
         
               Конечной целью подготовки символьной отладки  является
         создание    символьного    файла.   В   общем   случае   это
         осуществляется    путем    обработки    исходной   программы
         соответствующим    компилятором    и   программой   LINK   и
         формирования  на  основе  полученной  информации  собственно
         символьного файла при помощи программы MAPSYM (эта программа
         описана в п.4.2.2).
               Для   создания   символьного   файла   при   работе  с
         макроассемблерами необходимо выполнить следующие шаги:
               1. Символы,   которые   будут   использованы   SYMDEB,
                  объявить  как общие. Среди этих символов могут быть
                  имена процедур, переменных и меток. Имена сегментов
                  и  групп  не  могут  быть  объявлены общими, но они
                  автоматически включаются LINK в  MAP-файл  и  могут
                  быть  использованы  при отладке. Пользователь может
                  объявить фиктивные метки, которые  в  программе  не
                  используются,  но могут пригодиться при расстановке
                  точек выхода.
               2. Ассемблировать исходный файл макроассемблером.
               3. Обработать  полученный  объектный  файл  программой
                  LINK с опцией /MAP и получить EXE- и MAP-файлы.
               4. Использовать MAPSYM для создания символьного файла.
                  
               Для  создания  символьного  файла при работе с другими
         совместимыми с SYMDEB компиляторами (кроме макроассемблеров)
         необходимо выполнить следующие шаги:
               1. Компилировать исходный файл. При этом для упрощения
                  отладки  желательно  не  использовать  имеющиеся  в
                  компиляторе средства оптимизации. При необходимости
                  (и  возможности)  следует  обеспечить   наличие   в
                  объектном файле информации о номерах строк исходной
                  программы.
               2. Полученный  объектный  файл  обработать  программой
                  LINK  с  опциями /MAP и, если нужно, /LINENUMBERS и
                  получить EXE- и MAP-файлы.
               3. Использовать MAPSYM для создания символьного файла. 
               4. Запустить SYMDEB для символьной отладки (п.4.3.1).
               5. Использовать  команду  SYMDEB  Go  (G) для  запуска
                  тестируемой  программы  с  первой   процедуры   или
                  функции.  Это обеспечивается специальной программой
                  запуска  из  библиотеки  программ  данного   языка.
                  Обычно   пользователю  не  нужна  трассировка  этой
                  программы, и он желает начинать отладку  с  момента
                  начала работы своей программы. В C-программе первая
                  выполняемая   функция   всегда   называется   _main
                  (компилятор   C   добавляет   символ   _   к  имени
                  процедуры main),  в  FORTRAN-программе  -  main,  в
                  PASCAL-программе  -  первая  процедура  в  исходном
                  файле).
                  
                  
                  
                  
                  
                  
 
                                     - 28 -
         
         
               
                  
            4.2.2. Формирование символьного файла при помощи MAPSYM.
                  
                  
                  
               
                  
                Программа  MAPSYM  предназначена  для  преобразования
         информации  из  MAP-файла,  сформированного  LINK,  в форму,
         понятную SYMDEB. Создаваемый символьный файл может содержать
         до 10000 символов для каждого сегмента и столько  сегментов,
         сколько допустимо с точки зрения машинной памяти.
                Запуск   MAPSYM  обеспечивается  введением  следующей
         командной строки:
               
         MAPSYM [/L | -L]<имя MAP-файла>
               
               Имя MAP-файла может содержать спецификацию пути поиска
         в структуре оглавления, если это необходимо. Если не указано
         расширение имени, предполагается MAP.
               Задание  единственной  опции  /L  (или  -L)  позволяет
         получить на экране дисплея информацию о преобразовании, куда
         входят  имена  определенных  в программе групп, адрес начала
         программы,  число  сегментов  и  число  символов  в   каждом
         сегменте.
               Символьный  файл  имеет  базовое  имя,  совпадающее  с
         базовым   именем   MAP-файла,  и  расширение  SYM  и  всегда
         создается в текущем подоглавлении.
               
               
               
               
               
               
               
                            4.3. Запуск SYMDEB.
               
               
               
               Запуск   SYMDEB   обеспечивается  введением  следующей
         командной строки:
               
         SYMDEB [<опции>][<символьные файлы>][<исполнительный файл>]
         [<аргументы>]
               
               Опции SYMDEB описаны в п.4.4.
               В  некоторых  случаях  (например,  при   использовании
         оверлея  или  при  работе  с драйверами) может потребоваться
         несколько символьных файлов.  Все  они  в  командной  строке
         должны  быть специфицированы до имени исполнительного файла,
         т.к.  имена,  стоящие  после  имени  исполнительного   файла
         считаются аргументами.
               Исполнительным  файлом   может   быть   двоичный   или
         EXE-файл, содержащий тестируемую программу. SYMDEB загружает
 
                                     - 29 -
         
         
         этот файл в память. 
               Аргументы,  если  они  указаны,  передаются  SYMDEB  в
         заголовок   тестируемой   программы   в  точности,  как  они
         специфицированы, и могут быть использованы  этой  программой
         как параметры.
               Стартовав,  SYMDEB  выдает  сообщение об этом и символ
         - , после которого можно вводить команды SYMDEB.
               
               
               
               
               
               
               
                 4.3.1. Запуск SYMDEB для символьной отладки.
               
               
               
               При  использовании  символьной  отладки  в   командной
         строке  запуска SYMDEB должен быть специфицирован символьный
         файл.
               При загрузке нескольких символьных файлов сразу  будет
         открыт только один из них. Если  один  из  специфицированных
         символьных  файлов  имеет базовое имя, совпадающее с базовым
         именем исполнительного файла, открывается именно  он,  иначе
         будет открыт первый из указанных символьных файлов. Во время
         сеанса SYMDEB для  открытия  конкретного  файла  может  быть
         использована  команда  XO.  Так  как одновременно может быть
         открыт только один  символьный  файл,  предыдущий  файл  при
         выполнении команды XO закрывается. 
               Исполнительный  файл  может  быть  специфицирован  при
         загрузке  символов.  Символы  могут   быть   загружены   без
         исполнительного  файла  (это может потребоваться для отладки
         резидентной  программы).  Если  возникнет  необходимость   в
         загрузке исполнительного файла позже в текущем сеансе, могут
         быть использованы команды N или L.
               Не  следует  переименовывать  символьные  файлы,  т.к.
         тогда при загрузке они будут иметь неверные адреса.
               
               
               
               
               
               4.3.2. Запуск SYMDEB только с исполнительным файлом.

               
               
               Если пользователь не нуждается в символьном файле  или
         не  имеет  исходного  файла  программы,  в  командной строке
         запуска SYMDEB он может опустить имя символьного файла.
               SYMDEB будет загружать исполнительные  файлы,  имеющие
         расширения имен EXE, BIN, HEX или COM.
               Всякий  раз  при загрузке исполнительного файла SYMDEB
         формирует  256-байтный  заголовок  в   сегменте   памяти   с
         наименьшим  возможным  адресом  и  копирует содержимое файла
 
                                     - 30 -
         
         
         непосредственно  после  заголовка.  SYMDEB  помещает  размер
         программы  в  байтах  в пару регистров BX:CX и устанавливает
         значения  всех  остальных   регистров   в   соответствии   с
         содержимым файла. 
               Для  EXE-  и  HEX-файлов  заголовок при загрузке будет
         разорван на части. Поэтому размер программы в этом случае не
         соответствует  размеру файла, как это имеет место для COM- и
         BIN-файлов.
               
               
               
               
                      4.3.3. Запуск SYMDEB без файлов.
               
               
               
               Если в  командной  строке  запуска  не  указаны  имена
         файлов,  SYMDEB  создает  заголовок  программы, но ничего не
         загружает.  Для  продолжения   работы   пользователь   может
         использовать   команды   ассемблирования   (A),  ввода  (E),
         установки имени (N) или загрузки (L).
               При запуске без файлов SYMDEB  перед  началом  отладки
         очищает  флаги,  в  регистр  IP  загружает  значение  0100h,
         устанавливает регистры сегментов на "дно" свободной памяти и
         обнуляет остальные регистры.
               
               
               
               
               
                            4.4. Опции SYMDEB.
               
               
               Опции  SYMDEB обозначаются предшествующими символами /
         или  -  и могут кодироваться как заглавными, так и строчными
         буквами. В командной строке запуска SYMDEB они располагаются
         перед именем исполнительного файла. 
               Имена файлов,  содержащие  символ   - ,  во  избежении
         путаницы дожны быть изменены.
               Описание опций SYMDEB приведено ниже.
               
         /IBM (или I) - Установить совместимость с IBM. При работе на
                        не  IBM-машине  эта опция позволяет учитывать
                        некоторые    особенности    аппаратуры    IBM
                        (контроллер  прерываний  8259,  дисплей IBM и
                        другие  особенности  BIOS).  При  работе   на
                        IBM-машине   эти   особенности   распознаются
                        автоматически.
                        
         /K           - Разрешение интерактивного  выхода  по  ключу.
                        При  задании  этой  опции клавиша SCROLL-LOCK
                        (BREAK) программируется таким образом, что ее
                        нажатие  останавливает  исполнение программы.
                        Это может понадобиться, например, для  выхода
 
                                     - 31 -
         
         
                        из  бесконечного  цикла.  Интерактивный  ключ
                        работает примерно также, как ключ  прерывания
                        от  аппаратуры, но менее надежно. В некоторых
                        ситуациях  (например,   когда   замаскированы
                        прерывания) он не срабатывает. Если программа
                        ожидает ввода, предпочтительней  использовать
                        CONTROL-C,  чем  BREAK.  В IBM PC AT в тех же
                        целях, но  даже  без  опции  /K,  может  быть
                        использован ключ SYS REQ.
                        
         /N           - Разрешение     выхода    по    немаскируемому
                        прерыванию.  Для  работы   с   немаскируемыми
                        прерываниями  вычислительная  система  должна
                        иметь соответствующее аппаратное обеспечение.
                        Опцию  /N  можно  использовать  со следующими
                        продуктами:
                          - специальная утилита отладки фирмы IBM
                          - зонд математического обеспечения фирмы
                            ATRON
                        При использовании опции /N  SYMDEB  требуется
                        аппаратура,  поставляемая с этими продуктами.
                        Дополнительного  математического  обеспечения
                        не  требуется.  При  использовании  одного из
                        этих продуктов в системе,  отличной  от  IBM,
                        для  обеспечения  выхода  нужно  использовать
                        опцию /N.  Но  эту  опцию  нельзя  кодировать
                        при  работе  на IBM PC. Использование системы
                        выхода    по    немаскируемому     прерыванию
                        предпочтительней   интерактивного  выхода  по
                        ключу,   т.к.   не   зависит   от   состояний
                        прерываний и других условий.
                        
         /S           - Разрешение  смены экрана. Эта опция позволяет
                        разделить экраны: один для отладчика,  другой
                        -  для  отлаживаемой  программы.  Это удобно,
                        например, при отладке  графических  программ,
                        но требует дополнительно 32К памяти. Опция /S
                        работает только на  IBM-машинах  и  некоторых
                        совместимых с ними компьютерах. При работе на
                        совместимых компьютерах в этом случае  должна
                        быть  специфицирована  также  и  опция  /IBM.
                        Опция  /S  не  может  быть   использована   с
                        графикой, требующей более 32К памяти.
                        
         /"команды"   - Выполнить серию команд SYMDEB. Команды должны
                        разделяться символом  ;  и  выполняются после
                        загрузки  файлов,  но  перед  их исполнением.
                        Этой  опцией  могут  быть,  например,  заданы
                        команды,  выполняемые в начале каждого сеанса
                        SYMDEB.
                        
                        
                        
                        
                        
 
                                     - 32 -
         
         
               
               
               
                        
                               4.5. Команды SYMDEB.
                        
               
                        
                        
               При помощи команд SYMDEB реализуется алгоритм отладки,
         а также обеспечивается выполнение основных функций SYMDEB. 
               Команды  SYMDEB  вводятся  в  диалоговом  режиме после
         приглашающего  символа  -  .  Группа   команд   может   быть
         выполнена до начала отладки как показано в п.4.4.
               Введенную  команду  SYMDEB  можно  отменить   нажатием
         клавиш  CONTROL-C  или  задержать нажатием клавиш CONTROL-S.
         Если отлаживаемая программа обратилась к вводу/выводу, этими
         клавишами  можно отменить или задержать введенную команду G.
         Если программа не обратилась к вводу/выводу,  остановить  ее
         выполнение  можно  только  соответствующими  клавишами, если
         были заданы опции /K или /N (п.4.4).
               Некоторые команды имеют параметры, которыми могут быть
         числа, символы или выражения.  Параметры, если их несколько,
         разделяются   запятыми.   Между   именем  команды  и  первым
         параметром пробела не требуется, исключая те случаи, где это
         оговорено особо.
               Ниже приведено описание способов кодирования различных
         типов параметров в командах SYMDEB.
               1.  Символы  могут  представлять  регистр,  абсолютное
         значение,  адрес сегмента или смещение сегмента и состоят из
         одного или более символов, включая  _ , ? , @ и  $ .  Первым
         символом   должна   быть  буква.  Все  символы  должны  быть
         определены в символьном  файле.  SYMDEB  не  чувствителен  к
         смене  регистра. При совпадении символов с именами регистров
         последние имеют больший приоритет.
               2. Числа представляются в виде:
                    <число>Y - двоичное
                    <число>O - 8-ричное
                    <число>Q - 8-ричное
                    <число>T - десятичное
                    <число>H - 16-ричное
         Допустимо  кодирование  ключевых  символов Y, O, Q, T и H на
         регистре строчных букв. При распознавании чисел максимальный
         приоритет имеют 16-ричные числа.
               3. Адреса представляются в виде:
                    <сегмент>:<смещение>
         <Сегмент> и <смещение> могут быть числами (представимыми как
         16-разрядные),  именами  регистров  или  символами.   Многие
         команды имеют умалчиваемые имена регистров (DS или CS).
               4. В качестве смещения могут быть указаны границы:
                    <начальный адрес> <конечный адрес>
         Если   <конечный   адрес>  опущен,  предполагается  значение
         <начальный адрес>+128.
               5. В качестве смещения может быть задан счетчик:
                    <начальный адрес> L <число объектов>
 
                                     - 33 -
         
         
         Размер объекта (байт, слово, инструкция и т.д.) определяется
         использующей эту конструкцию командой.
               6.   Номер   линии   представляет   собой   комбинацию
         десятичных  чисел,  имен  файлов  и  символов,  определяющих
         уникальную  линию  исходного  текста  программы. Номер линии
         может быть задан в трех различных формах:
                    .+<число> | - <число>
                    .[<имя файла>:]<число>
                    .<символ>[+<число> | -<число>]
         Первая форма определяет  смещение  (в  линиях)  относительно
         текущей  линии  исходного  текста.  Вторая  форма отображает
         абсолютный номер линии в файле с указанным именем. Если  имя
         файла  опущено,  предполагается  текущий  файл, определяемый
         текущими значениями регистров  CS  и  IP.  В  третьей  форме
         <символ>  может  быть инструкцией или меткой процедуры. Если
         задано  <число>,   оно   является   смещением   (в   линиях)
         искомой   линии   относительно   линии,   идентифицированной
         указанным символом.
               7. Строки являются набором значений  в  коде  ASCII  и
         могут быть заданы в двух форматах:
                    \&'<символы>'
                    "<символы>"
         Если  в  строке  присутствуют  символы  ' или " , их следует
         кодировать дважды.
               8. Выражение представляет собой комбинацию  параметров
         и операторов, которая преобразуется в 8-, 16- или 32-битовое
         значение.  Могут  использоваться  скобки.  Унарные  адресные
         операторы подразумевают регистр DS как умалчиваемую адресную
         базу (сегмент). 
               Ниже приведены унарные операторы (в  порядке  убывания
         приоритетов):
                    +
                    -
                    NOT   - дополнение операнда до 1
                    SEG   - адрес сегмента операнда
                    OFF   - смещение операнда
                    BY    - младший байт из указанного адреса
                    WO    - младшее слово из указанного адреса
                    DW    - двойное слово из указанного адреса
                    POI   - указатель из указанного адреса (как DW)
                    PORT  - 1 байт из указанного порта
                    WPORT - слово из указанного порта
               Ниже  приведены бинарные операторы (в порядке убывания
         приоритетов):
                    *
                    /   - деление нацело
                    MOD - modulus
                    :   - переключение сегмента
                    +
                    -
                    AND - побитовое И
                    XOR - побитовое исключающее ИЛИ
                    OR  - побитовое И
               
               
 
                                     - 34 -
         
         
               
               
               
               
               
                       4.5.1. Команда ассемблирования.
               
               
               
               Синтаксис:
               
               A[<адрес>]
               
               Команда    ассемблирует    мнемонические    инструкции
         семейства  процессоров 8086 (8086, 8087, 8088, 80186, 80287,
         80286  -  незащищенные)  и  помещает   полученный   код   по
         указанному  адресу.  Если  адрес  не указан, он определяется
         содержимым регистров CS и IP.
               При введении  команды  A  выдается  текущий  адрес,  и
         SYMDEB  ожидает  введения  новых  инструкций,  которые могут
         кодироваться   строчными   или   заглавными   буквами    или
         вперемешку. Инструкции ассемблируются по одной.
               Ввод каждой  инструкции  отмечается  нажатием  клавиши
         ENTER.  SYMDEB ассемблирует  последнюю  введенную инструкцию
         и выдает новый адрес.  Конец  ввода  инструкций обозначается
         нажатием ENTER без вводимых символов.
               Если  введенная  инструкция  содержит  ошибку, об этом
         выдается сообщение, и текущий адрес не изменяется.
               При   использовании  команды  A  необходимо  соблюдать
         следующие правила:
               1. Дальний возврат обеспечивается мнемоникой RETF.
               2. Инструкции обработки строк  должны  явно  указывать
         длину строки. Рекомендуется использовать MOVSB и MOVSW.
               3. SYMDEB    автоматически    ассемблирует   короткие,
         внутренние и  дальние  скачки  и  вызовы  в  зависимости  от
         местоположения  целевого  адреса. Это правило можно отменить
         кодированием префиксов NEAR (допустимо сокращение NE) и FAR,
         например:
                    JMP NEAR 502
                    JMP FAR 50A
               4. SYMDEB  не может определить,  ссылаются ли операнды
         на слово или на байт памяти. Поэтому тип данных должен  быть
         явно  указан  префиксами  WORD (допустимо сокращение WO) PTR
         или BYTE (BY) PTR, например:
                    MOV WORD PTR [bp],1
                    MOV BY PTR [si-1],symbol
               5. SYMDEB не может определить, ссылается ли операнд на
         область  памяти  или  это  непосредственный операнд. По этой
         причине ссылка на область памяти  должна  быть  заключена  в
         одинарные квадратные скобки.
               6. Для директив  DB и DW ассемблируются байт или слово
         непосредственно в памяти.
               7. SYMDEB поддерживает все формы  косвенно-регистровой
         адресации, например:
                    ADD bx,34[bp+2].[si-1]
 
                                     - 35 -
         
         
                    pop [bp+di]
                    push [SI]
               8. Распознаются   все  синонимы   кодов   (для  команд
         перехода). Результатом работы  команды  реассемблирования  U
         являются также синонимы.
               9.  Не  следует  ассемблировать и исполнять инструкции
         процессоров 8087 и 80287, если система не обеспечена  такими
         сопроцессорами.  Например,  использование  в  такой ситуации
         инструкции WAIT пожет "повесить" систему.
               
               
               
               
               
               
                           4.5.2. Точки выхода.
               
               
               
               SYMDEB предоставляет пользователю возможность вставить
         в  тело тестируемой программы набор точек выхода, достижение
         которых при  исполнении  кода,  вызовет  прекращение  работы
         программы,  выдачу на дисплей текущего состояния всех флагов
         и регистров в формате  команды  R  (п.4.5.22)  и  возврат  в
         SYMDEB. 
               Ниже описаны команды манипуляции с точками выхода.
               
               
               1. Установка точки выхода. Синтаксис:
               
               BP [<число>]<адрес>[<счетчик пропусков>]["<команды>"]

               Точка  выхода  вставляется по указанному адресу. Точки
         выхода, вставляемые  по  команде  BP,  в  отличие  от  точек
         выхода, создаваемых командой G, остаются в теле программы (в
         памяти, разумеется)  до  тех  пор,  пока  не  будут  удалены
         командой BC.
               SYMDEB  позволяет  устанавливать  до 10 точек выхода с
         номерами от 0 до 9. Если специфицировано <число>, оно задает
         номер  вставляемой точки, в противном случае подразумевается
         первая доступная точка. 
               <Адрес> может  определять  начало  некоторой  реальной
         инструкции. 
               <Счетчик    пропусков>    задает    число   "холостых"
         выполнений точки выхода,  когда ее действие игнорируется, до
         первого  ее  срабатывания.  Счетчик  хранится как 16-битовое
         число.
               <Команды>  SYMDEB   будут   выполняться   при   каждом
         срабатывании   точки   выхода.  Друг  от  друга  они  должны
         отделяться символом  ; .
               
               
               2. Изъятие точек выхода. Синтаксис:
               
               BC <список> | *
 
                                     - 36 -
         
         
               
               <Список> представляет собой  последовательность  целых
         чисел  без  знака  в  пределах  от  0  до  9. Точки выхода с
         номерами  из  этого  списка  удаляются  из  программы.  Если
         специфицировано  * , удаляются все точки.
               
               
               3. Блокировка точек выхода. Синтаксис:
               
               BD <список> | *
               
               Команда   выполняет   функции,   аналогичные  функциям
         команды BC, но точки не удаляются из программы,  а  временно
         блокируются до выполнения соответствующей команды BE.
               
               
               4. Разблокировка точек выхода. Синтаксис:
               
               BE <список> | *
               
               Команда BE противоположна по функциям команде BD.
               
               
               5. Выдача списка точек выхода. Синтаксис:
               
               BL
               
               По   этой   команде   выдается  информация  о  текущем
         расположении созданных командой BP точках выхода, включающая
         номер  точки,  статус  блокировки,  адрес,  число оставшихся
         пропусков, в скобках - исходное значение счетчика пропусков,
         а  также  номер  линии  исходного  текста, если такие номера
         используются. 
               Статус блокировки может принимать следующие  значения:
         e  для  разблокированной  точки, d для заблокированной точки
         или  v  для  виртуальной  точки.  Точка   выхода   считается
         виртуальной,  если  она  была  вставлена  в файл в то время,
         когда он еще не был загружен.
               
               
               
               
               
               
               
                            4.5.3. Комментарии.
               
               
               
               Синтаксис:
               
               * <комментарий>
               
               Текст комментария выводится на дисплей.
               
 
                                     - 37 -
         
         
               
               
               
               
               
                           4.5.4. Команда сравнения.
               
               
               Синтаксис:
               
               C <границы> <адрес>
               
               По этой команде  байты  памяти  в  указанных  границах
         сравниваются   с  соответствующими  им  байтами,  начиная  с
         указанного адреса. 
               Если все байты совпадают,  SYMDEB  опять  выдает  свой
         приглашающий   символ.  В  противном  случае  предварительно
         выдаются все пары несовпадающих байтов.
               
               
               
               
               
                          4.5.5. Команда "выдать".
               
               
               Синтаксис:
               
               ?<выражение>
               
               Значение специфицированного  выражения  вычисляется  и
         выдается   на   консоль  в  различных  форматах.  Выдаваемая
         информация  включает  в  себя   полный   адрес,   16-битовое
         16-ричное  значение,  полное  32-битовое 16-ричное значение,
         десятичное значение в скобках и значение  строки  в  двойных
         кавычках.  Символы  строки  представляются  точками, если их
         значение меньше 32 (20h) или больше 126 (7Eh). 
               Выражение  может  быть  комбинацией  чисел,  символов,
         адресов и операторов.
               
               
               
               
               
                            4.5.6. Команды дампа.
               
               
               Следующие   команды   SYMDEB  обеспечивают  выдачу  на
         консоль дампа оперативной памяти:
               
               
               1. Дамп памяти по адресу или в границах. Синтаксис:
               
               D [<адрес> | <границы>]
               
 
                                     - 38 -
         
         
               Формат   дампа   определяется   предыдущей   введенной
         командой  дампа.  Если же это первая вводимая команда дампа,
         предполагается формат команды DB.
               Команда D выдает одну или более линий в зависимости от
         того,  <адрес>  или  <границы>  указаны. Выдается по меньшей
         мере одно значение. Если специфицированы <границы>, выдаются
         все значения в них. Если операнд опущен, выдается содержимое
         памяти,   начинающейся   сразу   после   области,   выданной
         предыдущей  командой  дампа.  Если  раньше  дампирования  не
         производилось, используется содержимое регистра IP, а если и
         этот  регистр  не  был  определен,  используется  содержимое
         регистра DS.
               
               
               2.  Дамп памяти по адресу или в границах в коде ASCII.
         Синтаксис:
               
               DA [<адрес> | <границы>]
               
               Выдается одна или более линий в зависимости  от  того,
         <адрес>  или  <границы>  указаны.  Может  быть  выдано до 48
         символов в линию. Символы, не имеющие аналогов в коде ASCII,
         т.е. со значением, большим 7Eh или меньшим 20h, обозначаются
         точками. 
               Если  специфицирован  <адрес>,   выдается   содержимое
         памяти  до  ближайшего  нулевого  байта или 128 байтов. Если
         параметр опущен, выдаются значения всех  байтов,  начиная  с
         непосредственно  следующего  за выданным предыдущей командой
         дампа, до ближайшего  нулевого  или  128  байтов.  Если  при
         задании  границ  использовано  L,  выдается  указанное число
         байтов. 
               
               
               3. Дамп памяти по байтам. Синтаксис:
               
               DB [<адрес> | <границы>]
               
               Выдается комбинированный  (16-ричный  и  символьный  в
         коде  ASCII)  дамп памяти, начиная с указанного адреса или в
         указанных границах. Если указан  <адрес>  выдаются  значения
         128 байтов.
               
               
               4. Дамп памяти по словам. Синтаксис:
               
               DW [<адрес> | <границы>]
               
               Аналогично   DB,   но  при  указании  адреса  выдается
         содержимое 64 слов памяти.
               
               
               5. Дамп памяти по двойным словам. Синтаксис:
               
               DD [<адрес> | <границы>]
               
 
                                     - 39 -
         
         
               Аналогично  DB,  но  при  указании   адреса   выдается
         содержимое 32 двойных слов памяти.
               
               
               6. Дамп коротких десятичных чисел. Синтаксис:
               
               DS [<адрес> | <границы>]
               
               Выдается   комбинированный   (16-ричный   и   в  форме
         коротких, 4-байтных десятичных  чисел  с  плавающей  точкой)
         дамп  памяти,  начиная  с указанного адреса, или в указанных
         границах. 
               Выдается одна или более линий в зависимости  от  того,
         <адрес> или <границы> указаны. 
               Выдается    по   меньшей   мере   одно   число.   Если
         специфицированы границы, выдаются все числа в их пределах.
               
               
               7. Дамп длинных десятичных чисел. Синтаксис:
               
               DL [<адрес> | <границы>]
               
               Команда аналогична DS,  но  оперирует  с  длинными  (8
         байтов) десятичными числами.
               
               
               8. Дамп 10-байтных десятичных чисел. Синтаксис:
               
               DT [<адрес> | <границы>]
             
               Команда  аналогична  DS,  но  оперирует  с 10-байтными
         десятичными числами. 
               
               
               
               
               
                      4.5.7. Команды ввода с клавиатуры.
               
               
               При помощи команд ввода с клавиатуры данные могут быть
         введены непосредственно в память. 
               Описание команд ввода с клавиатуры приведено ниже.
               
               
               1. Ввод значений. Синтаксис:
               
               E <адрес> [<список>]
               
               Одно  или  более значений вводятся в память, начиная с
         указанного   адреса.   Размер    значений    устанавливается
         предыдущей  командой  ввода с клавиатуры, а если ее не было,
         предполагается EB.
               Если  элемент   списка   задан   некорректно,   список
         игнорируется. 
 

                                     - 40 -
         
         
               Если  список  опущен,  SYMDEB  запрашивает  значения в
         диалоговом режиме с указанием текущего адреса. Конец  списка
         в  этом  случае  обозначается  нажатием  клавиши  ENTER  без
         указания значения.
               
               
               
               2. Ввод байтов. Синтаксис:
               
               EB <адрес> [<список>]
               
               Одно или более чисел, занимающих 1  байт,  вводятся  в
         память, начиная с указанного адреса. 
               Если  список  опущен,  SYMDEB  запрашивает  значения в
         диалоговом режиме с  указанием  текущего  адреса.  При  этом
         имеется   возможность   заменить  или  пропустить  значение,
         вернуться к предыдущему значению, выйти из команды.
               Для замены числа следует записать новое значение после
         текущего.
               Для пропуска числа необходимо нажать SPACE.
               Для возврата к предыдущему числу следует ввести  - .
               Для выхода из команды служит клавиша ENTER.
               
               
               3. Ввод байтов. Синтаксис:
               
               EA <адрес> [<список>]
               
               Аналогично EB.
               
               
               4. Ввод слов. Синтаксис:
               
               EW <адрес> [<значение>]
               
               Указанное  значение в формате слова  вводится в память
         по  указанному  адресу.  После  ввода   SYMDEB   запрашивает
         значение   следующих  4  байтов.  Конец  ввода  обозначается
         нажатием клавиши ENTER без указания значения.
               
               
               5. Ввод двойных слов. Синтаксис:
               
               ED <адрес> [<значение>]
               
               Указанное значение в формате двойного слова вводится в
         память по указанному адресу. Двойное  слово  кодируется  как
         пара  слов,  разделенных  символом  :  .  После ввода SYMDEB
         запрашивает  значение  следующих  8  байтов.   Конец   ввода
         обозначается нажатием клавиши ENTER без указания значения.
               
               
               6. Ввод коротких десятичных чисел. Синтаксис:
               
               ES <адрес> [<значение>]
 
                                     - 41 -
         
         
               
               Указанное  значение  в  формате  короткого  (4  байта)
         десятичного числа с плавающей точкой вводится  в  память  по
         указанному  адресу.  После ввода SYMDEB запрашивает значение
         следующих  4  байтов.  Конец  ввода  обозначается   нажатием
         клавиши ENTER без указания значения.
               
               
               7. Ввод длинных десятичных чисел. Синтаксис:
               
               EL <адрес> [<значение>]
               
               Команда  аналогична  ES,  но  оперирует  с длинными (8
         байтов) десятичными числами,  которые  представляются  парой
         чисел, разделенных символом  : .
               
               
               8. Ввод 10-байтных десятичных чисел. Синтаксис:
               
               ET <адрес> [<значение>]
               
               Команда  аналогична  EL,  но  оперирует  с 10-байтными
         десятичными числами.
               
               
               
               
               
               
                       4.5.8. Просмотр символьного плана.
               
               
               Синтаксис:
               
               X [*]
               X? [<имя плана>!][<имя сегмента>:][<символ>]
               
               SYMDEB создает символьный план для каждого символьного
         файла, специфицированного в командной строке запуска SYMDEB.
               Форма команды X обеспечивает выдачу имен и загрузочных
         адресов сегментов и  символов  текущего  символьного  плана.
         Если  специфицировано  *  ,  выдаются  имена  и  адреса всех
         загруженных в данный момент символьных планов.
               Форма команды X? обеспечивает выдачу одного или  более
         символов  в  символьном  плане. Если указано имя символьного
         плана, выдается информация об этом плане  (<имя  символьного
         плана>  должно  представлять  имя соответствующего файла без
         расширения).  Если  задано  имя  сегмента,  выдаются  имя  и
         загрузочный   адрес   этого  сегмента.  Если  специфицирован
         символ, выдаются адрес сегмента и  смещение  этого  символа.
         Для  того,  чтобы  получить информацию о нескольких символах
         или  сегментах,   следует   задавать   частичные   имена   с
         использованием символа  * .
               
               
 
                                     - 42 -
         
         
               
               
               
                        4.5.9. Команда "наполнения".
               
               
               Синтаксис:
               
               F <границы> <список>
               
               Память  в  указанных границах "наполняется" значениями
         из указанного списка. Если границы определяют больше памяти,
         чем  может  занять  список,  список  начинает обрабатываться
         сначала. Если  же длиннее  список,  его  не  помещающийся  в
         границы остаток игнорируется.
               
               
               
               
               
                         4.5.10. Команда Go.
               
               
               Синтаксис:
               
               G [=<адрес начала программы>][<адреса точек выхода>]
               
               По   команде  G  управление  передается  программе  по
         указанному адресу начала. Выполнение продолжается  до  конца
         программы  или до достижения точек выхода, если они указаны.
         Программа останавливается также на точках выхода,  внесенных
         командой BP.  
               Если   адрес   начала   программы  опущен,  управление
         передается по адресу, определяемому содержимым регистров  CS
         и IP. 
               Для   передачи   управления   программе   используется
         инструкция IRET. При  этом  SYMDEB  соответствующим  образом
         устанавливает  указатель стека пользователя и заносит в этот
         стек флаги и регистры CS и IP. Следует  иметь  в  виду,  что
         если   стек  пользователя  не  содержит  хотя  бы  6  байтов
         доступной памяти,  выполнение  команды  G  может  "повесить"
         систему. 
               Все  значения  без предшествующего  =  рассматриваются
         как адреса точек  выхода.  Допустимо  задание  до  10  точек
         выхода. Их адреса должны указывать на начало инструкции.
               Для   создания   точки   выхода   SYMDEB   по  каждому
         специфицированному адресу помещает  инстукцию  INT  с  кодом
         прерывания  204  (0CCh).  При выходе из программы в одной из
         этих  точек  все  внесенные  инструкции  INT  удаляются   из
         программы.  Однако,  если  выполнение  продолжается до конца
         программы или будет прекращено  каким-либо  другим  образом,
         SYMDEB  не  удаляет  внесенные  им инструкции. В этом случае
         до следующего  запуска  нужно  перезагрузить  программу  при
         помощи команд N и L.
               Когда  выполнение  программы  достигает  точки выхода,
 
                                     - 43 -
         
         
         SYMDEB выдает на дисплей текущее содержимое всех регистров и
         флагов  в  формате  команды R, а также следующую инструкцию.
         Выполнение программы прекращается.
               Если выполнение достигло логического конца  программы,
         SYMDEB  выдает  сообщение  Program terminated normally, и на
         экран выдается текущее содержимое регистров и флагов.
               
               
               
               
               
                    4.5.11. Справка о командах SYMDEB.

               
               Синтаксис:
               
               ?
               
               На дисплей выдается список команд SYMDEB.
               
               
               
               
               
                          4.5.12. HEX-команда.

               
               Синтаксис:
               
               H <значение 1> <значение 2>
               
               Выполняются   операции   <значение 1>+<значение 2>   и
         <значение 1>-<значение 2>,  и результаты выдаются на экран в
         виде 16-ричных чисел.
               
               
               
               
               
               
                        4.5.13. Команда ввода из порта.
               
               
               Синтаксис:
               
               I <номер порта>
               
               Из порта с указанным номером  (представимым  16-битным
         числом) считывается и выдается на экран 1 байт данных.
               
               
               
               
               
               
 
                                     - 44 -
         
         
                        4.5.14. Команда загрузки файла.

               
               Синтаксис:
               
               L [<адрес> [<драйв> <запись> <счетчик>]]
               
               Команда  L  обеспечивает  считывание  файла  с диска и
         запись его в память.
               Если опущены все параметры команды, загружается файл с
         именем,  ранее  определенным   командой   N   или   заданным
         аргументом  при запуске SYMDEB. Если имя не было определено,
         SYMDEB считывает его из  области  памяти  по  адресу  DS:5C.
         Эта  область представляет собой управляющий блок, содержащий
         имя определенного по команде N файла или аргумент запуска.
               Пара    регистров   BX:CX   должна   содержать   число
         загружаемых байтов. 
               В памяти файл размещается, начиная с указанного адреса
         или, если он опущен, с адреса CS:100. 
               Если специфицированы все  4  параметра  команды  L,  в
         память  по  указанному   адресу   загружается   определяемое
         счетчиком  количество  логических  записей, расположенных на
         указанном драйве.  <Запись>  определяет  первую  считываемую
         запись  и  может представляться 16-ричным числом, содержащим
         от  1  до  4  16-ричных   цифр.   <Счетчик>   представляется
         аналогично.  <Драйв>  может быть задан числом 0, 1, 2 или 3,
         определяющим  логический  адрес  драйва  A,  B,  C   или   D
         соответственно.
               Если имя файла имеет расширение EXE, его длина и адрес
         загрузки  берется  из заголовка файла, а параметры <адрес> и
         <счетчик> команды L, если они указаны, игнорируются. 
               Если имя файла имеет расширение  HEX,  адрес  загрузки
         определяется  суммой  указанного  в заголовке файла адреса и
         параметра <адрес> команды L или, если этот параметр  опущен,
         только адресом загрузки из заголовка.
               
               
               
               
               
                         4.5.15. Команда перемещения.
               
               
               Синтаксис:
               
               M <границы> <адрес>
               
               Блок  памяти  в  указанных  границах  перемещается  по
         заданному адресу.
               Перемещение произойдет нормально, даже если исходный и
         принимающий  блоки  перекрываются.  Принимающий  блок всегда
         является точной копией исходного. При перекрытии  содержимое
         исходного блока может измениться.
               Для  предотвращения  потери  данных команда M побайтно
         копирует данные, начиная со старших адресов исходного блока,
 
                                     - 45 -
         
         
         если  адрес  его  начала  меньше  адреса начала принимающего
         блока.  В противном случае копирование производится, начиная
         с младших адресов исходного блока.
               
               
               
               
               
                        4.5.16 Команда установки имени.

               
               Синтаксис:
               
               N [<имя файла>] [<аргументы>]
               
               Устанавливается имя файла для последующего  выполнения
         команд  L  и  W  или  аргументы  для последующего исполнения
         программы.
               Аргументы,  если  они  заданы,   копируются,   включая
         пробелы,  в  область  памяти  по  адресу  DS:81.  Длина поля
         параметров запоминается в байте памяти по адресу DS:80. 
               Если первые  2  аргумента являются именами файлов,  по 
         адресам DS:5C и DS:6C  создаются  блоки  управления  файлами
         (FCB), куда по соответствующим форматам и копируются имена. 
               Команда  N  трактует  <имя  файла>  как тоже аргумент,
         записывая его в память по адресу DS:81  и  создавая  FCB  по
         адресу  DS:5C.  Поэтому  необходимо  помнить,  что установка
         нового значения имени файла  изменяет  предыдущие  аргументы
         программы.
               
               
               
               
               
               
                 4.5.17. Команда открытия символьного плана.

               
               Синтаксис:
               
               XO [<имя плана>!][<имя сегмента>]
               
               Команда  XO  устанавливает  активным  символьный  план
         и/или сегмент.
               Имя символьного плана, если оно указано,  должно  быть
         именем   (без  расширения)  специфицированного  при  запуске
         SYMDEB символьного файла. 
               Имя сегмента,  если оно указано,  должно  быть  именем
         сегмента  в специфицированном символьном плане. Все сегменты
         в открытом плане доступны, но открывается первый сегмент. 
               
               
               
               
               
 
                                     - 46 -
         
         
               
               
                       4.5.18. Команда вывода в порт.

               
               Синтаксис:
               
               O <номер порта> <1-байтовое 16-ричное значение>
               
               Указанное  значение  направляется  в  порт  с   данным
         номером.  Номер  порта  должен  быть  представим  16-битовым
         значением.
               
               
               
               
               
                           4.5.19. P-трассировка.

               
               Синтаксис:
               
               P [=<адрес>] [<счетчик>]
               
               Команда P выполняет задаваемую  адресом  инструкцию  и
         затем   выдает  на  дисплей  в  формате  команды  R  текущее
         содержимое всех регистров и флагов. 
               Если <адрес> опущен, выполняется инструкция по адресу,
         определяемому регистрами CS и IP.
               Счетчик,    если   он   присутствует,   задает   число
         инструкций, которые  будут  выполнены  до  останова.  Выдача
         регистров  и  флагов  при  этом  будет  осуществляться после
         выполнения каждой инструкции до начала выполнения следующей. 
               P-трассировка  подобна  T-трассировке (п.4.5.30) с той
         лишь разницей,  что  P-трассировка прекращается после вызова
         процедуры  или  прерывания  в  то  время,  как T-трассировка
         отслеживает и такие ситуации. 
               Формат  и  объем  выдаваемой  информации   существенно
         зависит  от режима, установленного командой S (подробнее см.
         п.4.5.25). 
               
               
               
               
               
                      4.5.20. Команда выхода из SYMDEB.

               
               Синтаксис:
               
               Q
               
               По этой команде SYMDEB заканчивает свою работу.
               
               
 
                                     - 47 -
         
         
               
               
               
                  4.5.21. Команды переназначения ввода/вывода.

               
               Синтаксис:
               
               <  <имя устройства>
               >  <имя устройства>
               =  <имя устройства>
               {  <имя устройства>
               }  <имя устройства>
               ~  <имя устройства>
               
               Команды  переназначения блокируют последующие операции
         ввода/вывода  и  направляют  их  на   работу   с   указанным
         устройством.   Это   может   понадобиться,  например,  когда
         отлаживаемая программа  выводит  графическую  информацию  на
         консоль, используемую и SYMDEB.
               Команда > переключает весь последующий вывод SYMDEB, а
         команда <  -  весь  последующий  ввод  SYMDEB  на  указанное
         устройство. Команда = включает в себя обе эти функции.
               Команда    {   переключает   весь   последующий   ввод
         отлаживаемой программы, а команда } - весь последующий вывод
         отлаживаемой  программы  на  указанное устройство. Команда ~
         включает в себя обе эти фукции.
               В   качестве   имени  устройства  может  быть  указано
         принятое в DOS имя устройства или имя файла. 
               Если в качестве имени устройства задано COM1 или COM2,
         это  накладывает  дополнительные ограничения на конфигурацию
         системы.  В частности, в этом случае становятся недоступными
         и игнорируются комбинации клавиш CONTROL-C и CONTROL-S.
               
               
               
               
               
                       4.5.22. Выдача регистров.
               
               
               Синтаксис:
               
               R [<имя регистра>[[=]<значение>]]
               
               Команда   R  выдает  на  дисплей содержимое  регистров
         процессора и позволяет загружать их требумыми значениями.
               Еслм  имя  регистра  опущено,  выдаются  все  регистры
         и флаги.
               Кроме того, выдается инструкция, на которую  указывают
         регистры CS и IP, и может быть сделана попытка выполнить ее. 
         При  этом  SYMDEB  вычисляет   операнды   инструкции.   Если
         инструкцией является вызов DOS, будет показан номер функции.
         Если регистры CS и IP установлены не  на  инструкцию,  а  на
         позицию в памяти, будет выдан адресующий ее символ. 
 
                                     - 48 -
         
         
               Если   указано   имя   регистра,   SYMDEB  выдает  его
         содержимое и запрашивает новое значение (ответ заключается в
         наборе требуемых  символов  и  нажатии  клавиши ENTER). Если
         заданы и имя регистра,  и  значение,  производится  загрузка
         регистра. 
               Могут  быть указаны следующие имена регистров: AX, BX,
         CX, DX, SP, BP, SI, DI, CS, DS, SS,  ES,  IP,  PC (IP)  и  F
         (флаги). 
               Установка   значений  флагов  осуществляется следующим
         образом. При спецификации F в команде  R  состояние  каждого
         флага  выдается  в виде двухсимвольного кода, как показано в
         таблице 4.1. Список  значений  заканчивается  символом  -  ,
         после    которого   можно   в   этом   же   коде   в   любой
         последовательности ввести новые значения  выбранных  флагов.
         Значения  остальных флагов не изменятся. каждый флаг в одном
         списке может быть  специфицирован  только  один  раз.  Конец
         списка обозначается нажатием клавиши ENTER.
               
               
               
               
                      Таблица 4.1. Коды значений флагов.
         ____________________________________________________________
         |                |                    |                    |
         |     Флаг       |         1          |         0          |
         |________________|____________________|____________________|
         |                |                    |                    |
         |  Переполнение  |        OV          |        NV          |
         |________________|____________________|____________________|
         |                |                    |                    |
         |   Направление  |   DN (уменьшение)  |   UP (увеличение)  |
         |________________|____________________|____________________|
         |                |                    |                    |
         |   Прерывания   |     EI (запрет)    |   DI (разрешение)  |
         |________________|____________________|____________________|
         |                |                    |                    |
         |     Знак       |      NG (минус)    |      PL (плюс)     |
         |________________|____________________|____________________|
         |                |                    |                    |
         |     Нуль       |        ZR          |        NZ          |
         |________________|____________________|____________________|
         |                |                    |                    |
         |  Вспомогатель- |        AC          |        NA          |
         |   ный перенос  |                    |                    |
         |________________|____________________|____________________|
         |                |                    |                    |
         |     Паритет    |    PE (четность)   |   PO (нечетность)  |
         |________________|____________________|____________________|
         |                |                    |                    |
         |     Перенос    |        CY          |        NC          |
         |________________|____________________|____________________|
               
               
               
               Флаги   модифицируются   последовательно   по  одному.
 
                                     - 49 -
         
         
         Поэтому при ошибочном кодировании возникнет ситуация,  когда
         часть флагов (до ошибочного символа) изменила свои значения,
         а часть, начиная с ошибочного символа, - нет.
               Формат  и  объем  выдаваемой  информации   существенно
         зависит  от режима, установленного командой S (подробнее см.
         п.4.5.25). 
               
               
               
               
               
                           4.5.23. Смена экрана.

               
               Синтаксис:
               
               \
               
               Эта команда позволяет переключиться с  экрана  отладки
         на экран отлаживаемой программы,  что  бывает  нужно,  когда
         программа,    например,   выводит   на   экран   графическую
         информацию.  
               Возврат на экран SYMDEB осуществляется нажатием  любой
         клавиши.
               При  работе  на  IBM-машине  для использования команды
         смены экрана необходимо задание опции SYMDEB /S. При  работе
         на  машине, совместимой с IBM, необходимо также задать опцию
         /I.
               
               
               
               
                        4.5.24. Команда поиска.
               
               
               Синтаксис:
               
               S <границы> <список>
               
               В области памяти с указанными границами осуществляется
         поиск  заданных в списке 1-байтных  значений с индикацией на
         экране   результатов   поиска.   Элементы   списка    должны
         разделяться запятыми.
               
               
               
               
               
                  4.5.25.Команда установки режима индикации.

               
               Синтаксис:
               
               S-|+|&
               
 
                                     - 50 -
         
         
               Команда  S  устанавливает  режим  выдачи  на  дисплей,
         которому SYMEB будет в дальнейшем придерживаться. 
               По  команде  S+  SYMDEB  будет   выдавать   на   экран
         информацию  в  терминах  линий  исходного  текста программы.
         Команда S- устанавливает  режим  выдачи  реассемблированного
         кода  программы.  Команда  S&  обеспечивает обе эти функции.
         Первоначальным умалчиваемым режимом является S&.
               Команда S имеет смысл лишь при работе с программами на
         языке    высокого    уровня.   Для   ассемблерных   программ
         автоматически устанавливается режим S-. 
               Если  символьный  план  не  открыт  или   не  содержит
         информацию  о  линиях  исходной программы, SYMDEB игнорирует
         все последующие запросы на выдачу исходных линий.  В  режиме
         S&  SYMDEB  выдает исходную линию, содержащую инструкцию, на
         которую указывает пара регистров CS и IP. 
               Команда S  оказывает  влияние  на  работу  последующих
         команд реассемблирования U (п.4.5.31). 
               Команда S влияет также на работу команд R, T  и  P.  В
         режиме  S+  эти  команды  выдают за раз одну исходную линию,
         которая может соответствовать нескольким  реассемблированным
         инструкциям.  В режиме S- выдается только реассемблированный
         код. В режиме S& выдаются реассемблированный  код  и  номера
         линий. 
               Исходные линии выдаются в виде:
         <номер линии>:<исходный текст>
               Исходные     линии     при     выдаче     предшествуют
         реассемблированным инструкциям. 
               Всякий раз,  когда  SYMDEB  первый  раз  обращается  к
         исходному тексту, он ищет в текущем подоглавлении файл с тем
         же  базовым  именем,  что и соответствующий символьный файл.
         При  неудачном  поиске  SYMDEB  выдает  на консоль запрос об
         имени исходного файла. Если в ответ на  него  нажать клавишу
         ENTER, не  указав  имени,  SYMDEB  подавит  выдачу  исходных
         линий,  вместо  которых  тогда  будут выдаваться имя плана и
         номер линии. Эту процедуру нужно производить  при  работе  с
         программами,  сформированными  ранними  версиями  (до  3.31)
         компиляторов FORTRAN и PASCAL.
               
               
               
               
               
                      4.5.26. Временный выход в DOS.
               
               
               Синтаксис:
               
               ![<команда DOS>]
               
               Команда ! позволяет выполнить  COMMAND.COM  и  команды
         MS-DOS  вне SYMDEB. COMMAND.COM выполняется без аргументов с
         сохранением контекста отладки. Для возврата в SYMDEB  служит
         команда MS-DOS EXIT.
               Если  в  команде  !  задана  команда DOS, производится
         выполнение этой команды и автоматический возврат в SYMDEB.
 
                                     - 51 -
         
         
               Использование команды ! требует дополнительной памяти.
         Для  более  экономного  использования  памяти  рекомендуется
         предусматривать  в  ассемблерных  программах  вызов  DOS   с
         функцией  4Ah,  который освободит неиспользуемую память. Тот
         же эффек дает опция LINK /CPARMAXALLOC. Программы  на  языке
         C,  обработанные компилятором MICROSOFT C версии 3.0 и выше,
         освобождают  ненужную   память  автоматически,   если   была
         выполнена   процедура   _main.   SYMDEB   также  освобождает
         неиспользуемую им память.
               В команде ! не может быть использован ограничитель ; ,
         т.к. весь текст после ! передается  в  COMMAND.COM  и  будет
         интерпретироваться как командная строка DOS.
               Для  размещения  копии  COMMAND.COM  SYMDEB использует
         переменную COMSPEC команды DOS SET.
               
               
               
               
               
                  4.5.27. Команда выдачи кода исходной линии.

               
               Синтаксис:
               
               .
               
               По этой команде выдается код исходной  линии  невзирая
         на режим, установленный командой S.
               Команда   не  может быть  использована  при  работе  с
         ассемблерными программами.
               
               
               
               
               
                    4.5.28. Команда трассировки стека.

               
               Синтаксис:
               
               K [<число>]
               
               Эта команда  позволяет  увидеть  текущий  кадр  стека.
         Первая  строка  трассы  содержит  имя  текущей процедуры, ее
         аргументы, имя файла и  номер  линии,  вызвавшей  процедуру.
         Следующая строка описывает вызвавшую процедуру и т.д.
               Если   число   аргументов   процедуры   переменно  или
         неизвестно, SYMDEB использует специфицированное в команде  K
         число, которое задает число слов параметров.
               Команда  K  работает только при соблюдении стандартных
         соглашений о связях, в противном случае она игнорируется.

               
               
               
 
                                     - 52 -
         
         
               
               
               
                    4.5.29. Команда установки символа.

               
               Синтаксис:
               
               Z <символ> <значение>
               
               В результате выполнения  команды  Z  указанный  символ
         будет связан со специфицированным значением адресом.
               
               
               
               
               
                       4.5.30. T-трассировка.

               
               Синтаксис:
               
               T [=<адрес начала>] [<счетчик>]
               
               Команда T выполняет задаваемую  адресом  инструкцию  и
         затем   выдает  на  дисплей  в  формате  команды  R  текущее
         содержимое всех регистров и флагов. 
               Если <адрес> опущен, выполняется инструкция по адресу,
         определяемому регистрами CS и IP.
               Счетчик,    если   он   присутствует,   задает   число
         инструкций, которые  будут  выполнены  до  останова.  Выдача
         регистров  и  флагов  при  этом  будет  осуществляться после
         выполнения каждой инструкции до начала выполнения следующей.
               В отличие от P-трассировки (п.4.5.19) T-трассировка не
         прекращается при вызове процедуры или прерывании. Исключение
         составляет лишь прерывание с номером 21h (функция DOS). 
               Трассировка будет идти лучше, если  не  использовались
         средства оптимизации данного языка.
               Команда  T  использует  режим  трассировки  аппаратуры
         процессоров 8086, 8088, 80186 или 80286. С ее помощью  можно
         трассировать инструкцию в ROM (read-only memory).
               Формат  и  объем  выдаваемой  информации   существенно
         зависит  от режима, установленного командой S (подробнее см.
         п.4.5.25). 
               
               
               
               
               
                       4.5.31. Команда реассемблирования.
               
               
               Синтаксис:
               
               U [<границы>]
 
                                     - 53 -
         
         
               
               По  команда  U  на дисплей выдаются реассемблированные
         инструкции  и/или  предложения  исходной  программы.  Формат
         вывода  зависит  от  режима, установленного командой S, и от
         языка,   на   котором   была   написана   программа.    Если
         отлаживаемая    программа    была    обработана   MASM   или
         несовместимым   с   SYMDEB    компилятором,    принудительно
         устанавливается  режим  S-.  В  режимах S+ и S& при работе с
         программами,    выработанными    совместимыми    с    SYMDEB
         компиляторами,  по команде U выдаются линии исходного текста
         и реассемблированные инструкции  (одна  исходная  линия  для
         каждой   соответствующей   группы  предложений  ассемблера).
         Исходные линии считываются из  исходного  файла.  Инструкции
         для  реассемблирования берутся из блока памяти в указанных в
         команде границах.
               В  отличие  от команд T и P, для команды U режимы S+ и
         S& совпадают. Для обоих  режимов  (исходного  и  смешанного)
         SYMDEB  требует,  чтобы  вместе  с программой был загружен и
         символьный  план,  содержащий  информацию  о  номерах  строк
         исходной  программы. При отсутствии этой информации исходные
         линии не выдаются. 
               Если <границы> опущены, обрабатываются первые 8  линий
         кода по  текущему адресу  реассемблирования. Текущим адресом
         реассемблирования является адрес первого байта (линии) после
         последнего байта (линии), выданного предыдущей командой U. 
               Защищенные  инструкции  процессора 80286 не могут быть
         реассемблированы.
               
               
               
               
               
               
               
               
                    4.5.32. Команда выдачи исходной линии.

               
               Синтаксис:
               
               V <адрес>
               
               Команда   V   выдает   исходные    линии    программы,
         соответствующие  инструкциям,   расположенным,   начиная   с
         указанного адреса.  При  этом  загруженный  символьный  план
         должен содержать информацию о линиях исходной программы.
               Исходные   линии   выдаются   независимо   от  режима,
         установленного командой S.
               
               
               
               
               
               
               
 
                                     - 54 -
         
         
               
                      4.5.33. Команда записи на диск.

               
               Синтаксис:
               
               W [<адрес> [<драйв> <запись> <счетчик>]]
               
               Команда  W  обеспечивает  запись  участка   памяти   в
         определенное место на диске.
               Если   опущены   все   параметры    команды,    запись
         производится в файл с именем, ранее определенным командой N. 
               Пара    регистров   BX:CX   должна   содержать   число
         записываемых байтов. 
               В   памяти  записываемые  данные  должны  размещаться,
         начиная с указанного адреса или, если он  опущен,  с  адреса
         CS:100.   
               Если специфицированы все  4  параметра  команды W,  на
         указанный   драйв   записывается   определяемое    счетчиком
         количество    логических    записей,    содержимое   которых
         расположено   по  указанному  адресу.   <Запись>  определяет 
         первую записываемую на диск запись  и  может  представляться
         16-ричным  числом,  содержащим  от  1  до  4 16-ричных цифр.
         <Счетчик>  представляется  аналогично.  <Драйв>  может  быть
         задан  числом  0,  1, 2 или 3, определяющим логический адрес
         драйва A, B, C или D соответственно.  
               Не  рекомендуется  записывать  данные  по  абсолютному
         адресу сектора диска, даже  если  имеется  уверенность,  что
         сектор  свободен.  Запись  на  зарезервированный или занятый
         сектор может испортить содержимое файла или даже диска.
               Если имя отлаживаемого файла имеет расширение COM  или
         BIN,  можно при помощи SYMDEB внести изменения в программу и
         затем записать ее обратно в файл.  При  загрузке  файла  его
         длина,  начальный  адрес и имя будут установлены правильно с
         точки зрения последующей записи.  Однако,  если  в  процессе
         отладки  использовались  команды  G,  P или T или изменялось
         содержимое пары регистров BX:CX, утраченные значения следует
         восстановить до записи. 
               Команду  W  нельзя  использовать для записи в EXE- или
         HEX-файл.   Для   модификации  таких  файлов  может  служить
         следующая процедура:
               1.  Запустить  SYMDEB  с   исполнительным   файлом   и
         запомнить несколько первых инструкций программы.
               2. Выйти из SYMDEB и переименовать исполнительный файл
         так, чтобы расширение его имени отличалось от EXE и HEX.
               3. Запустить SYMDEB с  переименованным  исполнительным
         файлом.  При  этом заголовок файла будет рассматриваться как
         часть кода программы (очевидно, что в этом случае нет смысла
         в  загрузке  символьных файлов, т.к. все символы в них будут
         иметь некорректные адреса). 
               4.  Использовать  команду  поиска  S  для   нахождения
         действительного начала программы по запомненным инструкциям.
         Для   этого   может  понадобиться  несколько  попыток,  т.к.
         начальный адрес может  меняться  в  зависимости  от  порядка
         сегментов и других факторов.
 
                                     - 55 -
         
         
               5. Имея адрес начала программы, отыскать инструкции, в
         которые нужно внести изменения, и проделать эти изменения.
               6. Установить параметры  команды  W  и  записать  весь
         файл, включая его заголовок, на диск. Длина заголовка должна
         входить в общую длину записываемого файла в  паре  регистров
         BX:CX.
               7.   Выйти   из   SYMDEB   и    произвести    обратное
         переименование исполнительного файла. 

                                     - 56 -
               
               
               
               
               
                    5. CREF: утилита перекрестных ссылок.
                    -------------------------------------

               
               
               
               
                             5.1. Общие положения.

               
               
               Утилита перекрестных  ссылок  CREF  предназначена  для
         создания   листинга  перекрестных  ссылок  всех  символов  в
         ассемблерной  программе.  Для  каждого  символа  указываются
         номера  строк  исходной программы, содержащих ссылки на этот
         символ.
               Листинг  перекрестных  ссылок  вместе  с   создаваемой
         ассемблером таблицей символов упрощает отладку программы.
               Листинг   перекрестных   ссылок  создается  на  основе
         формируемого ассемблером CRF-файла.
               
               
               
               
               
               
                           5.2. Запуск CREF.

               
               Утилита CREF может быть запущена двумя способами:
               1. С использованием подсказок.
               2. При помощи командной строки.
               
               Для запуска CREF с использованием подсказок  небходимо
         ввести  командную строку, содержащую только имя файла CREF и
         спецификацию  его  пути  поиска,  если  это необходимо. CREF
         перейдет в диалоговый режим и серией  подсказок  запросит  у
         пользователя    информацию   о   следующих   файлах   (ответ
         заключается в наборе требуемых символов  и  нажатии  клавиши
         ENTER): 
               1. Имя  файла  перекрестных  ссылок,   сформированного
                  ассемблером. Если при ответе не указано расширение,
                  предполагается CRF. 
               2. Имя файла создаваемого файла листинга  перекрестных
                  ссылок.  Если  при  ответе  не  указано расширение,
                  предполагается REF. 
                  
               Для  запуска  CREF   при   помощи   командной   строки
 
                                     - 57 -
         
         
         необходимо ввести командную строку следующего вида:
               
         CREF <имя файла перекрестных ссылок>
         [,<имя файла листинга перекрестных ссылок>][;]
               
               Умалчиваемые   расширения  имен  файлов  совпадают  со
         случаем запуска CREF с использованием подсказок.
               Если   после   имени   файла    перекрестных    ссылок
         специфицировано  ; , базовое имя файла листинга по умолчанию
         устанавливается таким же, как и у файла перекрестных ссылок.
               
               Имена  файлов  при  обоих   способах   запуска   могут
         содержать  спецификации  путей поиска в подоглавлениях. Если
         указание пути  отсутствует,  файл  ищется  или  создается  в
         текущем подоглавлении.
                                    
                                    - 58 -
               
               
               
               
               
                   6. LIB: утилита обслуживания библиотек.
                   ---------------------------------------
               
               
               
               
               
                            6.1. Общие сведения.

               
               
               Библиотека представляет собой набор объектных модулей,
         объединенных в одном файле.
               Библиотека может быть использована программой LINK для
         согласования внешних ссылок. 
               LIB  создает  для  библиотеки таблицу содержимого, где
         располагаются имена  объектных  модулей.  LINK  выбирает  из
         библиотеки  только  те  модули,  на которые имеются ссылки в
         обрабатываемой им программе.
               LIB  выполняет  с  библиотечными   файлами   следующие
         операции:
               1. Создание новой библиотеки.
               2. Проверка содержимого существующей библиотеки. 
               3. Печать листинга библиотечных ссылок.
               4. Сопровождение библиотек.
               
               Эти функции подробно описаны в последующих разделах.
               
               
               
               
               
                              6.2. Запуск LIB.

               
               
               Запуск LIB может быть осуществлен тремя способами:
               1. С использованием подсказок.
               2. При помощи командной строки DOS.
               3. С использованием файла ответа.
               
               
               Для запуска  LIB с использованием подсказок необходимо
         ввести командную строку, содержащую только имя программы LIB
         со  спецификацией  подоглавления,  если  она требуется.  LIB
         перейдет в диалоговый режим и серией  подсказок  запросит  у
         пользователя    информацию   о   следующих   объектах (ответ
         заключается в наборе требуемых символов  и  нажатии  клавиши
 
                                     - 59 -
         
         
         ENTER): 
               1. Имя  библиотеки,  с   которой  будет  производиться
                  работа. Если  при  ответе  не  указано  расширение,
                  предполагается  LIB.  Если  библиотеки  с введенным
                  именем не существует, LIB выдаст запрос:
                  Library file does not exist. Create?
                  Ответ y обеспечит создание библиотеки, n -  возврат
                  в  DOS.  В  этом  ответе  может  быть  задана опция
                  /PAGESIZE, описание которой приводится ниже.
               2. Операции  с  библиотекой.  Ответом  является  набор
                  команд   LIB,   которые  описаны  в  п.6.3.4.  Если
                  команды LIB не помещаются на строке, в ее последней
                  позиции  следует  поставить  признак  продолжения -
                  символ & и нажать ENTER,  после  чего  можно  будет
                  продолжать ввод команд. 
               3. Имя файла листинга. Если  не  было  задано  никаких
                  модификаций библиотеки, LIB создает файл листинга и
                  возвращает управление в DOS.
               4. Имя выходной библиотеки. Этот запрос  появляется  в
                  том случае, когда была специфицирована хотя бы одна
                  операция модификации библиотеки. Если при ответе не
                  указано  расширение, предполагается LIB. Библиотека
                  с указанным именем будет создана как копия  рабочей
                  библиотеки   и  все  операции  будут  производиться
                  именно с ней. Если нажать ENTER,  не  введя  имени,
                  операции будут производиться с рабочей библиотекой.
                  В этом случае для старой библиотеки  будет  создана
                  копия с расширением BAK.
                  
               Если в  каком-либо  ответе  после  первого встречается
         символ  ;  , LIB устанавливает оставшуюмя входную информацию
         по умолчанию. 
               В любом ответе могут быть заданы ответы на последующие
         запросы в формате командной строки для запуска LIB.
               
               Для  запуска  LIB    посредством   командной   строки,
         необходимо ввести командую строку следующего вида:
               
         LIB <имя старой библиотеки>[/PAGESIZE:<число>][<команды>]
         [,<имя файла листинга>][,<имя новой библиотеки>]]][;]
               
               Назначение библиотек и  правила  умолчания  аналогичны
         случаю  запуска  LIB с использованием подсказок. Команды LIB
         описаны в п.6.3.4. 
               Символ   ;   обозначает   конец   строки   и    должен
         кодироваться    последним,    если   он   есть.   Оставшаяся
         неопределенной информация устанавливается по умолчанию.
               
               Спецификации   исходной   информации  LIB  могут  быть
         заранее занесены в специальный файл ответа. Имя этого  файла
         с предшествующим символом @ и указанием пути поиска, если он
         нужен, может быть помещено в любом месте ответа на подсказку
         или  командной  строки  и трактуется, как если бы содержимое
         файла ответа было непосредственно  вставлено  в  это  место.
         Следует,    однако,   помнить,   что   комбинация   символов
 
                                     - 60 -
         
         
         CARRIAGE-RETURN / LINE-FEED в файле ответа  интерпретируется
         как ENTER в подсказке или запятая в командном файле. 
               Общий вид файла ответа:
         <имя библиотеки>[/PAGESIZE:<число>]
         [<команды>]
         [<имя файла листинга>]
         [<имя выходной библиотеки>]
               
               Каждая  группа  данных  должна задаваться на отдельной
         строке.  Если  группа  не  помещается  на  одной  строке,  в
         последней позиции строки должен стоять признак продолжения -
         символ  & . 
               В файле ответа  могут  быть  опущены  компоненты,  уже
         определенные ответами на подсказки или командной строкой. 
               При обнаружении в файле ответа симвода ; остаток файла
         игнорируется,    и   оставшаяся   неопределенной  информация
         устанавливается по умолчанию.
               При использовании файла ответа его содержимое выдается
         на  консоль  в  форме  подсказок.  Если  определена  не  вся
         информация LIB переходит в диалоговый режим.
               Если  файл  ответа  не  содержит  комбинации  символов
         CARRIAGE-RETURN  /  LINE-FEED или символа ;  , LIB выдает на
         консоль последнюю строку файла и ожидает нажатия ENTER. 
               
               Единственная опция LIB, задаваемая при  имени  рабочей
         библиотеки,  определяет  размер  страницы библиотеки и имеет
         вид:
         /PAGEZIZE:<число>       или   /P:<число>
               Указанное  число  задает  размер страницы библиотеки в
         байтах и должно быть целым четным числом в пределах от 2  до
         32768. По умолчанию принимается 128 для новой библиотеки или
         размер   страницы   существующей библиотеки. 
               Размер страницы  влияет  на  выравнивание  хранимых  в
         библиотеке  модулей.  Модули  всегда  располагаются с начала
         страницы, считая от начала файла. 
               Из-за  индексной   технологии   поиска   и   хранения,
         реализуемой  LIB,  библиотека  с  большим  размером страницы
         может содержать большее  число  модулей.  Однако,  при  этом
         возможен   значительный   перерасход   памяти   на    диске.
         Рекомендуется  создавать   библиотеки   с   малым   размером 
         страницы. 
               
               Имя  каждого файла  может сопровождаться информацией о
         подоглавлении,  содержащем этот  файл, иначе поиск исходного
         файла или создание выходного файла будет  осуществляться   в
         текущем подоглавлении.
               Работа  LIB   может  быть  в  любой  момент прекращена
         нажатием клавиш CONTROL-C.
               
               
               
               
               
               
               
 
                                     - 61 -
         
         
                        6.3. Функции и команды LIB.
               
               
               Среди   операций   с  библиотеками,  выполняемых  LIB,
         следует различать функции LIB и команды LIB. 
               Функции  LIB  не  приводят  ни  к  каким  модификациям
         существующих данных. Они описаны в пп.6.3.1, 6.3.2 и 6.3.3.
               Команды  LIB  предназначены для модификации библиотек.
         Выполнение команд всегда влечет за собой создание  резервной
         копии  исходной библиотеки, хранящей состояние библиотеки до
         начала коррекций. Именно команды, а не функции LIB  вводятся
         в  ответе на подсказку, в командной строке и в файле ответа.
         Команды LIB описаны в п.6.3.4.
               
               
               
               
                      6.3.1. Создание новой библиотеки.

               
               Новая библиотека создается при запуске  LIB  в  случае
         указания  имени  несуществующей библиотеки  и утвердительном
         ответе на подтверждающий запрос при использовании подсказок.
               Если используются команды  модификации  библиотеки,  в
         новую   библиотеку   перед  началом  модификаций  копируется
         содержимое  исходной  библиотеки,  которая  в  этом   случае
         считается  резервной копией. Команды LIB выполняются с новой
         библиотекой.
               
               
               
               
               
                   6.3.2. Проверка содержимого библиотеки.

               
               Проверка  содержимого   библиотеки   выполняется   при
         задании  во  всех  режимах запуска только имени библиотеки и
         символа ; . Она заключается  в  проверке  корректности  всех
         входов  библиотеки, что может производиться, например, после
         перемещения библиотеки.
               LIB автоматически  осуществляет  проверку  содержимого
         каждого добавляемого в библиотеку модуля.
               
               
               
               
               
                  6.3.3. Листинг перекрестных ссылок библиотеки.

               
               Файл    листинга    перекрестных    ссылок   создается
         при отсутствии  команд  LIB  и  спецификации  имени  файла в
         соответствующих  подсказке,  позиции  командной  строки  или
         строке файла ответа.
 
                                     - 62 -
         
         
               Листинг перекрестных ссылок содержит 2 списка:
               1. Список всех общих символов в библиотеке с указанием
         имен содержащих их модулей.
               2.Список модулей библиотеки с указанием содержащихся в
         них общих символов.
               
               
               
               
               
                           6.3.4. Команды LIB.

               
               Команды  LIB  служат  для  сопровождения  библиотек  и
         обеспечивают   добавление,   удаление,   замену   модулей  в
         библиотеке,  а также копирование  и  перемещение  модулей  в
         новые библиотеки.
               Команды LIB описаны ниже.
               
               
               1. Добавление модуля в библиотеку. Синтаксис:
               
               +<имя объектного файла>
               
               Модуль,  находящийся  в указанном объектном файле, имя
         которого, если  нужно  дополнено  описанием  пути  поиска  в
         подоглавлениях,  добавляется  в  текущую библиотеку. Если не
         указано расширение имени  объектного  файла,  предполагается
         OBJ.
               Модуль помещается в библиотеку под именем, совпадающим
         с базовым именем объектного файла.
               Между знаком + и именем файла не должно быть пробелов.
               
               
               2. Удаление модуля из библиотеки. Синтаксис:
               
               -<имя модуля>
               
               Модуль  с  указанным  именем  удаляется   из   текущей
         библиотеки. 
               Следует  иметь  в  виду,  что  команды удаления всегда
         отрабатываются до команд добавления независимо от их порядка
         в  командной  строке.  Такой  порядок спасает LIB от попыток
         замены существующей версии модуля на новую версию.
               Имена  модулей  могут  задаваться  как   на   регистре
         строчных букв, так и на регистре заглавных букв.
               
               
               3. Замена модуля библиотеки. Синтаксис:
               
               -+<имя модуля>
               
               Модуль   с  указанным  именем  замещается  модулем  из
         объектного файла, имеющим то же базовое имя, что и указанное
         имя,  и  расширение OBJ. LIB сначала удаляет модуль, а затем
 
                                     - 63 -
         
         
         ищет файл.
               Имена  модулей  могут  задаваться  как   на   регистре
         строчных букв, так и на регистре заглавных букв.
               
               
               4. Копирование модуля. Синтаксис:
               
               *<имя модуля>
               
               Модуль с указанным именем копируется  из  библиотеки в
         объектный   файл,  создаваемый  в  текущем  подоглавлении  и
         имеющий  базовое  имя,  совпадающее  с  именем   модуля,   и
         расширение OBJ.
               Имена  модулей  могут  задаваться  как   на   регистре
         строчных букв, так и на регистре заглавных букв.
               
               
               5. Перемещение модуля. Синтаксис:
               
               -*<имя модуля>
               
               Работа  этой  команды аналогична копированю с той лишь
         разницей,  что  после  копирования   модуль   удаляется   из
         библиотеки.
               
               
               6. Объединение библиотек. Синтаксис:
               
               +<имя библиотеки>
               
               Содержимое  указанной библиотеки добавляется в текущую
         библиотеку. Следует помнить, что в  этом  случае  расширение
         имени  опускать  нельзя,  т.к.  тогда  указанное  имя  будет
         интерпретироваться как имя объектного файла.
               Модули помещаются в конец текущей библиотеки. Исходная
         библиотека не изменяется.
               Этой командой в библиотеки MS-DOS могут быть добавлены
         библиотеки XENIX или INTEL.
                             
                                     - 64 -
               
               
               
               
               
                   7. MAKE: утилита сопровождения программ.
                   ----------------------------------------
               
               
               
               
               
                           7.1. Общие сведения.
               
               
               Использование   утилиты  сопровождения  программ  MAKE
         позволяет автоматизировать процесс разработки и эксплуатации
         программ на ассемблере и языках высокого уровня. После того,
         как были внесены изменения в исходный файл,  при помощи MAKE
         могут  быть  выполнены  действия, необходимые по отображению
         этих изменений в выходных файлах.
               В отличие от других программ пакетной обработки,  MAKE
         сравнивает  даты  последних модификаций выходных   (целевых)
         файлов с датами  последних модификаций исходных  (требуемых)
         файлов.  MAKE  выполняет  поставленную  задачу,  только если
         целевой  файл старше.  Это может  сэкономить  много времени,
         например,  при  разработке  программ, содержащихся во многих
         исходных файлах или требующих нескольких шагов компиляции.
               
               
               
               
               
               
               
               
                    7.2. Запуск и особенности работы MAKE.
               
               
               
               Перед запуском MAKE  должен  быть  создан  специальный
         файл  описаний MAKE, содержимое которого задает поставленную
         задачу и определяет требуемые для ее выполнения файлы. 
               Файл  описаний  состоит  из  одного   или   нескольких
         описаний цели/источника. Каждое описание задается в виде:
               
         <имя исходного файла> : <имена требуемых файлов>
               <команда>
                  ...
               
               Предполагается, что указанный исходный файл может быть
         преобразован,  для  чего   могут   понадобиться   файлы   со
         специфицированными после : именами. 
 
                                     - 65 -
         
         
               Имена  файлов  при  необходимости  могут быть снабжены
         спецификациями путей поиска в подоглавлениях.
               <Команда>  рассматривается  как  имя   исполнительного
         файла или команда MS-DOS. 
               Может  быть  задано  любое  число требуемых файлов, но
         только  один  исходный  (целевой).  Имена  требуемых  файлов
         должны  разделяться  хотя  бы  одним  пробелом.  Если они не
         помещаются  на  одной  строке,  может  быть   специфицирован
         признак продолжения - символ  \ .
               Может  быть  задано  любое число команд DOS и/или имен
         исполнительных файлов, но  каждая  команда  или  имя  должны
         располагаться на отдельной строке и начинаться с символа TAB
         или хотя бы одного пробела. Команды  или  файлы  выполняются
         лишь в том случае, если хотя бы один из требуемых файлов был
         модифицирован после создания или модификации целевого,  т.е.
         должно выполняться одно из двух условий:
               - целевой файл старше требуемого;
               - целевой файл не существует.
               Может быть задано любое число описаний цели/источника.
         Последняя  строка  предыдущего описания должна отделяться от
         первой строки следующего описания  хотя  бы  одной  строкой,
         содержащей все пробелы.
               При  появлении  символа  #  остаток  строки  считается
         комментарием. В области команд  символ  #  может  находиться
         только в 1-й позиции строки. 
               Следует   помнить,  что  порядок  следования  описаний
         крайне важен, т.к. в процессе их  отработки  могут  меняться
         даты модификаций файлов, что оказывает влияние на дальнейшую
         работу MAKE. 
               Запуск MAKE осуществляется введением командной  строки
         следуюшего вида:
               
         MAKE [<опции>][<макроопределения>]<имя файла описаний>
               
               Опции  и  макроопределения MAKE описаны в пп.7.3 и 7.4
         соответственно. 
               Имя файла описаний MAKE обычно не имеет  расширения  и
         совпадает   с  базовыми  именами  используемых  в  описаниях
         файлов, но это не является обязательным.
               Если MAKE  обнаруживает,  что  очередное  описание  по
         каким-либо причинам не может быть отработано, осуществляется
         переход к следующему описанию. 
               Если в процессе работы выяснится, что целевой файл  не
         существует,  MAKE  продолжает  работу,  т.к. этот файл может
         быть создан последующими командами. Если  же  не  существует
         требуемый  или  командный  файл  или  возникает  ошибка  при
         выполнении  команды,  MAKE  прекращает  свою  работу,  а  на
         консоль выдается поясняющее сообщение.
               
               
               
               
               
               
               
 
                                     - 66 -
         
         
                           7.3. Опции MAKE. 
               
               
               Каждая  опция  MAKE  в  командной  строке запуска MAKE
         обозначается предшествующим символом  / .
               Описание опций MAKE приведено ниже:
               
               /D  - Выдавать на консоль  даты  последних  модификаций
                     каждого сканируемого файла.
                     
               /I  - Игнорировать   коды  возврата  после  вызываемых
                     программ. 
                     
               /N  - Выдавать на консоль команды, выполнение  которых
                     не осуществляется.
                     
               /S  - Не выдавать на консоль сообщений.
                     
                     
                     
                     
               
                     
                     
                            7.4. Макроопределения.
                     
               
               Использование   макроопределений   позволяет  отложить
         определение  компонент  описания  работы  MAKE  до   момента
         запуска. Они могут располагаться как в файле описаний, так и
         в командной строке.
               Существуют две формы макроопределений:
               
         <имя>=<значение>
               или
         $(<имя>)
               
               Первая  форма задает значение символичекому параметру,
         который  может  использоваться  для  определения   компонент
         описания.  Допустимо  любое  число  пробелов между элементом
         <имя> и  символом  =  и  между  этим  символом  и  элементом
         <значение>, которые игнорируются. Пробелы, специфицированные
         после  <значение>,  рассматриваются  как   часть   значения.
         Пробелы   как  часть  значения  в  командной  строке  должны
         заключаться в двойные апострофы  " . 
               В файле описаний MAKE каждое  макроопределение  должно
         занимать отдельную строку. 
               Одно  и  то  же имя может быть определено в нескольких
         местах.  Подстановка  значений осуществляется в соответствии
         со следующим списком (в порядке убывания приоритетов):
               1. Из командой строки.
               2. Из файла описаний MAKE.
               3. Из текущего  окружения  (например,  ключевые  слова
         DOS).
               
 

                                     - 67 -
         
         
               Вторая  форма  макроопределений  использует  значение,
         определенное в другом  месте.  Элемент  <имя>  приводится  к
         изображению на регистре заглавных букв.
               
               Допускается    вложенность   макроопределений,   когда
         внутреннее макроопределение определяется через внешнее.  При
         этом следует избегать рекурсии. 
               Пример рекурсивной вложенности макроопределений:
               A=$(B)
               B=$(A)
               
               Существуют   3   специальные  макропеременные, имеющие
         следующие фиксированные значения:
               $*   - часть имени (без расширения) целевого файла;
               $@   - полное имя целевого файла;
               $**  - полный список требуемых файлов.
               Эти  макропеременные   не   требуют   предварительного
         описания и могут использоваться в файле описаний MAKE.
               
               
               
               
               
                          7.5. Правила вывода.

               
               MAKE  обеспечивает  возможность задания правил вывода,
         которые  помогают  правильно  интерпретировать   неполностью
         определенные конструкции.
               Правила  вывода могут находиться в файле описаний MAKE
         или в специальном файле с именем TOOLS.INI,  поиск  которого
         осуществляется   на   активном   драйве   в  подоглавлениях,
         определенных командой DOS PATH. В файле  TOOLS.INI  правилам
         вывода   должна  предшествовать  строка,  первыми  символами
         которой являются:
         [make]
               Поиск  правила  вывода  осуществляется   в   следующей
         последовательности:
               1. В файле описаний MAKE.
               2. В файле TOOLS.INI.
               
               Правила вывода задаются в виде:
         .<расширение требуемого файла>.<расширение целевого файла>:
               <команда>
               <команда>
                  ...
               
               Пример: содержимое файла описаний MAKE:
         .asm.obj:
               MASM $*.asm,,,;
         test1.obj: test1.asm
         test2.obj: test2.asm
               MASM test2.asm;
               
               Правило  вывода занимает первые 2 строки. Прочитав 3-ю
 
                                     - 68 -
         
         
         строку, MAKE  обнаруживает, что  описание неполно,  т.к. 4-я
         строка  является  уже  началом  следующего  описания.  Поиск
         нужного правила  вывода  ведется  по  совпадению  расширений
         файлов  строки  3  с  указанными  в правиле. После отыскания
         правила  MAKE,  обработав   макропеременную   $*,  выполняет
         командную строку:
               MASM test1.asm,,;
               4-я   и   5-я  строки  преставляют  собой  законченное
         описание,  и  для  его  интерпретации  использования  правил
         вывода не требуется.
                   
                         ПРИДНЕПРОВСКИЙ ФИЛИАЛ
                  СОВЕТСКО-БОЛГАРО-ФИНСКОГО ПРЕДПРИЯТИЯ
                    "Новые информационные технологии"



               
               
               







                         СИСТЕМА  ПРОГРАММИРОВАНИЯ 
                      
                         НА МАКРОАССЕМБЛЕРЕ MS-DOS






                           Справочное руководство




                     Часть 2. Введение в язык ассемблера   
                     

                         (редакция 1, январь 1989)
                   
                   
                   
                   
                   
                   
                   

                   
               
               
                   
                   
                   
                   
                   
                   
                   
                   
                        Днепропетровск 1989г.
                                        
                                         
                                     -  2 -
                                     
                                     
                                     
                                     
                                     
                






               
 
                                         
                                     -  3 -
                             
                                                           

                                   Содержание


         1. Общие сведения о языке................................. 4
         2. Первичные элементы языка ассемблера.................... 6
         2.1. Алфавит.............................................. 6
         2.2. Идентификаторы, переменные, метки, имена,
              ключевые слова....................................... 6
         2.3. Типы данных.......................................... 8
         2.3.1. Целые числа........................................ 8
         2.3.2. Действительные числа............................... 8
         2.3.3. Десятичные числа................................... 9
         2.3.4. Знаковые и строковые константы..................... 9
         2.4. Предложения..........................................10
         2.5. Комментарии..........................................10
         3. Регистры процессора и способы адресации................12
         4. Выражения..............................................14
         4.1 Операнды выражений....................................14
         4.2. Операторы............................................17
         4.3. Особенности вычисления выражений.....................24
         4.3.1. Приоритеты операций................................24
         4.3.2. Ссылки вперед......................................24
         4.3.3. Контроль типов.....................................25
            
         Приложение 1. Ключевые слова языка ассемблера.............26
         Приложение 2. Регистры и адресация процессора 8088........27
 
                                                                    
                                     - 4-
               
               
               
               
               
                        1. Общие сведения о языке.
               
               
               
               Настоящее  руководство  содержит  сведения о первичных
         элементах  языка   ассемблера   системы   MS-DOS   и   может
         представлять интерес для пользователей, впервые приступающих
         к изучению языка ассемблера.
               Язык ассемблера системы MS-DOS реализован  при  помощи
         макроассемблера   MASM  (см.  "Система  программирования  на
         макроассемблере  MS-DOS.  Часть  1.  Пакет   макроассемблера
         MS-DOS",  п.2)  и  представляет собой базовый язык семейства
         микропроцессоров INTEL 8086/80186/80286. Он включает в  себя
         инструкции  процессоров  8086,  8088,  80186  и  80286 и как
         дополнительные  возможности  -   инструкции   арифметики   с
         плавающей  точкой  процессоров  8087  и  80287, работающих в
         режиме сопроцессора.
               Синтаксис    инструкций    процессора    предоставляет
         программисту широкий выбор типов данных: целые числа, строки
         знаков, упакованные  десятичные  числа,  числа  с  плавающей
         точкой, структуры и записи. 
               Язык  ассемблера  имеет мощный набор директив, который
         позволяет    полностью     использовать     сегментированную
         архитектуру процессоров 8086, 80186 и 80286.
               В  языке  имеются директивы условного ассемблирования,
         обеспечивающие выборочное исключение частей исходного текста
         из процесса ассемблирования и, с другой стороны, возможность
         подключения фрагментов исходного текста из других файлов.
               Ассемблер  имеет  набор  макродиректив,  использование
         которых  позволяет относительно просто повторять общие блоки
         предложений несколько раз или заменять макроимена в исходном
         тексте целыми последовательностями предложений.
               Макроассемблер  MASM генерирует переместимый объектный
         код для процессоров 8086, 8088, 80186 и  80286.  Формируемые
         объектные  модули  в целом совместимы с объектными модулями,
         созданными компиляторами языков высокого уровня.
               В  настоящем  руководстве  приняты  следующие условные
         обозначения.
               Конструкция, заключенная в двойные  квадратные  скобки
         [[ ]], может отсутствовать.
               Из нескольких  конструкций,  разделенных символом  | ,
         может быть выбрана только одна.
               Текст,   состоящий   из   букв  русского  алфавита  на
         регистре  строчных  букв  и  других  символов,   разделенных
         символом  -  ,  обозначает  нетерминальные  элементы  и  при
         кодировании   должен   замещаться   требуемыми   по   смыслу
         конструкциями.  
 
                                     -  5 -
         
         
               Многоточие  ...  обозначает  возможность многократного
         повторения предшествующей конструкции.
               Обозначаемые  буквами терминальные символы конструкций
         даны в изображении регистра заглавных букв. При  кодировании
         это  не  является обязательным, кроме тех случаев, когда это
         оговорено особо.
 
                                     -  6 -
               

               
               
               
                    2. Первичные элементы языка ассемблера.

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

               
               Макроассемблер распознает следующий набор знаков:
               
               A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
               a b c d e f g h i j k l m n o p q r s t u v w x y z
               0 1 2 3 4 5 6 7 8 9 
               ? @ _ $ : . [ ] ( ) < > { } 
               + / * & % ! ' ~ | \ = # ^ ; , ` "
               
               
               
               
               
                     2.2. Идентификаторы, переменные,
                       метки, имена, ключевые слова.
               
               
               
               Конструкции   языка    ассемблера    формируются    из
         идентификаторов и ограничителей.
               Идентификатор  представляет  собой  набор букв, цифр и
         символов   _  ,  ?,  $  или  @,  не  начинающийся  с  цифры.
         Идентификатор должен полностью размещаться на одной строке и
         может содержать от 1 до  31  символа  (точнее,  используются
         только    первые   31   символ   идентификатора,   остальные
         игнорируются) . Следует заметить, что  символ  _  ,  хотя  и
         допускается    в    качестве    компоненты   идентификатора,
         ассемблером игнорируется. Поэтому, например,  идентификаторы
         A_B и AB совпадают. 
               Друг от друга идентификаторы  отделяются  пробелом или
         ограничителем,  которым  считается  любой   недопустимый   в
         идентификаторе символ.
 
                                     -  7 -
         
         
               Посредством  идентификаторов  представляются следующие
         объекты программы:
               1. Переменные.
               2. Метки.
               3. Имена.
               
               Переменные    идентифицируют   хранящиеся   в   памяти
         данные. Все переменные имеют три атрибута:
               1. СЕГМЕНТ,  соответствующий  тому  сегменту,  который
                  ассемблировался, когда была определена переменная.
               2. СМЕЩЕНИЕ,  являющееся смещением данного поля памяти
                  относительно начала сегмента.
               3. ТИП,  определяющий  число  байтов,   подвергающихся
                  манипуляциям при работе с переменной.
               
               Метка  является   частным  случаем  переменной,  когда
         известно, что определяемая ею память содержит машинный  код.
         На  нее  можно ссылаться посредством скачков (переходов) или
         вызовов. Метка имеет два атрибута: СЕГМЕНТ и СМЕЩЕНИЕ. Метка
         также  может  быть  определена через другую метку директивой
         EQU.  
               Именами считаются символы, определенные директивой EQU
         и имеющие значением  символ  или  число.  Значения  имен  не
         фиксированы  в  процессе  ассемблирования, но при выполнении
         программы именам соответствуют константы. С переменными дело
         обстоит   наоборот   (если   значением   переменной  считать
         содержимое идентифицируемой ею области памяти). 
               Примеры имен:
               
         REGS   EQU   AX
         DIGIT  EQU   18
               
               Следующая директива определяет не имя:
               
         VARIABLE EQU   LB
               .............
         LB:      HLT
               
               Некоторые   идентификаторы,    называемые    ключевыми
         словами, имеют фиксированный смысл  и  должны  употребляться
         только в соответствии с этим. Ключевыми словами являются:
               1. Директивы ассемблера.
               2. Инструкции процессора.
               3. Имена регистров.
               4. Операторы выражений.
               
               Полный  список ключевых слов языка ассемблера приведен
         в Приложении 1.
               
               Следует помнить, что  обычно  ассемблер  не  различает
         строчные  и заглавные буквы, и идентификаторы могут включать
         в себя буквы обоих регистров. Например, идентификаторы AbS и
         abS  считаются  совпадающими.  Различие  между  строчными  и
         заглавными  буквами может быть установлено опциями /ML и /MX
         MASM, что может понадобиться, например, для совместимости  с
 
                                     -  8 -
         
         
         программами  на  регистро-чувствительных   языках   высокого
         уровня.
               
               
               
               
               
                             2.3. Типы данных.

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

               
               Синтаксис:
               
               цифры    
               цифрыB
               цифрыQ
               цифрыO
               цифрыD
               цифрыH
               
               Латинский символ, который может кодироваться на  обоих
         регистрах, задает основание счисления числа: B - двоичное, Q
         и O  -  8-ричное,  D  -  десятичное,  H  -  16-ричное.
               16-ричные  числа  не  должны  начинаться  с  буквенных
         16-ричных  цифр  (например, вместо некорректного ABh следует
         употреблять  0ABh).  16-ричные  цифры  от  A  до   F   могут
         кодироваться на обоих регистрах.
               Первая  форма  целого  числа  использует  умалчиваемое
         основание, которое может устанавливаться директивой  .RADIX.
         Если директива .RADIX не используется, полагается D.

               
               
               
               
               
                      2.3.2. Действительные числа.
               
               
               Синтаксис:

               цифрыR
               [[+|-]]цифры.цифры[[E[[+|-]]цифры]]

               Первый    формат    задает    16-ричное   кодированное
 

                                     -  9 -
         
         
         представление содержимого памяти, содержащей  действительное
         число.     Действительное     число    может    кодироваться
         последовательностью из 8, 12 или 20 16-ричных цифр (возможно
         добавление  предшествующих  0,  т.к.  первой   должна   быть
         десятичная   цифра).  Каждое  число  имеет  знак,  зависимую
         экспоненту и мантиссу, которые хранятся как поля бит в самом
         числе.  Точный  размер и смысл каждого бита зависит от числа
         бит в действительном числе.  
               Кодированные действительные числа могут использоваться
         в директивах DD, DQ и DT. Число 16-ричных цифр должно быть 8
         для  DD,  16  для DQ и 20 для DT (с предшествующим 0 - 9, 17
         или 21 соответственно). 
               Вторым  форматом  задается  действительное   число   с
         плавающей точкой. Цифры должны быть десятичными. Такие числа
         могут использоваться в директивах DD, DQ и DT.
               
               
               
               
               
                         2.3.3. Десятичные числа.
               
               
               Синтаксис:
               
               [[+|-]]цифры
               
               Этот вид соответствует упакованному формату десятичных
         чисел,  который включает в себя 1 знаковый байт и 9 значимых
         байтов.  Каждый  значимый  байт содержит 2 десятичные цифры.
         Допустимо кодирование до 18 включительно цифр.  Старший  бит
         знакового байта имеет значение 0 для положительных чисел и 1
         - для отрицательных.  
               Упакованные   десятичные    числа    имеют    то    же
         представление,  что  и  целые  десятичные числа (п.2.3.1) за
         исключением того, что они могут иметь знак и  использоваться
         только в директиве DT.

               
               
               
               
                    2.3.4. Знаковые и строковые константы.

               
               Синтаксис:
               
               'знаки'
               "знаки"
               
               Знаковая  константа  состоит  из одного знака алфавита
         языка.  Строковая  константа  включает  в  себя  2 или более
         знака. 
               В  отличие  от  других  компонент   языка,   строковые
         константы чувствительны к регистру.
 
                                     - 10 -
         
         
               Символы  '  и  "  в теле константы должны кодироваться
         дважды.
               
               
               
               
                              2.4. Предложения.
               
               
               Синтаксис:
               
               [[имя]] мнемоника [[операнды]][[;комментарии]]
               
               Предложения определяют структуру и функции  программы.
         Они  могут  начинаться  с любой позиции и содержать не более
         128 символов. 
               Предложение не может содержать внутри себя  комбинации
         символов   CARRIAGE-RETURN/LINE-FEED,  т.е.  не  может  быть
         продолжено на другую строку. Однако, все предложения,  кроме
         последнего, должны заканчиваться этой комбинацией символов.
               Все  предложения языка ассемблера делятся на директивы
         ассемблера и инструкции процессора.
               Директивы   ассемблера   действуют   лишь   в   период
         компиляции  программы  и  позволяют   устанавливать   режимы
         компиляции,   задавать   структуру   сегментации  программы,
         определять  содержимое  полей  данных,   управлять   печатью
         листинга программы, а также обеспечивают условную компиляцию
         и  некоторые другие функции. В результате обработки директив
         макроассемблером объектный код не генерируется.
               Инструкции процессора представляют собой мнемоническую
         форму  записи  машинных  команд, непосредственно выполняемых
         микропроцессором.   Все   инструкции   в   соответствии    с
         выполняемыми ими функциями делятся на 5 групп:
               1. Инструкции пересылки данных.
               2. Арифметические, логические и операции сдвига.
               3. Операции со строками.
               4. Инструкции передачи управления.
               5. Инструкции управления процессором.
               
               Подробнее  о  директивах  ассемблера   и   инструкциях
         процессора  см. "Система программирования на макроассемблере
         MS-DOS. Часть 3. Элементы языка ассемблера".
               
               
               
               
               
                              2.5. Комментарии.
               
               
               Часть строки исходного текста после символа ; (если он
         не  является элементом знаковой константы или строки знаков)
         считается комментарием и ассемблером игнорируется.
               Комментарии вносятся в программу как поясняющий  текст
         и  могут  содержать  любые  знаки  до  ближайшей  комбинации
 
                                     - 11 -
         
         
         символов CARRIAGE-RETURN/LINE-FEED, т.е. до конца строки. 
               Для создания комментариев, занимающих несколько строк,
         может быть использована директива COMMENT. 
                                          
                                     - 12 -
               
               
               
               
               
                 3. Регистры процессора и способы адресации.
               
               
               
               Семейство   микропроцессоров   8086/80186/80286  имеет
         одинаковый  набор  регистров  и  сходные  режимы   адресации
         памяти,  поэтому  для простоты изложения в настоящем разделе
         описываются регистры и адресация процессора 8088.
               Все   регистры   процессора   8088,   кроме   случаев,
         оговоренных особо, занимают 2 байта.
               Существуют 5 файлов регистров (Приложение 2):
               1. Регистры  общего  назначения:  AX, BX, CX и DX. Они
                  могут быть использованы  для  хранения  данных  или
                  элементов  адреса  в адресных выражениях. Каждый из
                  этих регистров можно рассматривать как совокупность
                  двух  регистров,  занимающих  его старший и младший
                  байты. Например, регистр AH соответствует  старшему
                  байту,  а регистр AL - младшему байту регистра AX и
                  т.п. как показано в Приложении 2.
               2. Регистры указателя: SP  и  BP.  Обычно  регистр  SP
                  используется  в операциях со стеком, а регистр BP -
                  как базовый регистр  в  адресных  выражениях  (что,
                  впрочем, не является обязательным).
               3. Индексные   регистры:   SI   и   DI.   Они   обычно
                  используются в операциях со строками для  адресации
                  источника (SI) и приемника (DI). 
               4. Регистры   сегмента:  CS,  DS,  SS  и  ES.  Условно
                  программа  на  языке  ассемблера  состоит  из   4-х
                  сегментов,   каждый  из  которых  адресуется  своим
                  регистром сегмента:
                  - сегмент  кода,  содержащий  инструкции  программы
                    (адресуется регистром CS);
                  - сегмент    данных,    содержащий     используемые
                    программой поля данных (адресуется регистром DS);
                  - сегмент  стека,  содержащий   стек   пользователя
                    (адресуется регистром SS);
                  - экстра  сегмент,  содержащий  данные,  общие  для
                    нескольких программ (адресуется регистром ES).
               5. Указатель  инструкции  (IP)  и  флаги.  Регистр  IP
                  вместе  с  регистром  CS,  если он используется для
                  адресации кода программы, используется  процессором
                  для выборки с целью исполнения очередной инструкции
                  программы.  Регистр  флагов  состоит  из   9   бит,
                  расположение   и  назначение  которых  показаны   в
                  Приложении 2. Значения флагов  отражают  результаты
                  выполнения  процессором машинных инструкций и могут
                  анализироваться, например,  инструкциями  условного
                  перехода.
 
                                     - 13 -
         
         
               
               Описанные выше назначения регистров не являются строго
         обязательными, но при отсутствии особых указаний принимаются
         по умолчанию и способствуют освобождению исходного текста от
         излишних спецификаций.
               Кроме того,  существуют еще несколько правил умолчания
         (с более низким приоритетом, чем у указанных выше):
               1. Регистр BP обычно  содержит  смещение  относительно
                  содержимого регистра SS.
               2. Регистры  BX,  SI  и  DI  обычно  содержат смещения
                  относительно содержимого регистра DS.
               3. Регистр DI всегда  содержит  смещение  относительно
                  содержимого  регистра  ES,  если  он используется в
                  инструкциях обработки строк.
               
               Полный   физический   адрес   памяти  процессора  8088
         содержит 20 бит, что позволяет адресовать 1М памяти.
               Процессор  8088  реализует  четырехкомпонентную  схему
         адресации   (см.   Приложение   2),   при   которой   полный
         20-разрядный адрес образуется из 4-х источников:
               1. Регистр сегмента.
               2. Базовый регистр.
               3. Индексный регистр.
               4. Непосредственное смещение.
               
               20-разрядный   физический   адрес   формируется  путем
         сложения   содержимого   одного   из   регистров   сегмента,
         умноженного  на  16  (для  получения  20-разрядного  числа),
         содержимого  базового  и  индексного  регистров,   а   также
         смещения, представленного целым числом в пределах  от  0  до
         65535.
               Поскольку  базовый  и  индексный  регистры  и смещение
         представляют собой 16-разрядные числа, они могут  адресовать
         память  в  пределах  64К  относительно  адреса,  задаваемого
         регистром сегмента.
               В  зависимости  от   спецификаций   и   местоположения
         источников  образования  полного  адреса  в языке ассемблера
         различают следующие способы адресации:
               1. Непосредственная,     когда     требуемые    данные
                  расположены непосредственно в команде,  а источники
                  образования адреса отсутствуют.
               2. Регистровая, когда данные расположены в регистре.
               3. Прямая,  когда в команде явно указан адрес сегмента
                  и смещение относительно его начала.
               4. Косвенная,  при   которой  присутствуют  один   или
                  несколько из указанных выше источников формирования
                  адреса.  Если   опущена    спецификация   смещения,
                  используется   смещение    0.     При    отсутствии
                  спецификации   какого-либо   регистра   применяются 
                  правила умолчания или, если это невозможно, регистр
                  не используется.
               
               Более  подробно способы кодирования адресных операндов
         описаны в п.4.1.
                                          
                                     - 14 -
               
               
               
               
               
                             4. Выражения.

               
               
               
               
               В языке ассемблера выражения могут быть использованы в
         инструкциях   или   директивах  и  состоят  из  операндов  и
         операторов. 
               Операнды представляют значения, регистры  или  позиции
         памяти,  используемые нужным образом по контексту программы.
         Они описаны в п.4.1.
               Операторы   выполняют   арифметические,    логические,
         побитовые   и  другие  операции  над  операндами  выражений.
         Операторы описаны в п.4.2.
               
               
               
               
               
                        4.1. Операнды выражений.
               
               
               Операнд выражения представляет собой константу, метку,
         переменную  или  другой символ, используемый в программе для
         представления значения, регистра или адреса памяти.
               Операнды бывают следующих типов:
               
               
               1. Константа. Синтаксис:
               
               число | строка | выражение
               
               Константой   считается   число,  строковая  константа,
         символ  или   выражение,   преобразуемое   в   фиксированное
         значение.   В   отличие   от   других  операндов,  константы
         представляют  значения,  используемые  в  выражениях  раньше
         (предпочтительней)  адресов  памяти.  Например,  в следующей
         инструкции 1 рассматривается ассемблером как число 1,  а  не
         как адрес памяти:
                     MOV AX,1
               Символ   считается   константой,   если  он  определен
         директивой EQU или оператором знакового равенства (=).
               
               
               2. Операнд прямой памяти. Синтаксис:
               
               сегмент : смещение
 
                                     - 15 -
         
         
               
               Операнд  прямой   памяти   реализует   прямой   способ
         адресации.  В качестве сегмента может использоваться регистр
         сегмента, имя сегмента или имя группы. Смещение лолжно  быть
         целым числом в пределах от 0 до 65535.
               Операнд  прямой  памяти  представляет абсолютный адрес
         памяти.
               
               
               3. Переместимый операнд. Синтаксис:
               
               символ
               
               Переместимый   операнд   представляет   адрес   памяти
         (сегмент  и  смещение). В отличие от операнда прямой памяти,
         переместимый операнд "привязан" к началу сегмента или группы
         и не имеет точного значения до обработки программы LINK.
               
               
               4. Указатель позиции. Синтаксис:
               
               $
               
               Этот  операнд  представляет  текущую позицию в текущем
         сегменте и имеет те же атрибуты, что и метка типа NEAR.
               
               
               5. Регистр (см. п.3).
               
               
               6. Базированный операнд. Синтаксис:
               
               смещение [BP]
               смещение [BX]
               
               Базированный  операнд  представляет  адрес  памяти  по
         отношению  к  содержимому  базового  регистра:  BP  или  BX.
               Смещением может  быть  непосредственное  значение  или
         операнд прямой памяти. Если смещение опущено, полагается 0. 
               Если  указан  регистр BP, физический адрес вычисляется
         относительно регистра SS, а если BX - относительно DS.
               Следующие   формы   записи   базированных    операндов
         эквивалентны:
               [смещение][BP]
               [BP+смещение]
               [BP].смещение
               [BP]+смещение
               
               
               7. Индексный операнд. Синтаксис:
               
               смещение [SI]
               смещение [DI]
               
               Индексный   операнд   представляет   адрес  памяти  по
 
                                     - 16 -
         
         
         отношению к содержимому индексного регистра: SI или DI. 
               Смещением может  быть  непосредственное  значение  или
         операнд прямой памяти. Если смещение опущено, полагается 0. 
               Физический адрес вычисляется относительно регистра DS.
               Следующие    формы    записи    индексных    операндов
         эквивалентны:
               [смещение][DI]
               [DI+смещение]
               [DI].смещение
               [DI]+смещение
               
               
               8. Базо-индексный операнд. Синтаксис:
               
               смещение [BP] [SI]
               смещение [BX] [DI]
               
               Базо-индексный   операнд   представляет  адрес  памяти
         относительно  суммы  содержимого   базового   и   индексного
         регистров. 
               Смещением может  быть  непосредственное  значение  или
         операнд прямой памяти. Если смещение опущено, полагается 0. 
               Если  указан  регистр BP, физический адрес вычисляется
         относительно регистра SS, а если BX - относительно DS.
               Следующие   формы   записи   базо-индексных  операндов
         эквиваленты:
               [смещение][BP][DI]
               [BP+DI+смещение]
               [BP+DI].смещение
               [DI]+смещение+[BP]
               Недопустимо лишь сочетание одновременно  двух  базовых
         или двух индексных регистров.
               
               
               9. Структура. Синтаксис:
               
               переменная.поле
               
               Этот   операнд   представляет   адрес   одного   члена
         структуры.  Переменная  должна  быть  именем  структуры  или
         операндом   памяти,   значением   которого   является  адрес
         структуры. Поле  должно  присутствовать  в  этой  структуре.
         Точка является оператором поля структуры (п.4.2).
               Адрес  вычисляется относительно сегмента или группы, в
         которых определена структура. 
               
               
               10. Запись. Синтаксис:
               
               имя-записи <[[значение]],...>
               
               Этот операнд ссылается к  значению  типа  запись.  Имя
         записи   должно   быть   определено  в  исходном  файле  как
         переменная типа запись директивой  RECORD.  В  скобках  <  >
         указываются  значения полей этой записи по порядку. Значения
 
                                     - 17 -
         
         
         могут включать в себя выражения и символы,  преобразуемые  в
         константы.   Если   значение  поля  опущено,  предполагается
         умалчиваемое значение для этого поля. 
               Значение этого операнда является константой.
               Пример:
         ENCODE RECORD HI:4,MID:3,LO:3
         REC1   ENCODE <3,2,1>
                MOV    AX,REC1
               Согласно объявлению запись ENCODE включает  в  себя  3
         поля   общей  длиной  10  бит.  После  выполнения  фрагмента
         содержимое регистра AX будет 0000000011010001b.
               
               
               11. Поле записи. Синтаксис:
               
               имя-поля-записи
               
               Этот операнд представляет позицию поля соответствующей
         записи.  Операнд  вычисляется  по  отношению к младшим битам
         поля и может быть использован только как константа. 
               Пример:
         ENCODE RECORD HI:4,MID:3,LO:3
         REC1   ENCODE <3,2,1>
                ...
                MOV    CL,HI      ; offset HI (6)  ->  CL
                MOV    DX,REC1
                ROR    DX,CL      ; rotate to right by 6
                MOV    REC1,DX
               Согласно объявлению запись ENCODE включает  в  себя  3
         поля   общей  длиной  10  бит.  После  выполнения  фрагмента
         содержимое поля REC1 будет 1111000000001001b.
               
               
               
               
               
                            4.2. Операторы.
               
               
               Ассемблер   обеспечивает   выполнение  арифметических,
         побитовых и  операторов  отношения,  позволяющих  различными
         способами манипулировать с операндами выражений. Кроме того,
         имеются  операторы  атрибутов,  выполняющие   действия   над
         атрибутами операндов. 
               В дополнение к этому для операций над операндами могут
         быть использованы оператор DUP и специальные макрооператоры,
         которые в настоящем руководстве не описываются.
               Ниже   даны   описания   используемых   в   выражениях
         операторов.
               
               
               1. Арифметические операторы. Синтаксис:
               
               выражение-1 * выражение-2
               выражение-1 / выражение-2
 

                                     - 18 -
         
         
               выражение-1 MOD выражение-2
               выражение-1 + выражение-2
               выражение-1 - выражение-2
               + выражение
               - выражение
               
               Эти   операторы   обеспечивают   выполнение   основных
         арифметических  действий.  Причем,  здесь  MOD  - остаток от
         деления выражения-1 на выражение-2, а знаком /  обозначается
         деление нацело. 
               Для  всех  операторов,  кроме  бинарных  +  и  -,  оба
         выражения должны быть целыми числами. Бинарные + и  -  могут
         быть   использованы   для   прибавления   к  (вычитания  от)
         переместимому операнду памяти целого числа. Бинарный - может
         использовать два переместимых операнда памяти, если значение
         выражения указывает в тот же сегмент. 
               Результатом   арифметического    оператора    является
         абсолютное значение.
               
               
               2. Операторы сдвига. Синтаксис:
               
               выражение SHR счетчик
               выражение SHL счетчик
               
               Операторы  SHR  и  SHL  сдвигают  значение   выражения
         соответственно   вправо   и   влево   на   число   разрядов,
         определяемое  счетчиком.   Биты,   сдвигаемые   за   пределы
         выражения,  теряются.  Если  значение счетчика превышает 15,
         результатом  выполнения  оператора  сдвига  будет  0,  когда
         значение   выражения   занимает   2  байта.  Если  значением
         выражения является 1 байт, для получения нулевого результата
         достаточен сдвиг на 8 разрядов.
               Не   следует   смешивать   операторы   SHR   и  SHL  с
         одноименными инструкциями процессора.
               
               
               3. Операторы отношений. Синтаксис:
               
               выражение-1 EQ выражение-2
               выражение-1 NE выражение-2
               выражение-1 LT выражение-2
               выражение-1 LE выражение-2
               выражение-1 GT выражение-2
               выражение-1 GE выражение-2
               
               Мнемонические    коды    отношений    расшифровываются
         следующим образом:
               EQ - равно
               NE - не равно
               LT - меньше
               LE - меньше или равно
               GT - больше
               GE - больше или равно
               Операторы  отношений  вырабатывают значение 0FFFFh при
 
                                     - 19 -
         
         
         выполнении условия и 0000h в противном случае. 
               Выражения должны иметь абсолютные значения.
               Операторы  EQ  и  NE  рассматривают свои аргументы как
         16-битовые числа. Поэтому, например, выражение -1 EQ  0FFFFh
         истинно, т.к. используется знаковый разряд (бит 15). 
               Остальные   операторы   трактуют  свои  аргументы  как
         17-битовые числа, в которых  старший  бит  определяет  знак.
         Поэтому  здесь  0FFFFh - не -1, а максимальное положительное
         число - 65535.
               Операторы отношений обычно используются  в  директивах
         условного ассемблирования и инструкциях условного перехода.
               
               
               4. Операции с битами. Синтаксис:
               
               NOT выражение
               выражение-1 AND выражение-2
               выражение-1 OR выражение-2
               выражение-1 XOR выражение-2
               
               Мнемоники операций расшифровываются следующим образом:
               NOT - инверсия
               AND - логическое И
               OR  - логическое ИЛИ
               XOR - исключающее логическое ИЛИ
               Операции  выполняются  над   каждыми   соотвествующими
         битами выражений. Выражения должны иметь абсолютные значения.
               
               
               5. Оператор индекса. Синтаксис:
               
               [[выражение-1]] [выражение-2]
               
               Оператор  индекса  []  складывает  указанные выражения
         подобно тому, как это делает оператор +, с той разницей, что
         первое выражение необязательно.
               Выражение-1   может   быть  целым  числом,  абсолютным
         символом или  переместимым  операндом.  При  его  отсутствии
         предполагается  0.  Если  выражение-1  является переместимым
         операндом,   выражение-2   должно   быть  целым  числом  или
         абсолютным  символом.  В  противном случае выражение-2 может
         быть, кроме того, еще и переместимым операндом.
               
               
               
               6. Оператор PTR:
               
               тип PTR выражение
               
               При  помощи  оператора  PTR  переменная   или   метка,
         задаваемая выражением, может трактоваться как переменная или
         метка указанного типа.
               Тип может быть  задан  одним  из  следующих  имен  или
         значений:
               
 
                                     - 20 -
         
         
               Имя типа              Значение
               --------              --------
               BYTE                     1
               WORD                     2
               DWORD                    4
               QWORD                    8
               TBYTE                   10
               NEAR                   0FFFFh
               FAR                    0FFFEh
               
               Выражение может включать в себя любые операнды.
               Типы  BYTE,  WORD,  DWORD,  QWORD  и  TWORD могут быть
         использованы только с операндами памяти, а типы NEAR и FAR -
         только с метками.
               Оператор   PTR   обычно   используется   для   точного
         определения размера, или расстояния,  ссылки.  Если  PTR  не
         используется,   ассемблер   подразумевает  умалчиваемый  тип
         ссылки.  Кроме   того,   оператор   PTR   используется   для
         организации   доступа   к  объекту,   который    при  другом
         способе вызвал  бы генерацию сообщения об ошибке  (например,
         для доступа к старшему байту переменной размера WORD). 
               В  п.4.3  обсуждается,  как  оператор  PTR  может быть
         использован для того, чтобы избежать  ошибок,  связанных  со
         строгим контролем типов.
               
               
               7. Оператор переключения сегментов. Синтаксис:
               
               регистр-сегмента : выражение
               имя-сегмента : выражение
               имя-группы : выражение
               
               Оператор   переключения   сегмента   (:)  обеспечивает
         вычисление адреса данной переменной или  метки  относительно
         содержимого  указанного  регистра  сегмента, начала сегмента
         или начала группы. Если задано имя сегмента или имя  группы,
         это   имя  должно  быть  предварительно  присвоено  регистру
         сегмента директивой ASSUME и определено в директивах SEGMENT
         или GROUP. 
               Выражение   может   быть   абсолютным   символом   или
         переместимым операндом.
               По  умолчанию  физический   адрес   операндов   памяти
         вычисляется  относительно  содержимого  регистров CS, DS, SS
         или ES в зависимости от  инструкции  и  типа  операнда.  Все
         метки  по  умолчанию  понимаются  как NEAR. Эти умалчиваемые
         действия при необходимости могут  быть  изменены  оператором
         переключения сегмента. 
               
               
               8. Оператор имени поля структуры. Синтаксис:

               
               переменная.поле
               
               Этот  оператор (.) используется для обозначения поля в
 
                                     - 21 -
         
         
         переменной  типа  структура.  Оператор  эквивалентен   +   в
         базированных и индексных операндах.
               
               
               9. Оператор SHORT :
               
               SHORT метка
               
               Этот  оператор  присваивает указанной метке тип SHORT.
         Такая метка может быть использована  в  инструкции  JMP  для
         передачи управления не далее, чем на 127 байтов. Инструкции,
         использующие  короткие  метки типа SHORT, требуют для своего
         размещения на 1 байт меньше.
               
               
               10. Оператор THIS :
               
               THIS тип
               
               Этот оператор порождает операнд с атрибутами СЕГМЕНТ и
         СМЕЩЕНИЕ,   соответствующими   текущему  значению  указателя
         позиции, и специфицированным типом. В  качестве  типа  могут
         кодироваться BYTE, WORD, DWORD, QWORD, TBYTE, NEAR или FAR.
               Оператор THIS обычно используется вместе с директивами
         EQU или знакового  равенства  (=)  для  порождения  меток  и
         переменных  (подобно  использованию для этих целей директивы
         LABEL). 
               Примеры:
         TAG   EQU  THIS BYTE
         CHECK =    THIS NEAR
               
               
               11. Операторы HIGH и LOW :
               
               HIGH выражение
               LOW выражение
               
               Операторы HIGH и LOW вычисляют  соответственно старшие
         и  младшие 8 битов значения выражения. Выражение может иметь
         любое значение.
               
               
               12. Оператор SEG :
               
               SEG выражение
               
               Этот оператор  вычисляет   значение  атрибута  СЕГМЕНТ
         выражения.  Выражение  может быть меткой. переменной, именем
         сегмента, именем группы или другим символом.
               
               
               13. Оператор OFFSET :
               
               OFFSET выражение
               
 
                                     - 22 -
         
         
               Этот оператор  вычисляет  значение  атрибута  СМЕЩЕНИЕ
         выражения.  Выражение  может быть меткой, переменной, именем
         сегмента или другим символом. Для имени сегмента вычисляется
         смещение    от   начала   этого   сегмента   до   последнего
         сгенерированного в этом сегменте байта. 
               При использовании оператора переключения сегмента  (:)
         оператор  OFFSET  вычисляет  число  байтов  между  элементом
         выражения и началом указанного  сегмента  или  группы.  Этим
         способом   можно   генерировать   допустимые   смещения  для
         элементов группы. 
               
               
               14. Оператор TYPE :
               
               TYPE выражение
               
               Оператор  TYPE  порождает  число,  представляющее  тип
         выражения.  Если  выражение  является  переменной,  оператор
         вычисляет  размер  переменной  в  байтах.   Если   выражение
         является  меткой,  оператор  формирует  значение  0FFFFh для
         метки типа NEAR и 0FFFEh для  метки  типа  FAR.  Вычисляемое
         значение   может   быть   использовано  для  спецификации  в
         операторе PTR, например:
               JMP (TYPE get_loc) PTR destiny
               
               
               15. Оператор .TYPE :
               
               .TYPE выражение
               
               Этот оператор формирует 1 байт, определяющий  режим  и
         сферу  выражения. Если выражение некорректно, все биты этого
         байта  равны  0.  Возможные  значения  битов   приведены   в
         следующей таблице:
               
         ____________________________________________________________
         |     |                        |                           |
         | бит |           0            |            1              |
         |_____|________________________|___________________________|
         |     |                        |                           |
         |  0  | не связано с программой|   связано с программой    |
         |_____|________________________|___________________________|
         |     |                        |                           |
         |  1  |  не связано с данными  |    связано с данными      |
         |_____|________________________|___________________________|
         |     |                        |                           |
         |  5  |     не определено      |         определено        |
         |_____|________________________|___________________________|
         |     |                        |                           |
         |  7  |  локальная или общая   |   внешняя сфера (EXTRN)   |
         |     |    сфера (PUBLIC)      |                           |
         |_____|________________________|___________________________|
         
               Остальные биты результирующего байта всегда равны 0.
               Оператор  .TYPE   обычно   используется   в   условных
 
                                     - 23 -
         
         
         директивах. 
         
         
               16. Оператор LENGTH :
         
               LENGTH переменная
         
               Этот  оператор  вычисляет  число  элементов типа BYTE,
         WORD,  DWORD  или  TBYTE  для переменной. Выбираемый элемент
         зависит от типа переменной.
               Только для переменных,  определенных  оператором  DUP,
         оператор  LENGTH  формирует значения, большие 1. Формируемое
         число  всегда  определяется  первым из операторов DUP  и  не
         зависит от их вложенности. 
               Пример:
         ARRAY DW 100 DUP(1)
         TABLE DW 100 DUP(1,10 DUP(?))
               ...
               MOV CX,LENGTH ARRAY ; load 100
               MOV CX,LENGTH TABLE ; load 100
               
               
               17. Оператор SIZE :
               
               SIZE переменная
               
               Оператор   SIZE   определяет   число   байтов  памяти,
         выделенных переменной. Оператор SIZE можно рассматривать как
         комбинацию операторов LENGTH и TYPE.
               
               
               18. Оператор WIDTH :
               
               WIDTH имя-поля-записи | запись
               
               Этот оператор вычисляет длину записи или поля записи в
         битах.
               
               
               19. Оператор MASK :
               
               MASK имя-поля-записи | запись
               
               Этот оператор формирует маску битов для  представления
         позиций  заданного поля в записи. Бит маски равен 1, если он
         соответствует биту поля, и 0 - в противном случае.
               Пример:
         RTYPE RECORD F1:3,F2:6,F3:7
               ...
               M1=MASK F1  ; 11100000 00000000b
               M2=MASK F2  ; 111111000000b
               M3=MASK F3  ; 1111111b
               M=MASK RTYPE ; 0FFh
               
               
 
                                     - 24 -
         
         
               
               
               
               
                    4.3. Особенности вычисления выражений.
               
               
               
                       4.3.1. Приоритеты операций.
               
               
               При вычислении значения выражения операции выполняются
         в  соответствии  со следующим списком приоритетов (в порядке
         убывания):
               1. LENGTH, SIZE, WIDTH, MASK, (), [], <>.
               2. Оператор имени поля структуры (.).
               3. Оператор переключения сегмента (:).
               4. PTR, OFFSET, SEG, TYPE, THIS.
               5. HIGH, LOW.
               6. Унарные + и -.
               7. *, /, MOD, SHR, SHL.
               8. Бинарные + и -.
               9. EQ, NE, LT, LE, GT, GE.
               10. NOT.
               11. AND.
               12. OR, XOR.
               13. SHORT, .TYPE.
               
               
               
               
                        4.3.2. Ссылки вперед.

               
               Хотя ассемблер  и  допускает  ссылки  вперед  (т.е.  к
         еще  необъявленным  объектам  программы), такие ссылки могут
         при неправильном использовании приводить к ошибкам.
               Пример ссылки вперед:
               JMP TARGET
               ...
         TARGET: ...
               
               Всякий    раз,    когда     ассемблер     обнаруживает
         неопределенное  имя на 1-м проходе, он предполагает, что это
         ссылка вперед. Если указано  только  имя,  ассемблер  делает
         предположения о его типе и используемом регистре сегмента, в
         соответствии с которыми и генерируется  код.  В  приведенном
         выше  примере предполагается, что TARGET - метка типа NEAR и
         для ее адресации используется регистр CS, в результате  чего
         генерируется  инструкция  JMP,  занимающая 3 байта. Если бы,
         скажем,  в  действительности  тип   ссылки   оказался   FAR,
         ассемблеру нужно было бы генерировать 5-байтовую инструкцию,
         что уже невозможно, и формировалось бы сообщение об ошибке.
               Во   избежание   подобных    ситуаций    рекомендуется
         придерживаться следующих правил:
 
                                     - 25 -
         
         
               1. Если ссылка вперед является переменной, вычисляемой
                  относительно  регистров  ES,  SS  или  CS,  следует
                  использовать  оператор  переключения сегмента. Если
                  он  не  использован,  делается  попытка  вычисления
                  адреса относительно регистра DS.
               2. Если ссылка вперед  является  меткой  инструкции  в
                  команде  JMP и отстоит не далее, чем на 128 байтов,
                  можно использовать оператор SHORT.  Если  этого  не
                  делать,  метке  будет  присвоен  тип  FAR,  что  не
                  вызовет ошибки, но на  2-м  проходе  ассемблер  для
                  сокращения  размера  содержащей  ссылку  инструкции
                  вынужден будет вставить дополнительную  и  ненужную
                  инструкцию NOP.
               3. Если  ссылка  вперед  является  меткой инструкции в
                  командах  CALL  или   JMP,   следует   использовать
                  оператор  PTR  для  определения  типа  метки. Иначе
                  ассемблер  устанавливает  тип  NEAR,  и,   если   в
                  действительности  тип  метки  окажется  FAR,  будет
                  выдано сообщение об ошибке.
               4. Если  ссылка  вперед  является  именем  сегмента  с
                  оператором   переключения   сегмента   (:),   можно
                  использовать  директиву  GROUP  для   связи   имени
                  сегмента  с  именем  группы,  а  затем использовать
                  директиву ASSUME для связи имени группы с регистром
                  сегмента. Пример:
                  DGROUP GROUP STACK
                         ASSUME SS:DGROUP
                  CODE:  SEGMENT 
                         ...
                         MOV AX, STACK:STACKTOP
                  Если  имя  сегмента не связано с группой, ассемблер
                  может   игнорировать   переключение   сегмента    и
                  использовать  умалчиваемый  регистр  сегмента,  что
                  обычно приводит к ошибкам на 2-м проходе.
                  
               
               
               
               
                         4.3.3. Контроль типов.

               
               Ассемблер выполняет  строгий  синтаксический  контроль
         инструкций,  включающий  проверку  точного кодирования типов
         операндов памяти. Любой переместимый операнд, используемый в
         инструкции,   которая   оперирует   с   данными   некоторого
         предполагаемого типа, должен либо иметь  тот  же  тип,  либо
         предусматривать преобразование типа оператором PTR.
               Пример некорректного кодирования:
         STRING DB  "A MESSAGE"
                ...
                MOV AX,STRING[1]
               Пример правильного кодирования:
                ...
                MOV AX, WORD PTR STRING[1]
 
                                     - 26 -
                                     
                                     
                  Приложение 1. Ключевые слова языка ассемблера.
                
         .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
         MOV       PUSH      PUSHF     POP       POPF
         XCHG      XLAT      LEA       LDS       LES
         LAHF      SAHF      IN        OUT       ADD
         ADC       INC       AAA       DAA       SUB 
         SBB       DEC       NEG       CMP       AAS
         DAS       MUL       IMUL      AAM       DIV
         IDIV      AAD       CBW       CWD       NOT
         AND       OR        XOR       TEST      RCL
         RCR       SAL       SAR       ROL       ROR
         MOVS      MOVSB     CMPS      CMPSB     CMPSW
         SCAS      SCASB     SCASW     LODS      STOS
         STOSB     STOSW     JA        JNBE      JAE
         JNB       JB        JNAE      JC        JE
         JZ        JG        JNLE      JGE       JNL
         JL        JNGE      JLE       JNG       JMP
         JNC       JNE       JNZ       JNO       JNP
         JPO       JNS       JO        JP        JPE
         JS        JCXZ      CALL      RET       LOOP
         LOOPE     LOOPZ     LOOPNE    LOOPNZ    REP
         REPE      REPZ      REPNE     REPNZ     INT3
         INT       INTO      IRET      STC       CLC
         CMC       STD       CLD       STI       CLI
         HLT       WAIT      ESC       LOCK      NOP
                                         
                                     - 27 -
                                     
                                     
                                     
                                     
                 Приложение 2. Регистры и адресация 
                               процессора 8088.
                    
                    
                    
                    
                    
           15                    8 7                     0
          _________________________________________________
          |                       |                       |
   AX     |          AH           |          AL           |
          |_______________________|_______________________|
          |                       |                       |
   BX     |          BH           |          BL           |
          |_______________________|_______________________| Регистры данных
          |                       |                       |
   CX     |          CH           |          CL           |
          |_______________________|_______________________|
          |                       |                       |
   DX     |          DH           |          DL           |
          |_______________________|_______________________|




           15                                            0
          _________________________________________________
указатель |                                               |
стека     |                      SP                       |
          |_______________________________________________| Регистры указателя
указатель |                                               |
базы      |                      BP                       |
          |_______________________________________________|




           15                                            0
          ________________________________________________
          |                                               |
источник  |                      SI                       |
          |_______________________________________________| Индексные регистры
          |                                               |
приемник  |                      DI                       |
          |_______________________________________________|
              
              
              
             
 
                                     - 28 -
         
         
              
           15                                            0
          _________________________________________________
          |                                               |
код       |                      CS                       |
          |_______________________________________________|
          |                                               |
данные    |                      DS                       |
          |_______________________________________________| Регистры сегментов
          |                                               |
стек      |                      SS                       |
          |_______________________________________________|
          |                                               |
экстра    |                      ES                       |
          |_______________________________________________|




           15                                            0
          _________________________________________________
          |                                               |
          |                      IP                       | Указатель команды
          |_______________________________________________|
          |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
          |  |  |  |  | O| D| I| T| S| Z|  | A|  | P|  | C| Флаги
          |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|
          
                       11 10  9  8  7  6     4     2     0


          OF - переполнение                 ZF - нуль
          DF - флаг направления             AF - вспомогательный перенос
          IF - разрешение прерывания        PF - паритет
          TF - ловушка                      CF - перенос
          SF - знак



















 
                                     - 29 -
         
         

                         Условные обозначения:


                         B         - базовый регистр
                         X         - индексный регистр
                         S         - смещение
                         (...)     - содержимое регистра
                         ИА        - исполнительный 16-разрядный адрес
                         ЛА        - логический 16-разрядный адрес
                         ФА        - физический 20-разрядный адрес
                         [...]     - компонента может отсутствовать
                         {...|...} - обязательный выбор варианта
                         
          __________________________________________________
          |                     |                          |
          |   Типы адресации    |   Местоположение данных  |
          |_____________________|__________________________|
          |                     |                          |
          | 1. Непосредственная |      В команде           |
          |_____________________|__________________________|
          |                     |                          |
          | 2. Регистровая      |      В регистре          |
          |_____________________|__________________________|
          |                     |                          |
          | 3. Прямая           |      ИА - в команде      |
          |_____________________|__________________________|
          |                     |                          |
          | 4. Косвенная        |      ИА=(B)+[(X)]+[S]    |
          |_____________________|__________________________|
          
          
          
          ЛА = ИА данных | (IP) инструкции процессора | (SP) элемента стека
               | (SI) строки-источника | (DI) строки-приемника
           
             
          ФА = ЛА +  { (CS) | (DS) | (SS) | (ES) } * 16
                   
                        ПРИДНЕПРОВСКИЙ ФИЛИАЛ
                СОВЕТСКО-БОЛГАРО-ФИНСКОГО ПРЕДПРИЯТИЯ
                  "Новые информационные технологии"



               
               
               







                         СИСТЕМА  ПРОГРАММИРОВАНИЯ 
                      
                         НА МАКРОАССЕМБЛЕРЕ MS-DOS






                           Справочное руководство




                      Часть 3. Директивы языка ассемблера 
                     

                           (редакция 1, март 1989)
                   
                   
                   
                   
                   
                   
                   

                   
               
               
                   
                   
                   
                   
                   
                   
                   
                   
                        Днепропетровск 1989г.
 
                                       
                                         
                                     -  2 -
                                     
                                     
                                     
                                     
                                     
                





               
               
               
               
               
               
           Ф А Й Л О В А Я   С Т Р У К Т У Р А  Д О К У М Е Н Т А :
               
               
         - Файл  A3P0.DOC  содержит  титульный лист,  настоящую
                           авторскую справку и содержание.
               
         - Файл  A3P1.DOC  содержит Главу 1:
                           Введение.
               
         - Файл  A3P2.DOC  содержит Главу 2:
                           Установка режимов компиляции.
         
         - Файл  A3P3.DOC  содержит Главу 3:
                           Сегментация программы.
         
         - Файл  A3P4.DOC  содержит Главу 4:
                           Условные директивы.
         
         - Файл  A3P5.DOC  содержит Главу 5:
                           Макросредства.
         
         - Файл  A3P6.DOC  содержит Главу 6:
                           Директивы определения памяти.
         
         - Файл  A3P7.DOC  содержит Главу 7:
                           Описание символических имен.
         
         - Файл  A3P8.DOC  содержит Главу 8:
                           Директивы управления файлами.
         
         - Файл  A3P9.DOC  содержит Главу 9:
                           Глобальные объявления.
         
         - Файл  A3A1.PRI  содержит Приложение 1:
                           Директивы языка ассемблера
 
                                         
                                     -  3 -
                             
                                                           
               
                                   Содержание


         1. Введение............................................... 4
         2. Установка режимов компиляции........................... 6
         3. Сегментация программы.................................. 8
         3.1. Директивы SEGMENT и ENDS............................. 8
         3.2. Директивы PROC и ENDP................................11
         3.3. Директива ASSUME.....................................12
         3.4. Директива GROUP......................................13
         3.5. Директива END........................................14
         3.6. Директивы EVEN и ORG.................................14
         4. Условные директивы.....................................16
         4.1. Директивы условного ассемблирования..................16
         4.2. Директивы условной генерации ошибок..................18
         5. Макросредства..........................................21
         5.1. Макродирективы.......................................22
         5.2. Блоки повторения.....................................26
         5.3. Макрооператоры.......................................28
         6. Директивы определения памяти...........................31
         6.1. Скалярные данные.....................................31
         6.2. Записи...............................................34
         6.3. Структуры............................................36
         7. Описание символических имен............................39
         8. Директивы управления файлами...........................41
         8.1. Управление исходными файлами.........................41
         8.2. Управление листингом.................................43
         8.3. Другие директивы.....................................46
         9. Глобальные объявления..................................47
               
            Приложение 1. Директивы языка ассемблера...............49
                                     
                                     -   4 -
                                            
               
                                     
                                     
               
               
               
                                  1. Введение.
               
               
               
               Настоящее  руководство  содержит сведения о директивах
         языка ассемблера системы MS-DOS и может представлять интерес
         для пользователей, программирующих на этом языке.
               Директивы  ассемблера  являются   важной   компонентой
         языка,  позволяющей  полностью использовать сегментированную
         архитектуру процессоров 8086, 80186 и 80286.
               В  отличие от инструкций процессора обработка директив
         ассемблера как правило не вызывает генерацию объектного кода
         (исключение  составляют  лишь директивы определения памяти).
         Кодирование  директив  в  исходной  программе  позволяет   в
         некоторой степени управлять алгоритмом ассемблирования.
               Глава  2  содержит описание директив установки режимов
         компиляции,  позволяющих  задавать  допустимый  в   исходной
         программе набор инструкций процессора.
               В   главе   3   приведены   сведения   о   сегментации
         ассемблерной программы и дмрективах, ее задающих.
               В  языке  имеются директивы условного ассемблирования,
         обеспечивающие выборочное исключение частей исходного текста
         из процесса ассемблирования. Эти директивы описаны  в  главе
         4. 
               Глава   5   посвящена  макросредствам,   использование
         которых  позволяет относительно просто повторять общие блоки 
         предложений несколько раз или заменять макроимена в исходном
         тексте целыми последовательностями предложений.
               Глава  6  описывает  возможные  структуры данных языка
         ассемблера и директивы, их создающие.
               В главе  7  приведены способы  и  соответствующие   им
         директивы описания имен в ассемблерной программе.
               Язык  ассемблера  обладает  мощным  набором   директив
         управления  файлами:  исходным файлом, листингом и объектным
         файлом. Описание этих директив приведено в главе 8.
               И, наконец, глава 9  содержит  сведения  о  директивах
         глобального объявления, позволяющих создавать и использовать
         объекты, общие для нескольких программных модулей.
               
               В  настоящем  руководстве  приняты  следующие условные
         обозначения.
               Конструкция, заключенная в двойные  квадратные  скобки
         [[ ]], может отсутствовать.
               Из нескольких  конструкций,  разделенных символом  | ,
         может быть выбрана только одна.
               Текст,   состоящий   из   букв  русского  алфавита  на
 
                                     -  5 -
                                     
                                     
         регистре  строчных  букв  и  других  символов,   разделенных
         символом  -  ,  обозначает  нетерминальные  элементы  и  при
         кодировании   должен   замещаться   требуемыми   по   смыслу
         конструкциями.

                                     -  6 -
                                         
               
               
                       
                      2. Установка режимов компиляции.
               
               
               В  значительной  степени режим компиляции программы на
         языке ассемблера определяется распознаваемым программой MASM
         набором  инструкций,  часть которого может варьироваться при
         помощи специальных  директив.  В  языке  ассемблера  имеется
         несколько  директив  задания  набора  допустимых инструкций,
         список  которых  и,   соответственно,   способ   кодирования
         приведены ниже:
               
         .8086 
         .8087
         .186
         .286c
         .286p
         .287
               
               Директивы  установки  набора  инструкций,   если   они
         используются, должны располагаться в начале исходного файла. 
               Директива  .8086  позволяет  ассемблировать инструкции
         микропроцессоров 8086 и  8088  и  запрещает  ассемблирование
         инструкций  процессоров 80186 и 80286. Аналогично, директива
         .8087  позволяет  ассемблировать  инструкции  арифметики   с
         плавающей точкой сопроцессора 8087 и запрещает использование
         инструкций, специфичных для процессора 80287.
               Поскольку  MASM  ассемблирует  инструкции  процессоров
         8086  и  8087  по  умолчанию, использования директив .8086 и
         .8087  не  требуется,  если  исходный  файл  содержит только
         инструкции этих процессоров.  
               Директива .186  разрешает  ассемблирование  инструкций
         процессора 8086 и дополнительных к ним инструкций процессора
         80186. Эта  директива  должна  использоваться  в  программе,
         которая будет выполняться только процессором 80186.
               Директива  .286c  разрешает ассемблирование инструкций
         процессора 8086 и незащищенных инструкций  процессора  80286
         (они  идентичны  инструкциям  80186).  В  дополнение к этому
         директива  .287p  позволяет  ассемблировать   и   защищенные
         инструкции  процессора  80286.  Директива  .286c должна быть
         использована в программе, которая будет  выполняться  только
         процессором  80286  и не содержит защищенных инструкций. При
         использовании   директивы   .286p   последнее    ограничение
         несущественно.
               Директива  .287  разрешает  ассемблирование инструкций
         арифметики  с  плавающей  точкой  сопроцессора  80287.   Эта
         директива   должна   использоваться   в  программе,  которая
         содержит указанные инструкции  и  будет  выполняться  только
         процессором 80287.
               Кроме  того,  если  программа содержит директивы .8087
 
                                     -  7 -
                                     
                                     
         или .287, в командной строке MASM следует при  помощи  опций
         /R   или   /E   определить,  как  ассемблировать  инструкции
         арифметики с  плавающей  точкой  (использование  опций  MASM
         описано  в  "Система  программирования  на макроассемблере в
         системе MS-DOS.  Часть  1.  Пакет  макроассемблера,  п.2.3).
         Использование   опции   /R   заставляет   MASM  генерировать
         действительные инструкции  арифметики  с  плавающей  точкой.
         Опция  /E  обеспечивает  генерацию  кода, который может быть
         использован  программой  эмуляции  арифметики  с   плавающей
         точкой. 

                                     -  8 -
                                         
               
               
               
                                     
                            3. Сегментация программы.

               
               Программа   на    языке    ассемблера    состоит    из
         последовательности  программных  сегментов,  заканчивающейся
         директивой  END.  Начало   каждого   сегмента   обозначается
         директивой  SEGMENT, конец - директивой ENDS.
               В  каждом  сегменте  при помощи директивы ASSUME могут
         быть определены  используемые  по  умолчанию  для  адресации
         элементов программы регистры сегмента.
               В  каждом  сегменте  могут  быть  выделены специальные
         программные  единицы  (процедуры), позволяющие  использовать
         часть  программного  кода многократно без его дублирования в
         разных частях программы. Процедуры обычно включены в систему
         адресации  сегмента.  Начало  и конец процедуры определяются
         директивами PROC и ENDP соответственно.
               Сегменты могут быть объединены  в  группу  при  помощи
         директивы GROUP.
               Директивы  ORG  и  EVEN  позволяют  управлять адресами
         размещения инструкций процессора.
               Эти директивы подробнее описаны в следующих разделах.
               
               
               
               
               
                       3.1. Директивы SEGMENT и ENDS.
               
               
               Синтаксис:
               
         имя SEGMENT [[выравнивание]] [[комбинация]] [['класс']]
               
         имя ENDS

               Директивы   SEGMENT  и  ENDS  отмечают  соответственно
         начало  и конец программного сегмента и должны быть помечены
         одним и тем же именем,  которое и считается именем сегмента.
         Программный  сегмент  представляет  собой последовательность
         инструкций  и/или  полей  данных,  адресуемых   относительно
         одного   регистра   сегмента.   Имя   сегмента  должно  быть
         уникальным  и  может появляться в поле метки  только лишь  в
         другом  предложении SEGMENT. Все директивы SEGMENT с одним и
         тем же  именем  обозначают  продолжение  одного  и  того  же
         сегмента. При  этом  следует  помнить,  что  параметры  всех
         директив  SEGMENT,  определяющих  один  и тот же программный
         сегмент, не должны противоречить друг другу.
               Параметры  выравнивание,  комбинация и класс директивы
 
                                   -  9 -
         
         
         SEGMENT  задают   информацию   для   линкера.   Они   должны
         кодироваться  в  указанной последовательности, но могут быть
         опущены в произвольной комбинации.
               
               Выравнивание  определяет   границу   адреса,   начиная
         с которой сегмент  будет  загружаться  в  память. Могут быть
         заданы следующие значения:
                 BYTE - использовать любую границу
                 WORD - граница слова (2 байта)
                 PARA - граница параграфа (16 байтов)
                 PAGE - граница страницы (256 байтов)
               Если выравнивание не указано, предполагается PARA.
               Следует помнить, что точный адрес начала  сегмента  до
         его  загрузки  в  память неизвестен. Тип выравнивания только
         накладывает на него ограничение.

               Тип  комбинации  определяет  возможность   и   способы
         объединения  программных  сегментов, имеющих одно имя. Могут
         быть указаны следующие значения:
                    
         PUBLIC   - Все сегменты с одним и тем же именем объединяются
                    в один непрерывный сегмент. Все инструкции и поля
                    данных   нового   сегмента   будут   адресоваться
                    относительно  одного  регистра  сегмента,  а  все
                    смещения будут  вычисляться  относительно  начала
                    этого сегмента.
         STACK    - Все сегменты с одним и тем же именем объединяются
                    в один непрерывный сегмент. Этот  тип  комбинации
                    отличается  от  PUBLIC  лишь тем, что адресация в
                    новом   сегменте   будет   вестись   относительно
                    регистра  SS; регистр SP при этом устанавливается
                    на конец сегмента. Такой  тип  комбинации  обычно
                    имеют   сегменты   стека.  Тип  комбинайии  STACK
                    автоматически     обеспечивает      инициализацию
                    регистров  SS  и SP, и пользователю необязательно
                    включать  в   свою   программу   инструкции   для
                    установки этих регистров.   
         COMMON   - Все  одноименные  сегменты  этого  класса   будут
                    загружаться  в  память,  начиная с одного адреса.
                    Таким  способом  можно   формировать   оверлейные
                    программы.  Длина  области  загрузки  равна длине
                    максимального по объему сегмента.  Все  адреса  в
                    этих  сегментах  вычисляются  относительно одного
                    базового адреса. Если некоторые данные  объявлены
                    в  более, чем одном, сегменте с конкретным именем
                    и типом комбинации COMMON,  данные,   объявленные
                    последними, замещают все предыдущие. 
         MEMORY   - Для Microsoft 8086 Object Linker (LINK) полностью
                    совпадает  с  типом  PUBLIC.  MASM   обеспечивает
                    отдельный тип комбинации MEMORY для совместимости
                    с  программами  LINK,   различающими   эти   типы
                    комбинации.
         AT адрес - Все метки и адресные переменные  сегмента  должны
                    быть  вычислены  относительно  указанного адреса.
                    Адрес может  быть  представлен  любым  допустимым
 
                                   - 10 -
         
         
                    выражением,  не содержащим ссылок вперед. Сегмент
                    с  этим  типом  комбинации  обычно  не   содержит
                    программного  кода или инициализируемых данных, а
                    включает в себя адресные значения,  фиксированные
                    для вычислительной машины (например, адрес буфера
                    экрана).
               
               Если тип комбинации не указан, сегмент  ни  с  чем  не
         объединяется  и  рассматривается  как  отдельная программная
         единица.
               
               Класс сегмента определяет порядок следования сегментов
         в  памяти.  Сегменты одного класса загружаются в память один
         после другого  до  того,  как  начнут  загружаться  сегменты
         другого класса. 
               В  качестве  класса  сегмента  может быть указан любой
         идентификатор, на который распространяются все требования  и
         ограничения  языка   ассемблера   (в   том   числе   условия
         чувствительности   к  регистру).  Поскольку  класс  сегмента
         рассматривается  как  идентификатор,  он   не   может   быть
         определен где-либо еще в программе.
               Если   класс  не  указан,  LINK  копирует  сегменты  в
         исполнительный файл в той последовательности, в которой  они
         расположены   в   объектном  файле.  Эта  последовательность
         сохраняется до тех пор, пока LINK не обнаружит 2  или  более
         сегмента одного класса, после чего LINK начинает объединение
         сегментов.   Сегменты    одного    класса    копируются    в
         последовательные блоки исполнительного файла.
               Все сегменты имеют класс. Сегменты, для которых  класс
         не указан, считаются принадлежащими к классу с пустым именем
         и копируются в последовательные блоки памяти вместе с такими
         же сегментами.
               Число   сегментов,   принадлежащих  к  одному  классу,
         неограничено, но их суммарный объем не должен превышать 64К.
               Если  на  вход  программы  LINK   подается   несколько
         объектных  файлов,  правильное кодирование классов сегментов
         вообще говоря не обеспечивает правильную  последовательность
         сегментов     в     исполнительном     файле,    т.к.    эта
         последовательность  в  этом  случае   зависит   еще   и   от
         последовательности  объектных  файлов  в  командной  строке.
         Пусть, например, LINK обрабатывает 2 объектных файла, 1-й из
         которых содержит 2 сегмента с классами CODE и STACK, а 2-й -
         один сегмент класса DATA. В  исполнительном  файле  сегменты
         всегда  будут  расположены в последовательности CODE, STACK,
         DATA.   Если,   например,   программисту  необходимо,  чтобы
         сегменты  располагались  в  последовательности  CODE,  DATA,
         STACK,   ему  следует  создать  объектный  файл,  содержащий
         фиктивные сегменты с теми же именами и теми же классами,  но
         расположенные  в  нужном  ему  порядке, и в командной строке
         запуска  LINK  указать  его  первым.   Исходная   программа,
         соответствующая   такому   объектному   файлу   может  иметь
         следующий вид:
               
         code SEGMENT PARA PUBLIC 'CODE'
         code ENDS
 
                                   - 11 -
         
         
         data SEGMENT PARA PUBLIC 'DATA'
         data ENDS
         stack SEGMENT PARA STACK 'STACK'
         stack ENDS
               
               Этот прием не может быть использован для  программ  на
         языках  C,  FORTRAN,  PASCAL  и BASIC, т.к. компиляторы этих
         языков следуют определенным соглашениям о порядке сегментов,
         который не следует нарушать.
               Другим    способом    управления   последовательностью
         сегментов  является  кодирование  опции  /A  MASM,   которая
         предписывает  MASM  располагать сегменты в объектном файле в
         алфавитном  порядке.  Сочетание  опции  /A  с  формированием
         последоватеьности      фиктивных     сегментов     позволяет
         реализовывать   довольно   сложные   стратегии    управления
         структурой исполнительного файла.
               В  некоторых  ранних версиях MASM опция /A включена по
         умолчанию.
               Дополнительная информация о выравнивании и объединении
         сегментов программой LINK содержится в руководстве  "Система
         програмирования  на  макроассемблере  MS-DOS. Часть 1. Пакет
         макроассемблера MS-DOS", п.п. 3.4.1 и 3.4.3.

               
               
               
               
               
                         3.2. Директивы PROC и ENDP.

               
               Директивы  PROC  и   ENDP   служат   для   определения
         процедуры. Процедура представляет собой набор  инструкций  и
         директив,  образующих  некоторую   подпрограмму   в   рамках
         какого-либо сегмента.
               Процедура имеет следующий вид:
               
         имя PROC [[расстояние]]
               ...
            предложения
               ...
         имя ENDP
               
               Директивы PROC и ENDP обозначают соответственно начало
         и конец процедуры и должны быть  помечены  одним  и  тем  же
         именем, которое считается именем процедуры.
               Необязательное расстояние может принимать значения FAR
         и NEAR. Если этот параметр опущен, предполагается NEAR.
               Имя  процедуры  имеет  атрибуты  метки  и  может  быть
         использовано как операнд в инструкциях перехода, вызовах или
         циклах. 
               Возврат из процедуры должен быть выполнен  инструкцией
         RET. При этом следует помнить, что адрес возврата выбирается
         из стека (в соответствии со значениями регистров SS  и  SP).
         Для  процедур  с  расстоянием  NEAR  адрес  возврата состоит
 
                                   - 12 -
         
         
         только  из  смещения  и  занимает  в  стеке  2  байта.   Для
         FAR-процедур  он  занимает  4  байта  стека,  включая в себя
         базовый адрес (содержимое регистра сегмента) и смещение.
               Допускается вложенность процедур.
               Процедуре   могут   быть  переданы  параметры.  Вообще
         говоря, передача параметров и их распознавание  в  процедуре
         возлагается  на  программиста. Но при соблюдении стандартных
         соглашений, принятых в  языках  высокого  уровня,  параметры
         процедуры  могут быть отслежены командой трассировки стека K
         SYMDEB ("Система программирования на макроассемблере MS-DOS.
         Часть 1. Пакет макроассемблера", п.4.5.28).
               Согласно стандартным соглашениям параметры размещаются
         в стеке, верх которого определяется содержимым регистров  SP
         и SS.
               Пример передачи параметров:
                 ...
               PUSH AX    ; 2-й параметр
               PUSH BX    ; 1-й параметр
               CALL addup
               ADD  SP,4  ; уничтожение параметров
                 ...
         addup PROC NEAR      ; адрес возврата для NEAR - 2 байта
               PUSH BP        ; сохранение базового указателя
               MOV  BP,SP     ; загрузка базового регистра
               MOV  BX,[BP+4] ; адрес 1-го параметра
               MOV  AX,[BP+6] ; адрес 2-го параметра
                 ...
               POP  BP
               RET
         addup ENDP
               
               Из этого примера ясно, что адрес возврата запоминается
         в верхушке стека перед параметрами (стек "растет" от больших
         адресов к малым).
               Если  бы  процедура  специфицировала  расстояние  FAR,
         адрес возврата  занял  бы  4  байта,  а  смещение  для  1-го
         параметра составило бы 6 байтов.
               
               
               
               
               
               
                           3.3. Директива ASSUME.

               
               Синтаксис:
               
               ASSUME регистр-сегмента:имя-сегмента...
               ASSUME NOTHING
               
               Директива  ASSUME  устанавливает  регистр  сегмента  в
         качестве умалчиваемого регистра сегмента для адресации меток
         и переменных в указанном сегменте  или  группе.  Последующие
         ссылки  к метке или переменной при отсутствии явных указаний
 
                                   - 13 -
         
         
         разрешаются относительно данного регистра сегмента.
               В  качестве  регистра  сегмента могут быть указаны CS,
         DS, SS или ES.
               В качестве имени сегмента может быть специфицировано:
               1. Имя     сегмента,    предварительно    определенное
                  директивой SEGMENT.
               2. Имя группы, предварительно определенное  директивой
                  GROUP.
               3. Ключевое слово NOTHING.
               
               Наличие ключевого слова NOTHING отменяет текущий выбор
         конкретного  регистра  сегмента  или  текущий   выбор   всех
         регистров сегмента (для второй формы директивы).
               Выбор  регистра  сегмента  по  умолчанию  в  отдельном
         предложении языка ассемблера может быть отменен  при  помощи
         оператора    переключения     сегмента     (:)     ("Система
         программирования   на   макроассемблере   MS-DOS.  Часть  2.
         Введение в язык ассемблера", п.4.2).
               
               
               
               
               
                            3.4. Директива GROUP.
               
               
               Синтаксис:
               
               имя GROUP имя-сегмента,...
               
               Директива GROUP обозначает,  что  один  или  несколько
         сегментов  с  указанными  именами  логически  объединяются в
         группу с данным именем, что позволяет адресовать все метки и
         переменные в этих сегментах относительно начала группы, а не
         начала содержащего их  сегмента.  Имя-сегмента  должно  быть
         именем   сегмента,  определенного  директивой  SEGMENT,  или
         SEG-выражением ("Система программирования на макроассемблере
         MS-DOS.  Часть  2.  Введение в язык ассемблера", п.4.2). Оно
         должно быть уникальным. 
               Директива  GROUP  не  влияет   на   порядок   загрузки
         сегментов,   который  зависит  от  классов  сегментов  и  их
         расположения в объектном файле.
               Сегменты одной группы не  обязательно  будут  занимать
         непрерывную  область  памяти.  Они  могут  быть перемешаны с
         сегментами,   не   принадлежащими   этой   группе.   Однако,
         расстояние в байтах между  первым  байтом  первого  сегмента
         группы  и  последним  байтом  последнего  сегмента группы не
         должно превышать 64К. Таким образом,  если  сегменты  группы
         расположены  последовательно,  группа  может занимать до 64К
         оперативной памяти.
               Имена групп могут использоваться  в  директиве  ASSUME
         (п.3.3)   и   в   качестве   префикса   операнда   оператора
         переключения сегмента (:).
               Имя группы может появиться только  в  одной  директиве
         GROUP  в исходном файле. Если к группе принадлежат несколько
 
                                   - 14 -
         
         
         сегментов в исходном файле, все их имена должны быть указаны
         в одной директиве GROUP.
               
               
               
               
               
                             3.5. Директива END.
               
               
               Синтаксис:
               
               END [[выражение]]
               
               Директива   END  обозначает  конец  модуля.  Ассемблер
         игнорирует все предложения, следующие в  исходном  файле  за
         этой директивой.
               Необязательное   выражение   определяет   точку  входа
         программы, в которую будет передано управление  при  запуске
         программы  на  счет.  Значением  этого выражения должен быть
         адрес в одном из  программных  сегментов  данного  исходного
         файла.
               Если  выражение  опущено, точка входа не определяется.
         При попытке выполнения программы с незаданной  точкой  входа
         могут возникать ошибки, поэтому директиву END без параметров
         рекомендуется  кодировать  лишь  с  сегментами,  содержащими
         только поля данных.
               В  исходном  файле  может  быть определена только одна
         точка входа.

               
               
               
               
                          3.6. Директивы ORG и EVEN.

               
               
               Директивы ORG и EVEN позволяют задавать адрес  памяти,
         начиная   с   которого   будут   располагаться   последующие
         инструкции процессора.
               
               Директива ORG имеет следующий формат:
               
               ORG выражение
               
               Значение указанного выражения присваивается  указателю
         позиции,  и  адреса  последующих  инструкций  и данных будут
         начинаться с нового значения.
               Значением  выражения  должно  быть  абсолютное  число,
         точнее, все используемые в нем имена должны быть известны на
         1-м  проходе ассемблера. В качестве элемента выражения может
         быть использован знак указателя  позиции  ($),  обозначающий
         его текущее значение.
               
 
                                   - 15 -
         
         
               Пример:
               
               ORG 120h
               MOV AX,BX
               
               В этом примере инструкция MOV будет начинаться с байта
         120h текущего сегмента.
               
               
               Директива EVEN имеет следующий формат:
               
               EVEN
               
               Директива  EVEN  выравнивает  следующее  за  ней  поле
         данных  или  инструкцию  по  границе  слова, т.е. по четному
         адресу. Если текущеее значение  указателя  позиции  нечетно,
         директива   увеличивает  его  значение  на  1  и  генерирует
         инструкцию  NOP  (нет  операции).  Если   текущее   значение
         указателя   позиции   уже   четно,   никаких   действий   не
         производится.
               Директива EVEN не должна использоваться в сегментах  с
         типом выравнивания BYTE.
                                     
                                     - 16 -
                                         
               
               
               
               
                             4. Условные директивы.
               
               
               Язык  ассемблера  включает  в  себя условные директивы
         двух типов: директивы условного ассемблирования и  директивы
         условной     генерации     ошибок.     Директива   условного
         ассемблирования    обеспечивает    ассемблирование     блока
         предложений  лишь  в  том  случае,  если  истинно заданное в
         директиве  условие.  Директива  условной  генерации   ошибки
         проверяет  заданное  в ней условие и генерирует ошибку, т.е.
         формирует сообщение в листинге программы и обеспечивает  код
         возврата,  соответствующий наличию ошибки в исходном тексте,
         если это условие истинно.
               Директивы  обоих  типов  проверяют   условия   времени
         ассемблирования.  Они не могут анализировать условия времени
         выполнения, т.к. последние не могут быть вычислены до  того,
         как  программа начнет выполняться. В условиях допустимы лишь
         выражения, преобразуемые в константы при ассемблировании.
               Директивы  условного   ассемблирования   и   директивы
         условной генерации ошибок описаны в следующих двух разделах.
               
               
               
               
               
               
               
                    4.1. Директивы условного ассемблирования.
               
               
               Директивы   условного   ассемблирования   позволяют  в
         некоторой степени  управлять  процессом  ассемблирования.  В
         зависимости  от  значений  условий  времени ассемблирования,
         проверяемых   этими   директивами,   макроассемблер    может
         пропустить обработку целого блока предложений или обработать
         вместо него другой (альтернативный) блок.
               Блок  предложений  условного   ассемблирования   имеет
         следующий общий вид:
               
               директива-условного-ассемблирования
                          ..........
                     предложения ассемблера или инструкции
                          ..........
               [[ ELSE ]]
                          ..........
                     предложения ассемблера или инструкции
                          ..........
               ENDIF
 
                                   - 17 -
         
         
               
               Директива-условного-ассемблирования  задает   условие,
         при   истинном   значении  которого  будут  ассемблироваться
         предложения, расположенные непосредственно после директивы и
         до ключевого слова ELSE, или,  если оно  опущено,  до  конца
         блока,  обозначаемого  ENDIF.  Если  условие не выполняется,
         ассемблируется  группа  предложений,   расположенная   между
         ключевыми  словами  ESLE  и ENDIF, а если ELSE опущено, MASM
         пропускает блок.
               Допускается вложенность директив. Максимальная глубина
         вложения - 255.
               В  качестве  директивы-условного-ассемблирования могут
         задаваться конструкции, приведенные в таблице 4.1.
               
               
             Таблица 4.1. Директивы условного ассемблирования.
               ____________________________________________
               |                                          |
               |     IF     выражение                     |
               |__________________________________________|
               |                                          |
               |     IFE    выражение                     |
               |__________________________________________|
               |                                          |
               |     IF1                                  |
               |__________________________________________|
               |                                          |
               |     IF2                                  |
               |__________________________________________|
               |                                          |
               |     IFDEF  имя                           |
               |__________________________________________|
               |                                          |
               |     IFNDEF имя                           |
               |__________________________________________|
               |                                          |
               |     IFB    <аргумент>                    |
               |__________________________________________|
               |                                          |
               |     IFNB   <аргумент>                    |
               |__________________________________________|
               |                                          |
               |     IFIDN  <аргумент-1>,<аргумент-2>     |
               |__________________________________________|
               |                                          |
               |     IFDIF  <аргумент-2>,<аргумент-2>     |
               |__________________________________________|
               
               
               В  случае  директивы  IF  блок  ассемблируется,   если
         указанное выражение истинно (не  нуль).  Для  директивы  IFE
         блок  ассемблируется, если выражение ложно (нуль). Выражение
         должно  иметь  абсолютное  значение  и  не  может  содержать
         ссылок вперед.
               Директивы IF1 и IF2 проверяют номер прохода ассемблера
 
                                   - 18 -
         
         
         и обеспечивают обработку  блока  только  на  1-м  (IF1)  или
         только на 2-м (IF2) проходе.
               
                 Пример (выдача сообщений на консоль):
               
               IF1
                %OUT Pass 1
               ELSE
                %OUT Pass 2
               ENDIF
               
               Директивы  IFDEF  и  IFNDEF проверяют, определено ли в
         программе указанное имя. IFDEF обеспечивает ассемблирование,
         если  это  имя  определено как метка, переменная или символ,
         IFNDEF -  если  имя  не  определено.  Заметим,  что  если  в
         качестве   имени   задана   ссылка   вперед,  она  считается
         неопределенной на 1-м проходе и определенной на 2-м.
               Имена  можно  определять  не  только  указанием  их  в
         соответствующей   позиции   при   мнемонике  инструкции  или
         директивах определения памяти, но в опции ассемблера /D, что
         позволяет управлять составом  ассемблируемой  программы  без
         изменения исходного файла.
               Директивы  IFB  и  IFNB  проверяют значение указанного
         аргумента,  трактуемого  как  строка  символов,  и  вызывают
         ассемблирование блока, если аргумент является пробелом (IFB)
         или  отличен  от пробела (IFNB). Аргумент может быть именем,
         числом или выражением. Скобки < и > обязательны.
               Директивы IFB  и  IFNB  введены для использования их в
         макроопределениях,   где   они   могут   управлять  условным
         ассемблированием, основываясь на том, задан или нет параметр
         макроопределения. В этом случае в качестве аргумента следует
         задавать один из формальных параметров макроопределения.
               Директивы IFDIF и IFIDN  сравнивают  специфицированные
         для  них аргументы, которые трактуются как символьные строки
         (с учетом регистра), и вызывают ассемблирование блока при их
         идентичности  (IFIDN)  или неидентичности (IFDIF). Аргументы
         могут быть именами, числами или выражениями. Скобки  <  и  >
         обязательны. Аргументы разделяются запятой.
               Директивы IFDIF и IFIDN введены для использования их в
         макроопределениях,  где   они   могут   управлять   условным
         ассемблированием,   анализируя   значения   передаваемых   в
         макроопределение  параметров.  В  этом  случае  в   качестве
         аргументов    следует    задавать    формальные    параметры
         макроопределения.
               
               
               
               
               
               
                    4.2. Директивы условной генерации ошибок.
               
               
               Использование   директив   условной  генерации  ошибок
         позволяет контролировать ситуации, не нашедшие  отражения  в
 
                                   - 19 -
         
         
         синтаксисе  языка  ассемблера.  Например,  при  помощи такой
         директивы можно вызвать генерацию  сообщения  об  ошибке  и,
         соответственно,   установку   минимального   кода   возврата
         транслятора в случае использования регистра AX,  что с точки
         зрения   синтаксиса  не  является  ошибкой,  но  может  быть
         недопустимо по логике программы. 
               Обработка любой директивы условной  генерации  ошибок,
         кроме  .ERR1, с истинным условием эквивалентна распознаванию
         фатальной ошибки (с кодом  возврата  7),  при  которой  MASM
         уничтожает объектный файл.
               Форматы  директив  и соответствующие им сообщения MASM
         приведены в таблице 4.2.
               
               
               Таблица 4.2. Директивы условной генерации ошибок.
         ____________________________________________________________
         |                   |                                      |
         |     Синтаксис     |       Номер и текст сообщения        |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERR1             | 87 Forced error - pass 1             |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERR2             | 88 Forced error - pass 2             |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERR              | 89 Forced error                      |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERRE выражение   | 90 Forced error - expression equals 0|
         |___________________|______________________________________|
         |                   |                                      |
         | .ERRNZ выражение  | 91 Forced error - expression not     |
         |                   |    equals 0                          |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERRNDEF имя      | 92 Forced error - symbol not defined |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERRDEF имя       | 93 Forced error - symbol defined     |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERRB <строка>    | 94 Forced error - string blank       |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERRNB <строка>   | 95 Forced error - string not blank   |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERRIDN <стро-    | 96 Forced error - strings identical  |
         |  ка-1>,<строка-2> |                                      |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERRDIF <стро-    | 97 Forced error - strings different  |
         |  ка-2>,<строка-2> |                                      |
         |___________________|______________________________________|
 
                                   - 20 -
         
         
         
               
               Директива  .ERR  обеспечивает  безусловную   генерацию
         сообщения  об  ошибке.  Директивы  .ERR1   и   .ERR2   также
         безусловно воздействуют  соответственно  лишь  на  1-й и 2-й
         проход транслятора. Директива .ERR1  вызывает  не  фатальную
         ошибку, а предупреждение. 
               Директивы .ERRNZ и .ERRE вычисляют значение указанного
         выражения  и  обеспечивают  появление  сообщения  об  ошибке
         соответственно в случае  истинности  (1)  или  ложности  (0)
         этого выражения.
               Директива  .ERRDEF  обеспечивает  появление  фатальной
         ошибки, когда  указанное  имя  определено  в  программе  как
         метка,  переменная  или символ, а директива .ERRNDEF - когда
         имя еще не определено. Если это имя является ссылкой вперед,
         оно  считается  неопределенным на 1-м проходе и определенным
         на 2-м. Эти директивы работают на 1-м проходе.
               Директивы .ERRB и .ERRNB анализируют указанную  строку
         и  обеспечивают  генерацию  сообщения  об  ошибке,  если эта
         строка соответственно содержит все пробелы или нет.
               Директивы  .ERRIDN  и   .ERRDIF   вызывают   появление
         фатальной   ошибки,  если  указанные  строки  соответственно
         идентичны или различны.

                                     - 21 -
                                         
               
               
                 
                                5. Макросредства.

               
               Макросредства языка ассемблера позволяют формировать в 
         исходной  программе  блоки  предложений  (макроопределения), 
         имеющие одно общее имя, и затем многократно использовать это 
         имя   для   представления   всего    блока.    В    процессе 
         ассемблирования    MASM    автоматически   замещает   каждое 
         распознаваемое макроимя  (макрокоманду)  последовательностью 
         предложений в соответствии с макроопределением, в результате 
         чего формируется макрорасширение. 
               Макрокоманда  может встречаться в  исходной  программе
         столько  раз,  сколько  это  необходимо.  Макроопределение в
         исходном   файле   должно   предшествовать    его    первому
         использованию  в  макрокоманде.  Макроопределение  может как
         непосредственно  находиться  в  тексте  программы,   так   и
         подключаться из другого файла директивой INCLUDE (п.8.1).
               В  макроопределение  могут  быть  переданы  параметры,
         которые   могут  управлять  макроподстановкой  или  задавать
         фрагменты текста.
               В программе на языке ассемблера макрокоманды выполняют
         в целом те же функции, что и  процедуры,  т.е.  обеспечивают
         многократное   и   функционально   законченное   действие  с
         параметрическим   управлением.   Различие   заключается    в
         следующем:
               1.  Процедура  присутствует  в исходной программе один
         раз, тогда как  тело  макроопределения  дублируется  столько
         раз,  сколько  соответствующих макрокоманд содержит исходный
         файл.
               2. Текст процедуры статичен и неизменен  в  то  время,
         как состав  макрорасширения  может  зависеть  от  параметров
         макрокоманды. Следует помнить, что параметры макрокоманды  -
         это  значения времени ассемблирования, а параметры процедуры
         принимают какие-то определенные  значения  лишь  в  процессе
         выполнения программы.
               
               Основные  макродирективы  описаны в п.5.1.
               В  п.5.2  содержатся  сведения  о  блоках  повторения,
         которые в целом можно считать частным случаем макродиректив,
         хотя они имеют определенную специфику.
               В п.5.3 описаны макрооператоры, позволяющие  выполнять
         некоторые  функции  над  параметрами  макрокоманды и другими
         элементами исходного текста.
               
               
               
               
               
               
 
                                   - 22 -
         
         
                            5.1. Макродирективы.
               
               
               Макроопределение  представляет  собой  блок   исходных
         предложений, начинающийся директивой MACRO и заканчивающийся
         директивой ENDM. Формат макроопределения:
               
        имя MACRO [[формальный-параметр,...]]
               предложения
            ENDM
               
               Именем макроопределения  считается  имя,  указанное  в
         директиве MACRO. Оно должно быть уникальным и используется в
         исходном  файле  для  вызова  макроопределения.   Формальные
         параметры  представляют  собой  внутренние  по  отношению  к
         данному  макроопределению  имена,  которые используются  для
         обозначения  значений,  передаваемых  в макроопределение при
         его вызове. Может быть  определено  любое  число  формальных
         параметров,  но  все они должны помещаться на одной строке и
         разделяться запятыми (если их несколько).
               В теле макроопределения  допустимы  любые  предложения
         языка  ассемблера,  в  том  числе  и  другие макродирективы.
         Допустимо  любое  число   предложений.   Каждый   формальный
         параметр  может  быть  использован  любое  число  раз в этих
         предложениях.
               Макроопределения  могут  быть  вложенными,  т.е.  одно
         макроопределение   может   содержаться  в  другом.  MASM  не
         обрабатывает вложенные макроопределения до тех пор, пока  не
         будет  вызвано  внешнее  макроопределение. Поэтому вложенное
         макроопределение не может быть вызвано до тех пор, пока хотя
         бы  один  раз  не  было  вызвано  внешнее  макроопределение.
         Глубина вложенности может быть произвольной и ограничивается
         лишь размером доступной при ассемблировании памяти.
               Макроопределения   могут   содержать   вызовы   других
         макроопределений. Такие вложенные макровызовы обрабатываются
         так же, как и  другие  макровызовы,  но  лишь  тогда,  когда
         вызвано внешнее макроопределение.
               Макроопределения   могут   быть   рекурсивными,   т.е.
         вызывать сами себя.
               MASM  ассемблирует  предложения  тела макроопределения
         только при макровызове и только в той точке исходного файла,
         где  этот  вызов  имеет  место.  Таким образом, все адреса в
         ассемблируемом коде будут связаны с точкой макровызова, а не
         местоположением  макроопределения.  Макроопределение само по
         себе никогда не ассемблируется.
               Следует соблюдать осторожность при использовании слова
         MACRO  после  директив  TITLE, SUBTTL и NAME. Т.к. директива
         MACRO  "перекрывает"  эти  директивы,  использование  такого
         слова   после   указанных  директив  приведет  к  тому,  что
         ассемблер начнет создавать макро с именами TITLE, SUBTTL или
         NAME. Например, предложение
               TITLE Macro File
         может  быть  внесено  в исходный файл для создания заголовка
         "Macro File", но в результате будет создано макроопределение
         с   именем  TITLE,  имеющее  формальный  параметр  File,  а,
 
                                   - 23 -
         
         
         поскольку в этом случае, очевидно,  не  будет  предусмотрена
         директива    ENDM,   закрывающая   макроопределение,   будет
         скорее всего генерироваться сообщение об ошибке.
               Следует помнить, что MASM замещает все вхождения имени
         формального   параметра   в   теле   макроопределения    его
         фактическим  значением, даже если программисту это не нужно.
         Например,   если   формальный   параметр  имеет  имя  AX,  в
         генерируемом макрорасширении MASM замещает все вхождения  AX
         на  значение  фактического  параметра.  Если  же  по  логике
         макроопределения необходимо использование регистра AX, а  не
         одноименного   формального  параметра,  код  макрорасширения
         может быть некорректным.
               Макроопределения  могут  быть переопределены. При этом
         можно не заботиться об удалении из исходного  файла  первого
         макроопределения,  т.к.  каждое  следующее  макроопределение
         автоматически замещает предыдущее макроопределение с тем  же
         именем.   Если  переопределение  совершается  внутри  самого
         макроопределения, необходимо помнить, что между  директивами
         ENDM,  закрывающими  старое  и  новое  макроопределения,  не
         должно  находиться  никаках   строк.   Например,   следующее
         переопределение некорректно:
               
               dostuff MACRO
                  ...
                  dostuf MACRO
                     ...
                  ENDM
                  ;; Ошибочная строка
               ENDM
               
               
               Макроопределение может быть  вызвано  в  любой  момент
         простым  указанием его имени в исходном файле (имена макро в
         комментариях   игнорируются).   MASM   при   этом   копирует
         предложения   макроопределения   в   точку  вызова,  замещая
         в этих  предложениях  формальные  параметры  на  фактические
         параметры, задаваемые при вызове.
               Общий вид макровызова:
               
               имя [[фактический-параметр,...]]
               
               Имя  должно быть именем ранее определенного в исходном
         файле макроопределения. Фактическим  параметром  может  быть
         имя,  число  или  другое  значение.  Допустимо  любое  число
         фактических параметров, но  все  они  должны  помещаться  на
         одной строке. Элементы списка параметров должны  разделяться
         запятыми, пробелами, или TAB-символами.
               MASM  замещает  первый  формальный  параметр на первый
         фактический параметр, второй формальный параметр  на  второй
         фактический параметр и т.д. Если  фактических  параметров  в
         макровызове    больше,    чем    формальных   параметров   в
         макроопределении, лишние фактические параметры игнорируются.
         Если  же  фактических  параметров  меньше,  чем  формальных,
         формальные параметры, для  которых  не  заданы  фактические,
         замещаются пустыми  строками  (пробелами).  Для  определения
 
                                   - 24 -
         
         
         того,  заданы  или  не  заданы  соответствующие  фактические
         параметры могут быть использованы директивы IFB, IFNB, .ERRB
         и .ERRNB (п.п.4.1 и 4.2).
               В  макросредствах языка ассемблера имеется возможность
         передавать список значений в качестве одного параметра. Этот
         список должен быть заключен в одинарные скобки < и >, а сами
         элементы списка - разделяться запятыми. Пример:
               
               allocb <1,2,3,4>
               
               При  написании   макроопределений   иногда   возникает
         необходимость  в  задании  меток  инструкций  или имен полей
         данных.    Поскольку    каждое    макроопределение     может
         использоваться многократно, может возникнуть ситуация, когда
         несколько имен или меток определены многократно, что вызовет
         ошибку  трансляции.  Для  обеспечения  правильной  обработки
         таких ситуаций в макроязыке предусмотрена  директива  LOCAL,
         позволяющая  локализовать  заданные  имена  исключительно  в
         данном макрорасширении. Формат:
               
               LOCAL формальное-имя,...
               
               Формальное-имя может  затем  использоваться  в  данном
         макроопределении  с уверенностью, что при каждом макровызове
         его значение будет уникальным. В директиве LOCAL,  если  она
         присутствует, должно быть задано хотя бы одно имя, а если их
         несколько, они должны разделяться запятыми.
               Для обеспечения уникальности  определенных  директивой
         LOCAL   имен  MASM  для  каждого  такого  имени  при  каждом
         макровызове порождает реальное имя следующего вида:
               
         ??номер
               
               Номер представляет собой 16-ричное число в пределах от
         0000 до FFFF. Для предотвращения повторного определения имен
         программисту не рекомендуется определять в  своей  программе
         имена этого типа.
               Директива   LOCAL   может   использоваться   только  в
         макроопределении, причем, там она должна предшествовать всем
         другим   предложениям   макроопределения,   т.е.   следовать
         непосредственно после MACRO.
               
               Для удаления макроопределений служит директива  PURGE.
         Формат:
               
               PURGE имя-макроопределения,...
               
               Удаляются  все  текущие  макроопределения с указанными
         именами. Последующий вызов одного из  этих  макроопределений
         будет приводить к ошибке.
               Директива PURGE введена для возможности освобождения и
         повторного использования памяти, занимаемой  неиспользуемыми
         в  дальнейшем  макроопределениями. Если имя-макроопределения
         представляет    мнемонику    инструкции    или    директивы, 
         восстанавливается    первоначальный    смысл   мнемоники   в
 
                                   - 25 -
         
         
         соответствии со значением данного ключевого слова.
               Директива  PURGE  часто  используется   для   удаления
         ненужных макроопределений из подключаемой директивой INCLUDE
         библиотеки  макроопределений.   Библиотека  макроопределений
         представляет собой  обычный последовательный файл, который в
         общем случае может содержать большое число макроопределений.
         Комбинация директив INCLUDE и PURGE позволяет выбрать из них
         только нужные  для  данной программы,  что  сократит  размер
         исходного файла.
               Нет  необходимости  удалять макроопределения  после их
         переопределения, т.к.  каждое  переопределение автоматически
         удаляет предшествующее  макроопределение  с  данным  именем.
         Аналогично каждое макроопределение может удалить  само себя,
         имея  в  своей  последней  обрабатываемой  строке  директиву
         PURGE.
               
               Конец     текущего    макроопределения    обозначается
         директивой  ENDM,  которая  должна  находиться  в  последней
         строке макроопределения. Формат:
               
               ENDM
               
               Выход  из  текущего  макроопределения   до  достижения
         директивы   ENDM  обеспечивается директивой  EXITM,  имеющей
         следующий формат:
               
               EXITM
               
               Выход из макроопределения по директивам  ENDM  и EXITM
         заключается в прекращении генерации текущего макрорасширения
         и  возврате  в  точку  вызова  текущего  макроопределения  в
         динамически   внешнем   макрорасширении   или   в   исходной
         программе.
               
               Пример:
               
         add   MACRO param
               IFB   param
               EXITM
               ENDIF
               ADD   AX,param
               ENDM
               
               В  этом   мароопределении   осуществляется  добавление
         величины,   определяемой   формальным  параметром  param,  к
         содержимому регистра AX. Блок условного ассемблирования  IFB
         обеспечивает  выход  из  макроопределния,  если  при  вызове
         параметр не был задан.
               
               
               
               
               
               
               
 
                                   - 26 -
         
         
               
                           5.2. Блоки повторений.
               
               
               
               Блок повторения представляет собой специфическую форму
         макроопределения  с  несколько  ограниченными  возможностями
         макроязыка.   По  сути  блок  повторения  представляет собой
         макрообъект,   объединяющий   в   себе   макроопределение  и
         макровызов.   Макроопределения  как   шаблона,  по  которому
         производится генерация макрорасширения, здесь не  требуется,
         в   результате   чего   сужаются   возможности  варьирования
         генерируемым текстом. С другой стороны, использование блоков 
         повторения   по  сравнению   с  макроопределениями  является
         синтаксически и логически более простой задачей.
               Обработка блока  повторения заключается в многократном
         дублировании  тела  блока  с   незначительными   изменениями
         текста.
               В языке ассемблера имеются блоки повторения 3-х типов:
         REPT-блок, IRP-блок и IRPC-блок.
               
               
               REPT-блок имеет следующий формат:
               
               REPT выражение
                  ...
                предложения
                  ...
               ENDM
               
               Блок предложений, заключенный между  ключевыми словами
         REPT   и  ENDM,  повторяется  столько  раз,  каково  текущее
         значение  указанного  выражения.  Выражение   должно   иметь
         значение  в  виде  16-битового  числа  без  знака и не может
         содержать внешних или неопределенных  символов.  Тело  блока
         может включать в себя любые предложения языка.
               
               
               IRP-блок имеет следующий формат:
               
               IPR формальный-параметр,<параметр,...>
                  ...
                предложения
                  ...
               ENDM
               
               Блок  предложений, стоящий между ключевыми словами IRP
         и ENDM, будет  повторен  для  каждого  параметра  в  списке,
         заключенном  в  скобках  <>.  Формальный-параметр  относится 
         только к  данному блоку и последовательно принимает значения
         из списка. В качестве параметров в списке могут  быть заданы
         определенные   символы,   строки,   числа   или   символьные
         константы.  Может  быть  задано  любое   число   параметров,
         которые,  если  их  несколько,  должны разделяться запятыми.
         Тело блока может включать в  себя  любые  предложения  языка
 
                                   - 27 -
         
         
         ассемблера.  Формальный-параметр  в  теле  блока  может быть
         использован произвольное число раз.
               Когда MASM распознает директиву IRP, он  создает копию
         предложений  блока  для  каждого  параметра  в  списке.  При
         копировании  предложений   осуществляется   замена   текущим
         параметром всех вхождений формального параметра блока.  Если
         в  списке  будет  обнаружен пустой параметр (<>), формальный
         параметр   получит  значение   пустой  строки.  Если  список
         параметров пуст, блок игнорируется.
               
               Пример:
               
         alloc MACRO x
               IRP   y,
               DB    y
               ENDM
               ENDM
               
               В результате обработки макровызова
               
               alloc <0,1,2,3>
               
               будет сгенерировано макрорасширение
               
               IRP   y,<0,1,2,3>
               DB    y
               ENDM
               
               
               IRPC-блок имеет следующий формат:
               
               IRPC формальный-параметр,строка
                  ...
                предложения
                  ...
               ENDM
               
               Блок предложений, заключенный между  ключевыми словами
         IRPC  и  ENDM,  будет  повторен для каждого символа указанной
         строки. При этом каждое  вхождение  формального  параметра в
         блоке   замещается   текущим   символом    строки.    Строка
         представляет  собой  любую  комбинацию  букв,  цифр и других
         символов. Если строка содержит пробелы, запятые  или  другие
         ограничители,  она  должна быть заключена в одинарные скобки
         <>. Тело блока может включать в себя любые предложения языка
         ассемблера.  Формальный  параметр  в  теле  блока может быть
         использован произвольное число раз.
               Когда MASM распознает директиву IRPC, он создает копию
         предложений  блока  для  каждого  символа   в   строке.  При
         копировании   предложений   осуществляется   замена  текущим
         символом строки всех вхождений формального параметра блока.
               
               
               
               
 
                                   - 28 -
         
         
               
               
               
                            5.3. Макрооператоры.
         

               В  качестве  элементов  генерируемого  текста  в  теле
         макроопределения  могут  быть  использованы  макрооператоры,
         приведенные в таблице 5.1.
               
               
                      Таблица 5.1. Макрооператоры.
               
         ___________________________________________________________
         |                        |                                |
         |       синтаксис        |         функция                |
         |________________________|________________________________|
         |                        |                                |
         |  &формальный-параметр  |                                |
         |________________________|       оператор замены          |
         |                        |                                |
         |  формальный-параметр&  |                                |
         |________________________|________________________________|
         |                        |                                |
         |  <текст>               |  текстовый оператор литерала   |
         |________________________|________________________________|
         |                        |                                |
         |  !символ               |  символьный оператор литерала  |
         |________________________|________________________________|
         |                        |                                |
         |  %текст                |       оператор выражения       |
         |________________________|________________________________|
         |                        |                                |
         |  ;;текст               |       макрокомментарий         |
         |________________________|________________________________|
              
               
               Оператор   замены   &   обеспечивает  замену  в тексте
         формального  параметра  на  значение   соответствующего  ему
         фактического    параметра    макроопределения.    Символ   &
         употребляется  как  перед,  так  и  после  имени формального
         параметра и служит для выделения параметра в строке символов
         или в строке, содержащей кавычки.
               Во вложенных  макроопределениях  оператор замены может
         быть использован для задержки замены  формального  параметра
         действительным  значением, для чего используется более общая
         форма оператора замены, в которой символ & может быть указан
         несколько   раз.  MASM  трактует  количество  рядом  стоящих
         символов  &   как   глубину   вложенности   макроопределений
         (относительно   текущего   уровня),   на   которой   следует
         осуществлять замену формального параметра.
               
               Пример:
               
         alloc MACRO x
 
                                   - 29 -
         
         
               IRP   z,<1,2,3>
         x&&z  DB    z
               ENDM
               ENDM
               
               В  этом  примере   замена   формального  параметра   x
         осуществляется  немедленно  при   вызове   макроопределения.
         Замена параметра z будет задержана до начала обработки блока
         повторения  IRP  с тем, чтобы параметр z получал значения из
         указанного   списка.   Таким   образом,   параметр  z  будет
         замещаться значением элемента списка каждый раз при переходе
         к  следующему  элементу  списка блока повторения. В итоге по
         макрокоманде 
               
               alloc var
               
               будет сгенерировано макрорасширение
               
         var1  DB    1
         var2  DB    2
         var3  DB    3
               
               
               Текстовый  оператор   литерала   указывает  MASM,  что
         заданный внутри скобок < и >  текст  следует  трактовать как
         простой литеральный  элемент независимо от того, содержит ли
         он запятые, пробелы или другие ограничители. Чаще всего этот
         оператор используется  в  макровызовах  и директивах IRP для
         того, чтобы значения  списка  параметров  обрабатывались как
         один параметр.
               Кроме того,  этот оператор используется в тех случаях,
         когда необходимо, чтобы MASM трактовал некоторые специальные
         символы  (например,  ;  или  &)  как  литералы.  Например, в
         выражении <;> точка с запятой  рассматривается  как  точка с
         запятой, а не как начало комментария.
               
               Символьный   оператор   литерала   !   отличается   от
         текстового   лишь   тем,  что  в  нем  в  качестве  литерала
         рассматривается  только  непосредственно  следующий   за   !
         символ. Например, выражения !; и <;> эквивалентны.
               
               Оператор выражения  % указывает MASM, что данный текст
         следует трактовать как  выражение.  MASM  вычисляет значение
         выражения с учетом основания системы счисления встречающихся
         в выражении чисел и замещает  текст  этим  значением.  Текст
         должен представлять корректное выражение.
               Оператор выражения обычно используется в макровызовах,
         когда  в  макроопределение   необходимо   передать  значение
         выражения, а не его текстовую форму.
               
               Пример:
               
         area  MACRO par
               DW    &par
               ENDM
 
                                   - 30 -
         
         
               
         sum1  EQU   100
         sum2  EQU   200
               
               В результате обработки макровызова
               
               area %(sum1+sum2)
               
               будет сгенерировано макрорасширение
               
               DW    300
               
               
               
               Оператор макрокомментария  ;;  определяет, что остаток
         строки является макрокомментарием.  В  отличие  от  обычного
         комментария,   который   обозначается  одинарными  точкой  с
         запятой  и  также  может  встречаться  в  макроопределениях,
         макрокомментарий  в  текст макрорасширения  не  попадает. Он 
         присутствует лишь в теле макроопределения.

                                     - 31 -
               
               
               
               
               
               
               
               
                       6. Директивы определения памяти.

               
               
               Директивы   определения   памяти  служат  для  задания
         размеров,  содержимого  и   местоположения   полей   данный,
         используемых  в  программе на языке ассемблера. В отличие от
         других директив  языка  ассемблера  при  обработке  директив
         определения   памяти   генерируется   объектный   код.  MASM
         транслирует  задаваемые  в  директивах  определения   памяти
         числа,  строки  и  выражения в отдельные образы байтов, слов
         или других единиц данных. Эти образы копируются в  объектный
         файл.
               Директивы определения данных могут задавать:
         1. Скалярные данные, представляющие собой единичное значение
            или набор единичных значений.
         2. Записи,  позволяющие  манипулировать с данными  на уровне
            бит. 
         3. Структуры,  отражающие   некоторую  логическую  структуру
            данных.
               
               Директивы определения  этих  типов  данных  описаны  в
         следующих 3-х разделах.
         
               
               
         
               
               
               
         
         
         
                           6.1. Скалярные данных.
         
         
               Директивы определения скалярных данных  приведены   в
         таблице 6.1. 
               
               
               
               
               
               
               
 
                                   - 32 -
         
         
             Таблица 6.1. Директивы определения скалярных данных.
               
          ________________________________________________________
          |                          |                           |
          |         формат           |          функция          |
          |__________________________|___________________________|
          |                          |                           |
          | [[имя]] DB значение,...  |    определение байтов     |
          |__________________________|___________________________|
          |                          |                           |
          | [[имя]] DW значение,...  |     определение слов      |
          |__________________________|___________________________|
          |                          |                           |
          | [[имя]] DD значение,...  |  определение двойных слов |
          |__________________________|___________________________|
          |                          |                           |
          | [[имя]] DQ значение,...  |  определение квадро-слов  |
          |__________________________|___________________________|
          |                          |                           |
          | [[имя]] DT значение,...  |   определение 10 байтов   |
          |__________________________|___________________________|
               
               
               Директива     DB    обеспечивает    распределение    и
         инициализацию  1  байта  памяти  для  каждого  из  указанных
         значений.  В  качестве  значения  может  кодироваться  целое
         число,  строковая   константа,  оператор  DUP  (см.   ниже),
         абсолютное   выражение   или   знак  ?.  Знак  ?  обозначает
         неопределенное значение. Значения, если их несколько, должны
         разделяться запятыми.
               Если  директива  имеет  имя, создается переменная типа
         BYTE с соответствующим данному  значению  указателя  позиции
         смещением.
               Строковая  константа может содержать столько символов,
         сколько помещается на одной строке. Символы строки  хранятся
         в  памяти  в  порядке  их  следования, т.е. 1-й символ имеет
         самый младший адрес, последний - самый старший.
               
               Директива     DW    обеспечивает    распределение    и
         инициализацию  слова  памяти  (2  байта)  для   каждого   из
         указанных  значений.  В качестве значения может кодироваться
         целое число, 1- или 2-х символьная константа,  оператор  DUP
         (см.  ниже),  абсолютное  выражение,  адресное выражение или
         знак ?. Знак ? обозначает неопределенное значение. Значения,
         если их несколько, должны разделяться запятыми.
               Если  директива  имеет  имя, создается переменная типа
         WORD с соответствующим данному  значению  указателя  позиции
         смещением.
               Строковая  константа  не  может  содержать  более  2-х
         символов.  Последний  (или   единственный)   символ   строки
         хранится в младшем байте слова. Старший байт содержит первый
         символ или, если строка односимвольная, 0.
               
               Директива     DD    обеспечивает    распределение    и
         инициализацию двойного слова памяти (4 байта) для каждого из
 
                                   - 33 -
         
         
         указанных  значений.  В качестве значения может кодироваться
         целое число, 1- или 2-х символьная константа, действительное
         число,  кодированное действительное число, оператор DUP (см.
         ниже), абсолютное выражение, адресное выражение или знак  ?.
         Знак ? обозначает неопределенное значение. Значения, если их
         несколько, должны разделяться запятыми. 
               Если  директива  имеет  имя, создается переменная типа
         DWORD с соответствующим данному  значению  указателя позиции
         смещением.
               Строковая  константа  не  может  содержать  более  2-х
         символов.  Последний  (или   единственный)   символ   строки
         хранится в младшем байте слова.  Второй байт содержит первый
         символ или, если строка односимвольная, 0.  Остальные  байты
         заполняются нулями.

               Директива     DQ    обеспечивает    распределение    и
         инициализацию  8  байтов  памяти  для  каждого  из указанных
         значений.  В  качестве  значения  может  кодироваться  целое
         число,  1-  или  2-х  символьная  константа,  действительное
         число,  кодированное действительное число, оператор DUP (см.
         ниже), абсолютное выражение, адресное выражение или знак  ?.
         Знак ? обозначает неопределенное значение. Значения, если их
         несколько, должны разделяться запятыми. 
               Если  директива  имеет  имя, создается переменная типа
         QWORD с соответствующим данному  значению  указателя позиции
         смещением.
               Строковая  константа  не  может  содержать  более  2-х
         символов.  Последний  (или   единственный)   символ   строки
         хранится в младшем байте слова.  Второй байт содержит первый
         символ или, если строка односимвольная, 0.  Остальные  байты
         заполняются нулями.
               
               Директива     DT    обеспечивает    распределение    и
         инициализацию  10 байтов  памяти  для  каждого  из указанных
         значений.  В  качестве  значения  может  кодироваться  целое
         выражение,  упакованное  десятичное  число,   1-   или   2-х
         символьная  константа,  кодированное  действительное  число,
         оператор DUP (см.  ниже)  или  знак  ?.  Знак  ?  обозначает
         неопределенное значение. Значения, если их несколько, должны
         разделяться запятыми.
               Если  директива  имеет  имя, создается переменная типа
         TWORD с соответствующим данному  значению  указателя позиции
         смещением.
               Строковая  константа  не  может  содержать  более  2-х
         символов.  Последний  (или   единственный)   символ   строки
         хранится в младшем байте слова.  Второй байт содержит первый
         символ или, если строка односимвольная, 0.  Остальные  байты
         заполняются нулями.
               При  обработке  директивы  DT   подразумевается,   что
         константы,  содержащие  десятичные цифры, представляют собой
         не   целые,  а  десятичные   упакованные  числа.   В  случае
         необходимости  определить  10-байтовое  целое  число следует
         после числа указать спецификатор системы счисления (D или  d
         для десятичных чисел, H или h для 16-ричных и т.д.).
               
 
                                   - 34 -
         
         
               Если  в  одной  директиве  определения  памяти  заданы
         несколько значений, им распределяются последовательные байты
         памяти.
               
               Во  всех  директивах  определения  памяти  в  качестве
         одного из значений может быть задан оператор DUP.  Он  имеет
         следующий формат:
               
         счетчик DUP (значение,...)
               
               Указанный  в  скобках  ()  список значений повторяется
         многократно в соответствии  зо  значением  счетчика.  Каждое
         значение  в  скобках  может  быть  любым выражением, имеющим
         значением  целое  число,  символьную  константу  или  другой
         оператор   DUP   (допускается   до  17  уровней  вложенности
         операторов  DUP).  Значения,  если  их   несколько,   должны
         разделяться запятыми.
               Оператор   DUP  может  использоваться  не  только  при
         определении памяти, но и в других директивах.
               
               
               Примеры директив определения скалярных данных:
               
         integer1 DB 16
         string1  DB 'abCDf'
         empty1   DB ?
         integer2 DW 16728
         contan2  DW 4*3
         multip2  DW 1,'$'
         arr2     DW array
         string3  DD 'ab'
         real3    DD 1.5
         encode3  DD 3F000000r
         high3    DD 4294967295
         char4    DQ 'b'
         encode4  DQ 3F00000000000000r
         high4    DQ 18446744073709551615
         pack5    DT 1234567890
         real5    DT 1.5
         mult5    DT 'a',3F000000000000000000r
         high5    DT 1208925819614629174706175d
         db6      DB 5 DUP(5 DUP(5 DUP(10)))
         dw6      DW DUP(1,2,3,4,5)
               
               
               
               
               
               
               
                                6.2. Записи.
               
               
               Запись    представляет    собой   набор   полей   бит,
         объединенных  одним  именем.  Каждое   поле   записи   имеет
 

                                   - 35 -
         
         
         собственную   длину,  исчисляемую  в  битах,  и  не  обязана
         занимать целое число байтов.
               Объявление записи  в  программе  на  языке  ассемблера
         включает в себя 2 действия:
               1. Объявление  шаблона  или   типа  записи  директивой
                  RECORD. 
               2. Объявление собственно записи.
               
               Формат директивы RECORD:
               
         имя-записи RECORD имя-поля:длина[[=выражение]],...
               
               Директива RECORD  определяет  вид  8-  или  16-битовой
         записи,  содержащей  одно  или  несколько  полей. Имя-записи
         представляет  собой   имя   типа   записи,   которое   будет
         использоваться  при  объявлении  записи. Имя-поля и длина (в
         битах) описывают конкретное поле записи. Выражение, если оно
         указано задает начальное (умалчиваемое) значение поля.
               Описания  полей  записи  в  директиве  RECORD, если их
         несколько, должны разделяться  запятыми.  Для  одной  записи
         может  быть  задано любое число полей, но их суммарная длина
         не должна превышать 16 бит.
               Длина каждого поля задается константой в пределах от 1
         до 16. Если общая длина полей  превышает  8  бит,  ассемблер
         выделяет под запись 2 байта, в противном случае - 1 байт.
               Если   задано   выражение,  оно  определяет  начальное
         значение поля. Если длина поля не меньше 7 бит,  в  качестве
         выражения  может  быть  использован  символ  в  коде  ASCII.
         Выражение не должно содержать ссылок вперед.
               Внутри записи поля размещаются слева направо в порядке
         описания в директиве RECORD. Поэтому объявленное первым поле
         содержит самые значимые биты записи, если  рассматривать  ее
         как  двоичное  число.  Если суммарная длина полей не равна 8
         или 16, запись расширяется до целой границы  байта  нулевыми
         битами слева,  и,  таким  образом,  последний бит последнего
         поля всегда является самым младшим битом записи.
               
               Пример:
               
         item RECORD char:7='Q',weight:4=2
               
               Запись item будет иметь следующий вид:
               
               
                             char       weight
                          ___________   _____
                         |           | |     |
               0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0
               
               
               
               При  обработке  директивы  RECORD  формируется  шаблон
         записи,  а  сами  данные  создаются  при  объявлении записи,
         которое имеет следующий вид:

 
                                   - 36 -
         
         
         [[имя]] имя-записи <[[значение,...]]>

               По такому объявлению создается переменная типа  записи
         с   8-   или   16-битовым  значением   и  структурой  полей,
         соответствующей   шаблону,  заданному  директивой  RECORD  с
         именем имя-записи.
               Имя  задает  имя  переменной  типа  записи.  Если  имя
         опущено, MASM распределяет память, но не создает переменную,
         которую можно было бы использовать для доступа к записи.
               В скобках <> указывается список значений полей записи.
         Значения  в  списке,  если  их несколько, должны разделяться
         запятыми. Каждое значение может быть целым числом, строковой
         константой  или  выражением  и  должно соответствовать длине
         данного поля.  Для  каждого  поля  может  быть  задано  одно
         значение.
               Скобки <> обязательны, даже если начальные значения не
         заданы.
               Если  в  качестве  значения  используется оператор DUP
         (п.6.1), в  скобки  <>  следует  заключать  список  значений
         оператора  DUP.  Следует  иметь ввиду, что при использовании
         оператора DUP создается несколько переменных типа запись.
               Задавать значения  всех  полей  записи  необязательно.
         Если ассемблер вместо значения обнаружит левый пробел, будет
         использовано начальное значение  поля,  заданное  директивой
         RECORD, а если  оно  и  там  опущено,  значение  поля  будет
         неопределено.
               
               Пример:
               
         table item 10 DUP(<'A',2>)
               
               Если   для   описания  шаблона  записи  использовалась
         директива RECORD из предыдущего примера, по этому объявлению
         создается  10  записей,  объединенных  именем  table. Каждая
         запись будет иметь следующий вид:

               
                             char       weight
                          ___________   _____
                         |           | |     |
               0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0

               
               
               
               
               
               
                              6.3. Структуры.
               
               
               Структура   представляет  собой  набор  полей  байтов,
         объединенных одним именем.
               Объявление структуры в программе  на  языке ассемблера
         включает в себя 2 действия:
 
                                   - 37 -
         
         
               1. Объявление шаблона  или  типа структуры директивами
                  STRUC и ENDS.
               2. Объявление собственно структуры.
               
               Формат объявления типа структуры:
               
         имя STRUC
          описания-полей
         имя ENDS
               
               Директивы  STRUC  и  ENDS  обозначают   соответственно
         начало  и  конец описания шаблона (типа) структуры. Описание
         типа структуры задает имя типа структуры  и  число,  типы  и
         начальные значения полей структуры.
               Указанное  в  директивах STRUC и ENDS имя задает новое
         имя   типа   структуры.   Оно   должно   быть    уникальным.
         Описания-полей определяют поля структуры и могут быть заданы
         в одной из следующих форм:
               
         [[имя]] DB значение,...
         [[имя]] DW значение,...
         [[имя]] DD значение,...
         [[имя]] DQ значение,...
         [[имя]] DT значение,...
               
               Каждое поле может иметь свое имя.  Директивы  DB,  DW,
         DD, DQ или DT задают длину поля. Для каждого поля могут быть
         указаны начальные значения, которыми  инициализируются  поля
         при    отсутствии    соответствующих    начальных   значений
         при объявлении структуры. Имя  каждой  директивы,  если  оно
         задано,  должно  быть  уникальным  и  представляет  смещение
         поля относительно начала структуры.
               Значением поля может  быть  число,  символ,  строковая
         константа или имя другого объекта. Для определения множества
         значений поля может  использоваться  оператор  DUP.  Если  в
         качестве  значения задана строковая константа, поле занимает
         столько байтов, сколько символов в  константе.  Если  задано
         несколько значений, они должны разделяться запятыми.
               Объявление   типа  структуры  может  содержать  только
         описания полей и комментарии. По этой причине  структуры  не
         могут быть вложенными.
               
               Пример:
               
         table STRUC
           count DB 10
           value DW 10 DUP(?)
           tname DB 'font'
         table ENDS
               
               
               
               При обработке директив STRUC и ENDS формируется шаблон
         структуры, а сами данные создаются при объявлении структуры,
         которое имеет следующий вид:
 
                                   - 38 -
         
         

         [[имя]] имя-структуры <[[значение,...]]>
               
               По   такому   объявлению   создается  переменная  типа
         структура  со  структурой  полей,  соответствующей  шаблону,
         заданному директивой STRUC с именем имя-структуры.
               Имя  задает  имя  переменной.  Если  имя опущено, MASM
         распределяет память, но не создает переменную, которую можно
         было бы использовать для доступа к структуре.
               В   скобках   <>  указывается  список  значений  полей
         структуры. Значения в  списке,  если  их  несколько,  должны
         разделяться  запятыми.  Каждое  значение  может  быть  целым
         числом,  строковой  константой  или выражением, тип которого
         должен  совпадать  с  типом  соответствующего  ему поля. Для
         каждого поля может быть задано одно значение.
               Скобки <> обязательны, даже если начальные значения не
         заданы.
               Если  в  качестве  значения  используется оператор DUP
         (п.6.1), в  скобки  <>  следует  заключать  список  значений
         оператора DUP.
               Задавать значения  всех полей структуры необязательно.
         Если ассемблер вместо значения обнаружит левый пробел, будет
         использовано  начальное значение поля, заданное при описании
         типа структуры, а если и оно опущено,  значение  поля  будет
         неопределено.
               Следует  помнить,  что  объявлении  структуры   нельзя
         задавать  значения  полей,  для  которых  в  соответствующем
         шаблоне задано множество значений. Например:
               
         strings STRUC
               buffer DB 100 DUP(?)
               crif   DB 13,10
               guery  DB 'Filename'
               endm   DB 35
         strings ENDS
               
               При  объявлении  структуры  с   использованием   этого
         шаблона  значения  полей buffer и crif не могут быть заданы,
         т.к. шаблон для них определяет множество значений.  Значение
         поля  guery  может  быть  перекрыто  только значением, длина
         которого не превышает 8 байтов.  Аналогично,  значение  поля
         endm может быть перекрыто любым однобайтовым значением.

                                     - 39 -
               
               
               
               
               
                          7. Описание символических имен.

               
               Директивы  описания   символических   имен   позволяют
         создавать  в исходной программе имена, использование которых
         существенно  упрощает  программирование. Символические имена
         являются   константами   времени   ассемблирования  и  могут
         представлять число, текст, инструкцию или адрес.
               Для описания  символических  имен  в  языке  ассемлера
         служат   директивы   EQU,   LABEL  и  директива  абсолютного
         присваивания (=).
               
               Директива  абсолютного  присваивания  имеет  следующий
         формат:
               
         имя=выражение
               
               По    этой   директиве   создается   абсолютное   имя,
         представляющее значение, равное текущему значению указанного
         выражения. Для хранения этого значения не выделяется никакой
         памяти. Вместо этого каждое  вхождение  указанного  имени  в
         исходном файле замещается значением выражения.
               Абсолютное имя может  быть  переопределено.  В  каждой
         директиве  абсолютного  присваивания  в качестве имени может
         быть указано уникальное имя или  имя,  ранее  использованное
         другой директивой абсолютного присваивания.
               Выражение   может   быть   целым   числом,  одно-  или
         двухсимвольной строковой константой, константным  выражением
         или  адресным  выражением.  Его значение не должно превышать
         65535.
               Следует   помнить,   что  значение  абсолютного  имени
         является переменной величиной в процессе  ассемблирования  и
         константой во время выполнения программы.
               
               Примеры:
               
         integer = 167
         string  = 'ab'
         const   = 3*4
         addr    = string

               
               
               Директива EQU имеет следующий формат:
               
         имя EQU выражение

               Директива   EQU  создает  абсолютное  имя,  алиас  или
 
                                     - 40 -
         
         
         текстовое имя путем присваивания имени указанного выражения.
         Под   абсолютным   здесь   понимается   имя,  представляющее
         16-битовое значение; алиасом назывется ссылка на другое имя;
         текстовое  имя  представляет  собой  строку символов. Каждое
         вхождение имени в исходном файле ассемблер замещает  текстом
         или  значением выражения в зависимости от типа используемого
         выражения.
               Имя  должно  быть   уникальным   и   не   может   быть
         переопределено.  В качестве выражения может задаваться целое
         число,   строковая    константа,    действительное    число,
         кодированное  действительное  число,  мнемоника  инструкции,
         константное выражение  или  адресное  выражение.  Выражение,
         имеющее  значением  целое  число  в  пределах от 0 до 65535,
         порождает  абсолютное  имя,  вхождения  которого   ассемблер
         замещает   этим  значением.  Для  всех  остальных  выражений
         вхождения имени замещаются текстом.
               Директива EQU иногда используется для создания простых
         макроопределений.  Отметим,  что  замещение имен текстом или
         значением осуществляется до ассемблирования содержащего  имя
         предложения.
               
               Примеры:
               
         k   EQU 1024      ; значение
         pi  EQU 3.14      ; текст
         mat EQU 20*30     ; значение
         adr EQU [BP]      ; текст
         cle EQU XOR AX,AX ; текст
         d   EQU BYTE PTR  ; текст
         t   EQU 'File'    ; текст

               
               
               Директива LABEL имеет следующий формат:
               
         имя LABEL тип
               
               Директива  LABEL  порождает новую переменную или метку
         путем присваивания имени указанного типа и текущего значения
         указателя позиции. Имя должно быть  уникальным  и  не  может
         быть переопределено. В качестве типа может быть задано  одно
         из  следующих  ключевых  слов,  имеющих обычный смысл: BYTE,
         WORD, DWORD, QWORD, TBYTE, NEAR, FAR.
               
               Пример:
               
         barray LABEL BYTE
         warray DW    100 DUP(0)
               
               Эдесь имена barray и warray ссылаются на одну и ту  же
         область памяти.

                                     - 41 -
                                         
               
               
               
               
               
                        8. Директивы управления файлами.
               
               
               Директивы,  описываемые  в  этом  разделе,   позволяют
         управлять  исходным  и  объектным файлами, а также листингом
         ассемблерной программы.  Под управлением понимается указания
         о том, как трактовать элементы входного (исходного) файла  и
         задание  содержимого и объема вывода для выходных (объектный
         файл и листинг) файлов.
               
               
               
               
               
               
               
                       8.1. Управление исходным файлом.

               
               Для управления исходным файлом предназначены директивы
         INCLUDE, .RADIX и COMMENT.
               
               Директива INCLUDE имеет следующий формат:
               
               INCLUDE имя-файла
               
               Содержимого файла с указанным  именем,  трактуемое как
         текст,  вставляется  в  исходный  файл  на  место  директивы
         INCLUDE.  Имя-файла  должно  определять  существующий  файл.
         Имя-файла  может  включать  в  себя  полную  или   частичную
         информацию о пути поиска файла. Если имя-файла  не  содержит
         информацию о местонахождении  файла,  поиск осуществляется в
         в директориях, заданных опцией /I MASM, а если файл  там  не
         будет  найден,  то  -  в  текущем  директории.  Если файл не
         найден, MASM выдает сообщение об ошибке.
               Когда  ассемблер обнаруживает директиву  INCLUDE,   он
         открывает  указанный исходный файл и начинает ассемблировать
         содержащиеся  в  нем  предложения.  После   обработки   всех
         предложений этого файла ассемблер продолжает ассемблирование
         с предложения, непосредственно следующего за INCLUDE.
               Директивы  INCLUDE  могут   быть   вложенными.   Файл,
         подлючаемый   по   этой  директиве,  также  может  содержать
         директивы INCLUDE.
               В  листинге   предложения   из   подключаемых   файлов
         помечаются символом C.
               При   спецификации   путей    поиска    файла    могут
         использоваться  символы   /   или   \ ,   что  введено   для

                                     - 42 -
         
         
         совместимости с XENIX.
               Если  необходимо,  чтобы  местоположение  подключаемых
         файлов задавалось динамически после  формирования  исходного
         файла, следует в директивах  INCLUDE  опустить  спецификацию
         путей  поиска,  и  определять  их  опцией  /I или установкой
         текущего директория.
               
               Примеры:
               
               INCLUDE entry
               INCLUDE b:\include\record
               INCLUDE /include/as/stdio
               INCLUDE local\define.inc
               
               
               Директива .RADIX устанавливает умалчиваемое  основание
         чисел во входном файле и имеет формат:
               
               .RADIX выражение
               
               В качестве выражения задается число в пределах от 2 до
         16, которое определяет, в какой системе счисления трактовать
         числа  при  отсутствии  явного  указания. Могут быть указаны
         следующие значения:
               2  - двоичная
               8  - 8-ричная
               10 - десятичная
               16 - 16-ричная
               Указанное  в   директиве   .RADIX   выражение   всегда
         трактуется  как  десятичное  число  независимо  от  текущего
         умалчиваемого  основания.  По   умолчанию   при   отсутствии
         директивы .RADIX используется десятичная система счисления.
               Директива  .RADIX  не  влияет  на  числа,  указанные в
         директивах DD, DQ и DT. Числа выражений этих директив всегда
         трактуются как десятичные.
               Директива .RADIX не влияет на спецификаторы  основания
         B  и  D,  используемые  при  задании   целых   чисел.   Если
         последним  символом  целого  числа  оказывается  B или D, он
         трактуется как спецификатор  системы  счисления,  а  не  как
         16-ричная  цифра,  даже  если  умалчиваемое  основание - 16.
         Например, число 11B будет восприниматься как двоичное 11, а
         не  как  16-ричное 11B. Для того, чтобы оно трактовалось как
         16-ричное, следует задавать 11Bh.
               
               Примеры:
               
               .RADIX 16
               .RADIX 2
               
               
               Директива COMMENT позволяет указывать ассемблеру,  что
         выделенный участок исходного файла следует рассматривать как
         комментарий. Формат:
               
               COMMENT ограничитель
 
                                     - 43 -
         
         
                  ...
               текст
                  ...
               ограничитель [[текст]]
               
               Текст,  заключенный  между   ограничителями   (которые
         должны  совпадать), считается комментарием и ассемблированию
         не подлежит. В качестве ограничителя берется первый отличный
         от  пробела  символ после ключевого слова COMMENT. Ассемблер
         пропускает весь последующий текст  до  следующего  вхождения
         такого   же   ограничителя.   Текст  комментария  не  должен
         содержать  такого символа. Комментарием считается также весь
         текст, расположенный на  той  же  строке,  что  и  последний
         ограничитель.
               Директива  COMMENT  обычно  используется  при  задании
         комментария, занимающего много строк.

               Пример:
               
               COMMENT *
               Весь текст между звездочками
               считается комментарием *
               
               
               
               
               
               
               
                           8.2. Управление листингом.
               
               
               Описываемые   в   этом   разделе  директивы  позволяют
         управлять  содержимым  и форматом формируемого MASM листинга
         ассемблерной программы.
               Директивы управления  листингом  приведены  в  таблице
         8.1.
               Директива  TITLE  задает заголовок листинга программы,
         который будет печататься в начале каждой страницы  листинга.
         Текст  заголовка может включать в себя до 60 любых символов.
         Каждый модуль  может  содержать  не  более  одной  директивы
         TITLE.  Если  не  использовалась  директива  NAME,  первые 6
         отличных от пробела символов  заданного  в  TITLE  заголовка
         рассматриваются как имя модуля.
               
               Директива  SUBTTL  определяет  подзаголовок  листинга,
         который печатается в  начале  каждой  страницы  листинга  на
         следующей   строке   после   заголовка.   Задаваемый   текст
         представляет собой любую комбинацию символов, из  которой  в
         качестве  подзаголовка  используютя первые 60 символов. Если
         текст опущен,  строка подзаголовка в листинге содержит левый
         пробел.  Программа может содержать любое количество директив
         SUBTTL. Каждая последующая директива замещает предыдущую.
               
               
 
                                     - 44 -
         
         
                Таблица 8.1. Директивы управления листингом.
         _______________________________________________________
         |                     |                               |
         |          формат     |         функция               |
         |_____________________|_______________________________|
         |                     |                               |
         |  TITLE текст        | задание заголовка листинга    |
         |_____________________|_______________________________|
         |                     |                               |
         |  SUBTTL [[текст]]   | задание подзаголовка листинга |
         |_____________________|_______________________________|
         |                     |                               |
         |  PAGE длина,ширина  |      задание параметров       |
         |  PAGE+              |          страницы             |
         |  PAGE               |          листинга             |
         |_____________________|_______________________________|
         |                     |                               |
         |  .LIST              |       печатать листинг        |
         |_____________________|_______________________________|
         |                     |                               |
         |  .XLIST             |      не печатать листинг      |
         |_____________________|_______________________________|
         |                     |                               |
         |  .LALL              |     печатать все исходные     |
         |                     |         предложения           |
         |_____________________|_______________________________|
         |                     |                               |
         |  .SALL              |        подавить печать        |
         |                     |        макрорасширений        |
         |_____________________|_______________________________|
         |                     |                               |
         |  .XALL              | печатать только код и данные  |
         |_____________________|_______________________________|
         |                     |                               |
         |  .SFCOND            |   подавить печать условных    |
         |                     |  блоков с ложными условиями   |
         |_____________________|_______________________________|
         |                     |                               |
         |  .LFCOND            |    печатать условные блоки    |
         |                     |      с ложными условиями      |
         |_____________________|_______________________________|
         |                     |                               |
         |  .TFCOND            | установить умалчиваемый режим |
         |                     |    печати условных блоков     |
         |_____________________|_______________________________|
         |                     |                               |
         |  .CREF              |       печатать листинг        |
         |                     |      перекрестных ссылок      |
         |_____________________|_______________________________|
         |                     |                               |
         |  .XCREF [[имя,...]] |    подавить печать листинга   |
         |                     |      перекрестных ссылок      |
         |_____________________|_______________________________|
               
               
 
                                     - 45 -
         
         
               Директива PAGE позволяет управлять  форматом  страницы
         листинга.
               В первой форме директивы предусмотрены  2  позиционных
         параметра, которые устанавливают  максимальное  число  строк
         страницы  листинга  (длина)  и максимальное число символов в
         строке листинга (ширина). Задаваемая длина должна находиться
         в пределах от 10 до 255 (значение по умолчанию - 50). Ширина
         может варьироваться от 60 до 132 (значение  по  умолчанию  -
         80).  Если длина не указана, ширине, если она задана, должна
         предшествовать запятая.
               Вторая форма директивы PAGE (со  знаком  +)  означает,
         что  номер  секции  программы  должен быть увеличен, а номер
         страницы  устанавливается  равным 1. Номер страницы листинга
         состоит  их  2-х компонент:  номера секции и номера страницы
         внутри секции и имеет следующий вид:
               
         секция-страница
               
         По  умолчанию  нумерация  страниц  листинга  начинается   со
         значения 1-1.
               Третья   форма   директивы   PAGE   (без   аргументов)
         предписывает MASM перейти на новую страницу листинга.
               
               Директива   .XLIST  подавляет  копирование  в  листинг
         последующих строк исходной программы. Следует  помнить,  что
         обработка    MASM    директивы    .XLIST   перекрывает   все
         предшествующие ей директивы управления листингом.
               Директива  .LIST восстанавливает копирование в листинг
         последующих строк исходной программы.
               
               Директива .LALL  сообщает  MASM,  что  листинг  должен
         содержать  все  предложения  макрорасширений, если они есть,
         включая   обычные   комментарии  (с  предшествующей  ;),  но
         исключая макрокомментарии (с предшествующей ;;).
               По директиве .XALL распечатываются только  предложения
         макрорасширений, по которым генерируется программный код или
         данные.  Комментарии  игнорируются.  Этот режим действует по
         умолчанию при отсутствии в исходной программе директив .LALL
         и .SALL.
               Директива .SALL подавляет распечатку макрорасширений.
               
               Директива   .SFCOND   подавляет  распечатку  тел  всех
         последующих условных блоков, условия ассемблирования которых
         окажутся ложными.
               Директива  .LFCOND  восстанавливает  распечатку  таких
         блоков.
               Директива  .TFCOND  устанавливает  умалчиваемый  режим
         распечатки   условных   блоков.  Эта  директива  работает  в
         сочетании с опцией /X MASM. Если опция /X при  запуске  MASM
         не  была  задана, .TFCOND разрешает печать условных блоков с
         ложными условиями. Если же опция  /X  была  задана,  .TFCOND
         подавляет  печать таких блоков. Каждая обработка ассемблером
         директивы .TFCOND меняет режим распечатки условных блоков  с
         ложными условиями на противоположный.
               
 
                                     - 46 -
         
         
               Директива    .XCREF   подавляет   генерацию   листинга
         перекрестных ссылок для меток, переменных  и  имен.  Если  в
         директиве задан список имен, из листинга перекрестных ссылок
         исключаются  только  указанные  объекты,  а  все остальные в
         листинг попадают. Если список содержит более, чем одно  имя,
         его элементы должны отделяться друг от дпуга запятыми.
               Директива  .CREF  восстанавливает  генерацию  листинга
         перекрестных ссылок.

          
               
               
                         8.3. Другие директивы.
               
               
               В языке ассемблере имеются еще  2  директивы,  имеющие
         некоторое  отношение  к  вводу/выводу.  Это директивы %OUT и
         NAME.
               
               Директива %OUT имеет следующий формат:
               
               %OUT текст
               
               При обработке  ассемблером  этой  директивы  указанный
         текст выдается на системный экран. Эта директива полезна при
         отслеживании  прохождения  процесса  ассемблирования   через
         специфичные участки очень большой исходной программы.
               Директива %OUT срабатывает на обоих проходах MASM. Для
         того,  чтобы  сообщение  выдавалось  на   каком-либо   одном
         проходе, можно использовать директивы IF1 и IF2.
               
               Пример:
               
               IF1
                 %OUT First pass
               ENDIF
               
               Сообщение будет выдано только на 1-м проходе.
               
               
               Директива  NAME  позволяет  присваивать  имя  текущему
         модулю и имеет формат:
               
               NAME имя-модуля
               
               Имя модуля используется  программой  LINK  при  выдаче
         диагностических   сообщений.  Имя-модуля  может  быть  любой
         комбинацией букв и  цифр,  из  которой  используются  только
         первые  6  символов.  Имя  должно быть уникальным и не может
         совпадать с ключевым словом.
               При отсутствии в  исходной  программе  директивы  NAME
         ассемблер   создает  умалчиваемое  имя  модуля,  в  качестве
         которого используются первые 6 символов текста,  задаваемого
         директивой  TITLE. Если же и директива TITLE опущена, модулю
         присваивается имя A.

                                     - 47 -
                                         
               
               
               
               
               
                            9. Глобальные объявления.

               
               Директивы  глобального объявления позволяют определять
         метки,  переменные  и  абсолютные  имена,  доступ  к которым
         возможен из всех сегментов программы независимо от того, как
         они ассемблировались.
               В  языке  ассемблера  имеются  2 директивы глобального
         объявления: PUBLIC и EXTRN, которые дополняют друг друга.
               
               Директива PUBLIC имеет следующий формат:
               
               PUBLIC имя,...
               
               Директива PUBLIC делает указанные в списке переменные,
         метки или абсолютные имена,  общими,  т.е.  доступными  всем
         модулям   программы.   Каждый  элемент  списка  должен  быть
         определен в текущем исходном файле. Абсолютные  имена,  если
         они указаны, должны представлять одно- или двухбайтные целые
         числа или строковые значения.
               Обычно  до копирования в объектный файл строчные буквы
         в общих именах преобразуются  в  заглавные.  Для  сохранения
         первоначального  написания имен с учетом регистра могут быть
         использованы опции /ML и /MX MASM.
               Директивой   PUBLIC   должны   быть   описаны   имена,
         используемые  при  работе  с  SYMDEB  в  режиме   символьной
         отладки.
               
               
               Директива EXTRN имеет следующий формат:
               
               EXTRN имя:тип,...
               
               Директива  EXTRN  определяет  внешние  по  отношению к
         текущему  сегменту  объекты  с  указанием  их  типа. Внешним
         объектом может быть переменная, метка или имя, объявленные в
         другом  модуле программы директивой PUBLIC. Тип, указанный в
         директиве EXTRN, должен соответствовать действительныму типу
         объекта  и  может  кодироваться  одним из следующих ключевых
         слов: BYTE, WORD, DWORD, QWORD, TBYTE, NEAR,  FAR  или  ABS.
         Тип  ABS  используется  при  описании  имен,  представляющих
         абсолютные значения. Остальные описатели типа имеют  обычный
         смысл.
               Несмотря  на то, что действительные адреса объектов до
         обработки  объектного  файла  программой  LINK   неизвестны,
         ассемблер,  основываясь на  местонахождении директивы EXTRN,
         может делать предположения  о  том,  какой  сегмент  следует
 

                                     - 48 -
         
         
         использовать  для адресации внешнего объекта. Если директива
         EXTRN находится внутри какого-либо сегмента, считается,  что
         указанные  внешние  объекты  связаны  с  этим  сегментом,  и
         описывающие  их  директивы  PUBLIC  должны   содержаться   в
         сегменте  с  тем  же  именем  и  теми  же  атрибутами.  Если
         директива EXTRN не входит ни в один сегмент, предположений о
         содержащем   внешний   объект   сегменте   не   делается,  и
         соответствующая директива PUBLIC может располагаться в любом
         сегменте.  В обоих случаях для подавления адресации внешнего
         объекта   относительно    умалчиваемого    сегмента    может
         использоваться оператор переключения сегмента (:).
                 
                                     - 49 -
               
               
                    Приложение 1.   Директивы языка ассемблера.
                         
                       
         ________________________________________________________________
         |                            |                                 |
         |       синтаксис            |             функция             |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .186                      |  допустимы инструкции 80186     |
         |                            |  и 8086                         |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .286c                     |  допустимы инструкции 80286     |
         |                            |  и 8086                         |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .286p                     |  допустимы запрещенные инструк- |
         |                            |  ции 80286 и 8086               |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .287                      |  допустимы инструкции 80287     |
         |                            |  и 8087                         |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .8086                     |  допустимы только инструкции    |
         |                            |  8086                           |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .8087                     |  допустимы только инструкции    |
         |                            |  8087                           |
         |____________________________|_________________________________|
         |                            |                                 |
         |  имя=выражение             |  присваивание значения          |
         |                            |  символическому имени           |
         |____________________________|_________________________________|
         |                            |                                 |
         |  ASSUME segreg:segname,... |  описание  содержимого регист-  |
         |                            |  ров сегментов по умолчанию     |
         |____________________________|_________________________________|
         |                            |                                 |
         |  COMMENT ограничитель      |  указанный текст трактуется     |
         |         текст ограничитель |  как комментарий                |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .CREF                     |  формировать файл перекрест-    |
         |                            |  ных ссылок                     |
         |____________________________|_________________________________|
         |                            |                                 |
         |  [имя] DB значение,...     |  распределение и инициализация  |
         |                            |  1 байта памяти                 |
         |____________________________|_________________________________|
 
                                     - 50 -
         
         
         ________________________________________________________________
         |                            |                                 |
         |  [имя] DW значение,...     |  распределение и инициализация  |
         |                            |  2 байтов памяти                |
         |____________________________|_________________________________|
         |                            |                                 |
         |  [имя] DD значение,...     |  распределение и инициализация  |
         |                            |  4 байтов памяти                |
         |____________________________|_________________________________|
         |                            |                                 |
         |  [имя] DQ значение,...     |  распределение и инициализация  |
         |                            |  8 байтов памяти                |
         |____________________________|_________________________________|
         |                            |                                 |
         |  [имя] DT значение,...     |  распределение и инициализация  |
         |                            |  10 байтов памяти               |
         |____________________________|_________________________________|
         |                            |                                 |
         |  ELSE                      |  начало условного альтернатив-  |
         |                            |  ного блока                     |
         |____________________________|_________________________________|
         |                            |                                 |
         |  END [выражение]           |  конец модуля и определение     |
         |                            |  адреса точки входа             |
         |____________________________|_________________________________|
         |                            |                                 |
         |  ENDIF                     |  конец условного блока          |
         |____________________________|_________________________________|
         |                            |                                 |
         |  ENDM                      |  конец макро- или блока повтора |
         |____________________________|_________________________________|
         |                            |                                 |
         |  имя ENDP                  |  конец процедуры                |
         |____________________________|_________________________________|
         |                            |                                 |
         |  имя ENDS                  |  конец сегмента или описания    |
         |                            |  шаблона структуры              |
         |____________________________|_________________________________|
         |                            |                                 |
         |  имя EQU выражение         |  присваивание значения          |
         |                            |  символическому имени           |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .ERR                      |  генерация ошибки               |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .ERR1                     |  генерация ошибки 1-го прохода  |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .ERR2                     |  генерация ошибки 2-го прохода  |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .ERRB <аргумент>          |  генерация ошибки, если аргу-   |
         |                            |  мент является пробелом         |
         |____________________________|_________________________________|
 
                                     - 51 -
         
         
         ________________________________________________________________
         |                            |                                 |
         |  .ERRDEF имя               |  генерация ошибки, если имя     |
         |                            |  было ранее определено как      |
         |                            |  метка, переменная или символ   |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .ERRDIF <строка1>,        |  генерация ошибки, если строки  |
         |          <строка2>         |  различны                       |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .ERRE выражение           |  генерация ошибки, если выраже- |
         |                            |  ние ложно (нуль)               |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .ERRIDN <строка1>,        |  генерация ошибки, если строки  |
         |          <строка2>         |  идентичны                      |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .ERRNB <аргумент>         |  генерация ошибки, если аргу-   |
         |                            |  мент не является пробелом      |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .ERRNDEF имя              |  генерация ошибки, если имя     |
         |                            |  еще не было определено         |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .ERRNZ выражение          |  генерация ошибки, если выраже- |
         |                            |  ние истинно (не нуль)          |
         |____________________________|_________________________________|
         |                            |                                 |
         |  EVEN                      |  установка указателя позиции на |
         |                            |  четный адрес                   |
         |____________________________|_________________________________|
         |                            |                                 |
         |  EXITM                     |  выход из текущего макроопреде- |
         |                            |  ления или блока повторения     |
         |____________________________|_________________________________|
         |                            |                                 |
         |  EXTRN имя:тип,...         |  определение внешних перемен-   |
         |                            |  ных, меток или символов        |
         |____________________________|_________________________________|
         |                            |                                 |
         | имя GROUP имя сегмента,... |  определение имени группы       |
         |                            |  сегментов                      |
         |____________________________|_________________________________|
         |                            |                                 |
         |  IF выражение              |  ассемблировать, если           |
         |                            |  выражение истинно (не нуль)    |
         |____________________________|_________________________________|
         |                            |                                 |
         |  IF1                       |  ассемблировать только на       |
         |                            |  1-м проходе                    |
         |____________________________|_________________________________|
         
 
                                     - 52 -
         
         
         ________________________________________________________________
         |                            |                                 |
         |  IF2                       |  ассемблировать только на       |
         |                            |  2-м проходе                    |
         |____________________________|_________________________________|
         |                            |                                 |
         |  IFB <аргумент>            |  ассемблировать, если аргумент  |
         |                            |  является пробелом              |
         |____________________________|_________________________________|
         |                            |                                 |
         |  IFDEF имя                 |  ассемблировать, если имя было  |
         |                            |  ранее определено как метка,    |
         |                            |  переменная или символ          |
         |____________________________|_________________________________|
         |                            |                                 |
         |  IFDIF <аргумент1>,        |  ассемблировать, если аргумен-  |
         |        <аргумент2>         |  ты различны                    |
         |____________________________|_________________________________|
         |                            |                                 |
         |  IFE выражение             |  ассемблировать, если выражение |
         |                            |  ложно (нуль)                   |
         |____________________________|_________________________________|
         |                            |                                 |
         |  IFIDN <аргумент1>,        |  ассемблировать, если аргумен-  |
         |        <аргумент2>         |  ты идентичны                   |
         |____________________________|_________________________________|
         |                            |                                 |
         |  IFNB <аргумент>           |  ассемблировать, если аргумент  |
         |                            |  не является пробелом           |
         |____________________________|_________________________________|
         |                            |                                 |
         |  IFNDEF имя                |  ассемблировать, если имя еще   |
         |                            |  не было определено             |
         |____________________________|_________________________________|
         |                            |                                 |
         |  INCLUDE имя файла         |  включить текст из файла        |
         |____________________________|_________________________________|
         |                            |                                 |
         |  IRP фиктивное имя,        |  блок повторения: фиктивное имя |
         |      <параметр,...>        |  последовательно принимает зна- |
         |                            |  чения параметров               |
         |____________________________|_________________________________|
         |                            |                                 |
         |  IRC фиктивное имя,        |  блок повторения: фиктивное имя |
         |      <параметр,...>        |  последовательно принимает зна- |
         |                            |  чения символьных параметров    |
         |____________________________|_________________________________|
         |                            |                                 |
         |  имя LABEL тип             |  создать в текущей позиции      |
         |                            |  новую переменную или метку     |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .LALL                     |  печатать макрорасширения       |
         |____________________________|_________________________________|
         
 
                                     - 53 -
         
         
         
         ________________________________________________________________
         |                            |                                 |
         |  .LFCOND                   |  восстановить листинг           |
         |                            |  условных блоков                |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .LIST                     |  восстановить листинг           |
         |                            |  предложений программы          |
         |____________________________|_________________________________|
         |                            |                                 |
         |  LOCAL фиктивное имя,...   |  объявление фиктивных имен в    |
         |                            |  макро для размещения позже со- |
         |                            |  здаваемых реальных имен        |
         |____________________________|_________________________________|
         |                            |                                 |
         |  имя MACRO формальный-     |  начало макроопределения с      |
         |            параметр,...    |  формальными параметрами        |
         |____________________________|_________________________________|
         |                            |                                 |
         |  NAME имя модуля           |  изменить имя текущего модуля   |
         |____________________________|_________________________________|
         |                            |                                 |
         |  PURGE имя макро,...       |  удалить указанные макро        |
         |____________________________|_________________________________|
         |                            |                                 |
         |  ORG выражение             |  установить указатель позиции   |
         |____________________________|_________________________________|
         |                            |                                 |
         |  %OUT текст                |  выдать текст на терминал       |
         |____________________________|_________________________________|
         |                            |                                 |
         |  имя PROC тип              |  начало процедуры               |
         |____________________________|_________________________________|
         |                            |                                 |
         |  PAGE длина,ширина         |  установить число строк и число |
         |                            |  символов в строке листинга     |
         |____________________________|_________________________________|
         |                            |                                 |
         |  PAGE+                     |  переход на новую секцию        |
         |                            |  листинга                       |
         |____________________________|_________________________________|
         |                            |                                 |
         |  PAGE                      |  переход на новую страницу      |
         |                            |  листинга                       |
         |____________________________|_________________________________|
         |                            |                                 |
         |  PUBLIC имя,...            |  описание общих переменных,     |
         |                            |  меток и абсолютных имен        |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .RADIX выражение          |  установить умалчиваемое        |
         |                            |  основание чисел                |
         |____________________________|_________________________________|
 
                                     - 54 -
         
         
         ________________________________________________________________
         |                            |                                 |
         |  имя записи RECORD         |  описание шаблона записи для 8- |
         |  имя поля:ширина           |  или 16-битовых записей, содер- |
         |  [=выражение],...          |  жащих одно или более полей     |
         |____________________________|_________________________________|
         |                            |                                 |
         |  REPT выражение            |  начало блока, повторяющегося   |
         |                            |  указанное число раз            |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .SALL                     |  подавить вывод макрорасширений |
         |____________________________|_________________________________|
         |                            |                                 |
         | имя SEGMENT [выравнивание] |  начало сегмента с указанными   |  
         |  [комбинация] ['класс']    |  атрибутами                     |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .SFCOND                   |  подавить вывод условных блоков |
         |                            |  с ложными (нулевыми) условиями |
         |____________________________|_________________________________|
         |                            |                                 |
         |  имя STRUC                 |  начало шаблона структуры       |
         |____________________________|_________________________________|
         |                            |                                 |
         |  SUBTTL [текст]            | установить подзаголовок листинга|
         |____________________________|_________________________________|
         |                            |                                 |
         |  .TFCOND                   |  установить умалчиваемый режим  |
         |                            |  печати условных блоков         |
         |____________________________|_________________________________|
         |                            |                                 |
         |  TITLE текст               |  установить заголовок листинга  |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .XALL                     |  выводить только те предложения |
         |                            |  в макро, по которым гененриру- |
         |                            |  ется код или данные            |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .XCREF [имя,...]          |  подавить листинг таблицы       |
         |                            |  перекрестных ссылок            |
         |____________________________|_________________________________|
         |                            |                                 |
         |  .XLIST                    |  подавить листинг исходного     |
         |                            |  файла                          |
         |____________________________|_________________________________|
                   
                     ПРИДНЕПРОВСКИЙ ФИЛИАЛ
             СОВЕТСКО-БОЛГАРО-ФИНСКОГО ПРЕДПРИЯТИЯ
                "Новые информационные технологии"



               
               
               







                         СИСТЕМА  ПРОГРАММИРОВАНИЯ 
                      
                         НА МАКРОАССЕМБЛЕРЕ MS-DOS






                           Справочное руководство




                  Часть 4. Инструкции процессоров 8086/8088
                     

                          (редакция 1, март 1989)
                   
                   
                   
                   
                   
                   
                   

                   
               
               
                   
                   
                   
                   
                   
                   
                   
                   
                          Днепропетровск 1989г.
                                        
                                         
                                     -  2 -
                                     
                                     
                                     
                                     
                                     
                





               
               
               
               
               
               
           Ф А Й Л О В А Я   С Т Р У К Т У Р А  Д О К У М Е Н Т А :
               
               
         - Файл  A4P0.DOC  содержит  титульный лист
                            и содержание.
               
         - Файл  A4P1.DOC  содержит Главу 1:
                           Введение.
               
         - Файл  A4P2.DOC  содержит Главу 2:
                           Инструкции пересылки данных.
         
         - Файл  A4P3.DOC  содержит Главу 3:
                           Арифметические инструкции.
         
         - Файл  A4P4.DOC  содержит Главу 4:
                           Инструкции обработки бит.
         
         - Файл  A4P5.DOC  содержит Главу 5:
                           Инструкции обработки строк.
         
         - Файл  A4P6.DOC  содержит Главу 6:
                           Инструкции передачи управления.
         
         - Файл  A4P7.DOC  содержит Главу 7:
                           Инструкции управления процессором.
         
         - Файл  A4A1.PRI  содержит Приложение 1:
                           Инструкции процессоров 8086/8088.
 
                                         
                                     -  3 -
                             
                                                           
               
                                   Содержание


         1. Введение............................................... 4
         2. Инструкции пересылки данных............................ 7
         2.1. Инструкции общего назначения......................... 7
         2.2. Ввод/вывод........................................... 8
         2.3. Адресные операции.................................... 9
         2.4. Операции с флагами...................................10
         3. Арифметические инструкции..............................12
         3.1. Форматы арифметических данных........................12
         3.2. Арифметические операции и флаги......................13
         3.3. Сложение.............................................15
         3.4. Вычитание............................................16
         3.5. Умножение............................................17
         3.6. Деление..............................................18
         4. Инструкции обработки бит...............................21
         4.1. Логические инструкции................................21
         4.2. Сдвиги...............................................22
         4.3. Вращения.............................................24
         5. Инструкции обработки строк.............................25
         5.1. Общие положения......................................25
         5.2. Пересылка строк......................................27
         5.3. Сравнение строк......................................29
         5.4. Сканирование.........................................29
         6. Инструкции передачи управления.........................31
         6.1. Безусловный переход..................................31
         6.2. Условный переход.....................................34
         6.3. Итерации.............................................36
         6.4. Прерывания...........................................37
         7. Инструкции управления процессором......................39
         7.1. Операции с флагами...................................39
         7.2. Внешняя синхронизация................................40
         7.3. Пустая операция......................................41
               
            Приложение 1. Инструкции процессоров 8086/8088.........42
                                  
                                     -  4 -
               
               
               
               
               
                                 1. Введение.

               
               Настоящее  руководство  содержит  описание  инструкций
         процессоров   8086   и  8088.  Набор  инструкций  процессора
         представляет   собой   самый   нижний   (машинный)   уровень
         программного  обеспечения  компьютера.  Программирование  на
         этом  уровне представляет из себя весьма непростую задачу по
         той причине,  что  выполняемые  каждой  инструкцией  функции
         довольно  просты,  и  поэтому  любая  сколько-нибудь сложная
         программа включает в себя большое  количество  инструкций  и
         обычно  теряет  наглядность.  Кроме того, программист обязан
         знать  многие  архитектурные  и  функциональные  особенности
         компьютера,    о    которых   он   может   не   думать   при
         программировании  на  языках  высокого  уровня.   С   другой
         стороны,  только  набор  машинных  инструкций  предоставляет
         программисту все возможности компьютера.
               Инструкции  процессора  доступны   пользователю  через
         программу MASM.
               Процессоры  8086  и 8088 выполняют один и тот же набор
         инструкций.  Этот  набор   включает   в   себя   эквиваленты
         инструкций    более   ранних   микропроцессоров   8080/8085.
         Существенно новым является следующее:
               1. Умножение и деление знаковых и беззнаковых двоичных
         чисел,   а   также   десятичных   чисел   в   упакованном  и
         неупакованном форматах.
               2.  Операции  перемещения,  сканирования  и  сравнения
         строк длиной до 64К.
               3. Тестирование битов без их изменения.
               4.  Перевод содержимого байтов из одного кода в другой
         (трансляция).
               5. Программно-генерируемые прерывания.
               6. Группа инструкций, которые могут оказывать  влияние
         на работу систем микропроцессора.
               
               Инструкции    процессора   в   унифицированной   форме
         обрабатывают  различные   типы   операндов.   Почти   каждая
         инструкция  может  оперировать с байтом или словом на выбор.
         Регистры, переменные  памяти  (поля  пямяти,  представленные
         адресами)  и  непосредственные операнды могут кодироваться в
         большинстве  инструкций  без  ограничений,  за  исключением,
         разумеется,  того,  что  непосредственный операнд может быть
         только источником, но не приемником. В частности, переменные
         памяти  могут  участвовать  в операциях сложения, вычитания,
         сдвига, сравнения и других без предварительного помещения их
         в  регистры,  что  экономит  инструкции,  регистры  и  время
         выполнения  ассемблерной  программы.  Для  языков   высокого
         уровня,  где  большинство  переменных  размещено  в  памяти,
 
                                     -  5 -
         
         
         компиляторы могут  генерировать  более  быстродействуюший  и
         меньший по объему объектный код.
               Набор    инструкций    процессоров   8086/8088   можно
         рассматривать как состоящий  из  2-х  уровней:  ассемблерный
         уровень  и машинный уровень. Ассемблерный уровень включает в
         себя около 100 инструкций. Например, только  инструкция  MOV
         способна  пересылать  содержимое  регистра или ячейки памяти
         или непосредственное значение в регистр или  ячейку  памяти.
         Процессор   распознает   28  различных  инструкций  для  MOV
         (пересылка   байта   из   регистра   в   память,   пересылка
         непосредственно  представленного  слова  в  регистр и т.д.).
         Ассемблер транслирует  написанные  программистом  инструкции
         ассемблерного  уровня в инструкции машинного уровня, которые
         непосредственно  выполняются  процессором  8086  или   8088.
         Компиляторы  языков  высокого уровня транслируют предложения
         своего языка также в инструкции машинного уровня.
               Наличие   2-х   уровней   инструкций   направлено   на
         удовлетворение  2-х  различных   требований:   эффективности
         программы  и  относительной простоты программирования. Набор
         инструкций  машинного  уровня  (их  около   300)   позволяет
         эффективно    использовать    память.   Например,   машинная
         инструкция, предназначенная для  увеличения  на  1  операнда
         памяти,  занимает 3-4 байта, т.к. она должна содержать адрес
         операнда. Для наращивания регистра эта информация не  нужна,
         и   инструкция   может  быть  короче.  Фактически  процессор
         8086/8088   имеет   8   различных   инструкций   наращивания
         16-битового   регистра,   занимающих   по   1   байту.  Если
         программист   будет   использовать   одну   инструкцию   для
         наращивания  регистра,  другую - для операнда памяти, выгода
         от компактных инструкций будет  сведена  на  нет  сложностью
         программирования.  Инструкции  ассемблерного  уровня с точки
         зрения программиста проще. Программист кодирует  одну  форму
         инструкции  INC,  а ассемблер проверяет ее операнд и решает,
         какую генерировать машинную инструкцию.
               Настоящее  руководство  содержит   описание   способов
         кодирования,   алгоритмов  работы  и  воздействия  на  флаги
         процессора  инструкций  ассемблерного  уровня.   Весь  набор
         инструкций  разделен на 6 групп по функциональному признаку.
         Эти группы инструкций описаны в главах 2-7.
               Глава 2 содержит описание инструкций пересылки данных,
         позволяющий выполнять перемещения данных всех  типов,  кроме
         память-память.
               Глава 3 посвящена арифметическим инструкциям.
               В главе 4 приведены описания инструкций обработки бит,
         позволяющих оперировать с данными на  уровне  бит.  Сюда  же
         включены инструкции сравнения.
               Глава  5 содержит описание инструкций обработки строк,
         предназначенных  для  выполнения  операций  (в   том   числе
         сравнения) типа память-память.
               Глава  6  описывает  инструкции  передачи  управления,
         позволяющие организовывать в программе циклы и ветвления.
               Глава 7 посвящена инструкциям управления процессором.
               Общая    сводка   инструкций   процессоров   8086/8088
         приведена в Приложении 1.
               При  программировании на языке ассемблера пользователю
 
                                     -  6 -
         
         
         постоянно приходится  иметь  дело  с  регистрами  и  флагами
         процессора.  Набор регистров и флагов процессора 8088 описан
         в "Система программирования на макроассемблере MS-DOS. Часть
         2.  Введение  в  язык  ассемблера",  п.3  и  Приложение 2. В
         настоящем  руководстве  использованы  такие  же  обозначения
         регистров и флагов.
               При    описании    форматов   кодирования   инструкций
         предполагается,  что  текст,  состоящий  из  букв   русского
         алфавита  на регистре строчных букв, разделенных символом -,
         обозначает нетерминальные элементы и при кодировании  должен
         замещаться  требуемыми по смыслу конструкциями. Терминальные
         элементы обозначены  латинскими буквами заглавного  регистра
         и знаками препинания.
               Во избежании перегрузки текста излишними подробностями
         в   настоящем   документе   не  приводится  точных  форматов
         кодирования  операндов  инструкций.  Большинство  инструкций
         допускает  довольно  широкий  спектр  операндов  как с точки
         зрения синтаксиса, так и с точки зрения семантики.  В  общем
         случае  каждый  операнд инструкции трактуется как выражение.
         Типы, синтаксис и структура  выражений  подробно  описаны  в
         "Система  программирования  на макроассемблере MS-DOS. Часть
         2. Введение в язык ассемблера", п.4. В  настоящем  документе
         приводятся лишь ограничения на общий вид выражения.
               
                                     -  7 -
               
               
               
               
               
                        2. Инструкции пересылки данных.
               
               
               14  инструкций  этого  типа   обеспечивают   пересылку
         одиночных  байтов и слов между памятью и регистрами, а также
         между портами ввода/вывода и регистрами AL  или  AX.  В  эту
         группу  включены  также  инструкции  манипуляции со стеком и
         инструкции пересылки флагов процессора и загрузки  регистров
         сегмента.
               Все   инструкции   пересылки   данных   можно  условно
         разделить на 4 группы:
               1. Общего назначения:
                    MOV   - пересылка байта или слова
                    PUSH  - сохранение слова в стеке
                    POP   - восстановление слова из стека
                    XCLHG - обмен байтами или словами
                    XLAT  - трансляция байта
               2. Ввода/вывода:
                    IN    - ввод байта или слова из порта
                    OUT   - вывод байта или слова в порт
               3. Адресные операции:
                    LEA   - загрузка исполнительного адреса
                    LDS   - загрузка указателя с использованием DS
                    LES   - загрузка указателя с использованием ES
               4. Пересылка флагов:
                    LAHF  - загрузка флагов в AH
                    SAHF  - установка флагов из AH
                    PUSHF - сохранение флагов в стеке
                    POPF  - восстановление флагов из стека
               
               Все инструкции пересылки данных, кроме  POPF  и  SAHF,
         значений флагов процессора не изменяют.
               Подробнее эти инструкции описаны в разделах 2.1-2.4.
               
               
               
               
               
                      2.1. Инструкции общего назначения.
               
               
               
         MOV приемник,источник         ПЕРЕСЫЛКА БАЙТА ИЛИ СЛОВА
         ---------------------
               Байт или слово пересылается из источника в приемник.
               
               
               
 
                                     -  8 -
         
         
         PUSH источник                 СОХРАНЕНИЕ СЛОВА В СТЕКЕ
         -------------
               Указатель стека (регистр SP) уменьшается  на  2,  и  в
         вершину  стека  помещается  слово  из  источника. Часто PUSH
         используется для занесения в стек параметров процедуры перед
         ее  вызовом.  В  общем  случае  это  основное  средство  для
         сохранения временных данных.
               
               
               
         POP приемник                  ВОССТАНОВЛЕНИЕ СЛОВА ИЗ СТЕКА
         ------------
               Слово данных  из  текущей  вершины  стека,  адресуемой
         регистром  SP,  пересылается в операнд приемник.  Регистр SP
         затем увеличивается на 2 и указывает на новую вершину стека.
         POP   может   использоваться  для  восстановления  из  стека
         временных данных.
               
               
               
         XCLHG приемник,источник       ОБМЕН БАЙТАМИ ИЛИ СЛОВАМИ
         -----------------------
               Эта инструкция осуществляет обмен содержимым (байт или
         слово)   между   операндами   источник   и   приемник.   При
         использовании в  сочетании  с  префиксом  LOCK  XCLHG  может
         проверять  и  устанавливать  семафор, управляющий доступом к
         разделяемому несколькими процессорами ресурсу.
               
               
               
         XLAT таблица-трансляции       ТРАНСЛЯЦИЯ БАЙТА
         -----------------------
               Байт в регистре  AL  замещается  байтом  из  созданной
         пользователем      256-байтной      таблицы      трансляции.
         Предполагается, что регистр BX содержит  адрес  начала  этой
         таблицы.  Содержимое  AL используется как индекс в таблице и
         замещается  байтом,  выбираемом  из  таблицы  со  смещением,
         соответствующим  двоичному  содержимому  регистра AL (первый
         байт  таблицы  имеет  смещение  0).  Инструкция  XLAT  может
         использоваться для трансляции  символов  из  одного  кода  в
         другой.
               
               
               
               
               
                    
                             2.2. Ввод/вывод.
               
               
               
         IN аккумулятор,порт           ВВОД БАЙТА ИЛИ СЛОВА ИЗ ПОРТА
         -------------------
               Байт   или  слово,  полученные  из  указанного  порта,
         помещается в регистр AL или AX соответственно.  Номер  порта
 
                                     -  9 -
         
         
         может задаваться либо непосредственно числом в пределах от 0
         до 255, обеспечивающим доступ только  к  этим  портам,  либо
         указанием  регистра  DX,  который предварительно должен быть
         загружен требуемым  значением,  что  обеспечивает  доступ  к
         портам с номерами от 0 до 65535.
               
               
               
               
         OUT порт,аккумулятор          ВЫВОД БАЙТА ИЛИ СЛОВА В ПОРТ
         --------------------
               Байт или слово, предварительно помещенные в регистр AL
         или AX соответственно, выводится  в  указанный  порт.  Номер
         порта   может   задаваться  либо  непосредственно  числом  в
         пределах от 0 до 255, обеспечивающим  доступ  только  к этим
         портам,  либо  указанием регистра DX, который предварительно
         должен быть загружен требуемым значением,  что  обеспечивает
         доступ к портам с номерами от 0 до 65535.
               
               
               
               
               
               
               
                           2.3. Адресные операции.
               
               
               Адресные   операции   работают  не  с  содержимым  или
         значением переменных, а с их адресами. Они наиболее  полезны
         при обработке списков, базированных переменных и в операциях
         со строками.
               
               
               
         LEA приемник,источник        ЗАГРУЗКА ИСПОЛНИТЕЛЬНОГО АДРЕСА
         ---------------------
               Смещение  операнда  источник  помещается   в   операнд
         приемник.  Источник должен быть операндом памяти, а приемник
         -  16-битовым регистром. Эта инструкция может использоваться
         для  установки   регистров  перед  XLAT  или  операциями  со
         строками,  которые  предполагают,  что  некоторые   регистры
         загружены адресными значениями.
               
               
               
         LDS приемник,источник         ЗАГРУЗКА УКАЗАТЕЛЯ С DS
         ---------------------
               Указатель  представляет  собой   32-битовую   адресную
         переменную, первое слово которой содержит смещение, а второе
         - базовый адрес (сегмент). Адрес указателя в этой инструкции
         задается  операндом  источник, который должен быть операндом
         памяти. Слово смещения из  указателя  помещается  в  операнд
         приемник,  в  качестве которого может быть указан 16-битовый
         регистр. Слово сегмента из указателя  помещается  в  регистр
 
                                     - 10 -
         
         
         DS.  Указание  SI  в  качестве  приемника  является  обычным
         способом подготовки для строковой операции строки-источника,
         расположенной вне текущего сегмента данных. 
               
               
               
               
         LES приемник,источник         ЗАГРУЗКА УКАЗАТЕЛЯ С ES
         ---------------------
               Указатель  представляет  собой   32-битовую   адресную
         переменную, первое слово которой содержит смещение, а второе
         - базовый адрес (сегмент). Адрес указателя в этой инструкции
         задается  операндом  источник, который должен быть операндом
         памяти. Слово смещения из  указателя  помещается  в  операнд
         приемник,  в  качестве которого может быть указан 16-битовый
         регистр. Слово сегмента из указателя  помещается  в  регистр
         ES.  Указание  DI  в  качестве  приемника  является  обычным
         способом подготовки для строковой операции строки-приемника,
         расположенной вне текущего экстра сегмента.
               
               
               
               
               
               
               
                          2.4. Операции с флагами.
               
               
               
         LAHF                          ЗАГРУЗКА ФЛАГОВ В AH
         ----
               Флаги SF, ZF, AF, PF и CF, являющиеся аналогами флагов
         процессоров 8080/8085, копируются в биты 7,  6,  4,  2  и  0
         соответственно регистра AH. Биты 5, 3 и 1 неопределены. Сами
         флаги не изменяются. Эта инструкция обеспечивает возможность
         выполнения   на  8086  или  8088  программ,  написанных  для
         процессоров 8080/8085.
               
               
               
         SAHF                          УСТАНОВКА ФЛАГОВ ИЗ AH
         ----
               Биты 7, 6, 4, 2 и  0  регистра  AH  замещают  значения
         флагов  SF,  ZF, AF, PF и CF соответственно. Значения флагов
         OF, DF, IF и TF не изменяются. Эта  инструкция  введена  для
         совместимости с процессорами 8080/8085.
               
               
               
         PUSHF                         СОХРАНЕНИЕ ФЛАГОВ В СТЕКЕ
         -----
               По  этой  инструкции указатель стека SP уменьшается на
         2,  и  в  вершину  стека  помещаются  все  флаги  процессора
         8086/8088   в  формате  слова  согласно  их  расположению  в
 
                                     - 11 -
         
         
         регистре флагов. Сами флаги не изменяются.
               
               
               
         POPF                          ВОССТАНОВЛЕНИЕ ФЛАГОВ ИЗ СТЕКА
         ----
               Из вершины стека, адресуемой регистром SP,  в  регистр
         флагов процессора  8086/8088  помещаются  специфичные  биты,
         соответствующие расположению флагов в регистре флагов. После
         этого SP увеличивается на 2 и  указывает  на  новую  вершину
         стека.   Комбинации   инструкций   PUSHF  и  POPF  позволяют
         процедуре сохранять и  восстанавливать  флаги  вызвавшей  ее
         программы.  Кроме  того,  таким  образом можно устанавливать
         значение флага TF (ловушка), т.к. специальной инструкции для
         этого  нет.  Для  этого следует  сохранить  флаги  в  стеке,
         изменить  значение  бита  8  и  затем  восстановить флаги из
         стека.
                                     
                                     - 12 -
               
               
               
               
               
                        3. Арифметические инструкции.
               
               
               
               
                    3.1. Форматы арифметических данных.

               
               Арифметические  операции  процессоров  8086/8088 могут
         выполняться над операндами 4-х типов (таблица 3.1):
               1. Двоичные без знака.
               2. Двоичные со знаком (целые).
               3. Упакованные десятичные без знака.
               4. Распакованные десятичные без знака.
               
               
                 Таблица 3.1. Арифметическая интерпретация
                              8-битовых чисел.
         ____________________________________________________________
         |           |         |         |        |         |       |
         | 16-ричное | битовое | дв. без | дв. со | распак. | упак. |
         |           |         |  знака  | знаком | десятич.| десят.|
         |___________|_________|_________|________|_________|_______|
         |           |         |         |        |         |       |
         |    07     | 00000111|    7    |   +7   |    7    |   7   |
         |    89     | 10001001|   137   |  -119  | некорр. |   89  |
         |    C5     | 11000101|   197   |   -59  | некорр. | некор.|
         |___________|_________|_________|________|_________|_______|
         
               
               Двоичные  числа  могут  занимать  1   или   2   байта.
         Десятичные  числа хранятся побайтно по 2 десятичной цифре на
         байт для упакованного формата или по 1 десятичной  цифре  на
         байт для распакованного формата. Процессор предполагает, что
         определенные  в арифметических инструкциях операнды содержат
         данные,  представляющие  корректные  для  данной  инструкции
         числа.  Некорректные данные могут привести к непредсказуемым
         результатам.
               Двоичные числа без знака могут занимать 8 или 16  бит;
         все  биты значимы. Диапазон значений 8-битового числа - от 0
         до 255, 16-битового - от 0 до 65535. Над  двоичными  числами
         без  знака  можно  выполнять  операции  сложения, вычитания,
         умножения и деления.
               Двоичные числа со знаком (целые) могут занимать  также
         8 или 16 бит. Значение старшего бита  (самого левого) задает
         знак   числа   :  0  -  положительное,  1  -  отрицательное.
         Отрицательные числа представляются  стандартным  дополнением
         до  2.  Поскольку один разряд  отведен  под  знак,  диапазон
 
                                     - 13 -
         
         
         изменения 8-битового числа - от  -127 до +127, 16-битового -
         от  -32768  до +32767. Число 0 имеет положительный знак. Над
         двоичными числами со знаком могут  быть  выполнены  операции
         умножения  и  деления.  Сложение и вычитание выполняются без
         учета знака. Для обнаружения переноса в  знаковый  разряд  в
         результате    беззнаковой    операции   можно   использовать
         инструкции условного перехода (п.6.2) или INTO (п.6.4).
               Упакованные десятичные числа хранятся как  беззнаковые
         байтовые  величины. Каждый байт содержит 2 десятичные цифры,
         занимающие по 4 бита каждая. Цифра в старшем полубайте более
         значима.  В  каждом  полубайте  допустимы  только  16-ричные
         значения  от  0  до  9;  соответственно  пределы   изменения
         десятичного  числа  - от 0 до 99. Сложение и вычитание таких
         чисел выполняются в 2 стадии.  Сначала  применяется  обычная
         беззнаковая   двоичная   инструкция,   которая  формирует  в
         регистре  AL  промежуточный  результат.  Затем   выполняется
         операция  настройки  (инструкция DAA или DAS), преобразующая
         содержимое AL в корректный упакованный десятичный результат.
         Умножение и деление упакованных десятичных чисел невозможно.
               Распакованные    десятичные    числа    хранятся   как
         беззнаковые    байтовые    величины.    Десятичная     цифра
         располагается    в    младшем    полубайте.    Допустимы   и
         интерпретируются как десятичные числа 16-ричные значения  от
         0  до 9. Для выполнения операций умножения и деления старший
         полубайт  должен  быть  заполнен  нулями;  для  сложения   и
         вычитания  он может содержать любое значение. Арифметические
         операции над распакованными десятичными числами  выполняются
         в   2   стадии.  Сначала  используются  обычные  беззнаковые
         инструкции  сложения,  вычитания  или   умножения,   которые
         формируют  в  регистре  AL  промежуточный  результат.  Затем
         выполняется операция настройки (инструкция AAA,AAS или AAM),
         преобразующая  содержимое  AL  в  результирующее  корректное
         распакованное    десятичное   число.   Деление   выполняется
         аналогично,  за  исключением  того,  что   сначала   следует
         настроить числитель в AL (инструкция AAD), а затем выполнить 
         инструкцию  беззнакового  двоичного   деления,   результатом
         которого будет корректное распакованное десятичное число.
               Формат    десятичных   распакованных   чисел   подобен
         представлению десятичных цифр в коде  ASCII.  При  этом  для
         числа  в  коде  ASCII  старший  полубайт  содержит 16-ричное
         значение 3.  Возможное  содержимое  старшего  полубайта  для
         распакованного  формата  приведено  выше.  Преобразование из
         одного вида в другой сложности не представляет.
               
               
               
               
               
               
                    3.2. Арифметические операции и флаги.

               
               Арифметические   инструкции   процессоров    8086/8088
         оставляют  после своего выполнения  некоторые характеристики
         результатов операций в виде значений 6  флагов.  Большинство
 
                                     - 14 -
         
         
         из   них  могут  анализироваться  последующими  инструкциями
         условного  перехода (п.6.2);   может  также   использоваться
         инструкция  прерывания по переполнению INTO (п.6.4). Влияние
         каждой инструкции на флаги указано при описании  инструкции.
         Однако имеются следующие общие правила:
               1.  Флаг  переноса  CF  устанавливается  в  1,  если в
         результате  операции  сложения  был перенос из старшего бита
         или  в  результате операции вычитания был заем в старший бит
         результата.  Если  же  переноса  или  заема  не   было,   CF
         устанавливается   в   0.   Заметим,   что  знаковый  перенос
         характеризуется различными значениями флагов CF и  OF.  Флаг
         CF   может   использоваться   для  обнаружения  беззнакового
         переполнения.  Следует  помнить,  что  2   инструкции,   ADC
         (сложение  с переносом) и SBB (вычитание с заемом) вовлекают
         CF в свои операции и могут быть поэтому   использованы   для
         мультибайтного (32-, 64-разрядного) сложения и вычитания.
               2. Флаг промежуточного переноса AF устанавливается в 1
         при переносе  из  младшего  полубайта  результата  во  время
         сложения  или  при  заеме  в  младший полубайт результата во
         время вычитания. Если же переноса  или  заема  не  было,  AF
         устанавливается  в  0.  Флаг  AF   введен   для   выполнения
         десятичной   настройки   и   обычно   в   других   целях  не
         используется.
               3. Флаг знака  SF  устанавливается  арифметическими  и
         логическими  инструкциями  равным  старшему (7-му или 15-му)
         биту результата. Для двоичных чисел со знаком SF будет равен
         0  в  случае  положительного  результата  и  1  -  в  случае
         отрицательного (если нет переполнения).  Значение  флага  SF
         может    анализироваться    после   сложения  или  вычитания
         инструкциями  условного  перехода.  Программы,   выполняющие
         беззнаковые операции, обычно игнорируют SF, т.к. старший бит
         результата  в  этом  случае  интерпретируется  как  двоичная
         цифра, а не как знак.
               4.  Флаг  нуля  ZF устанавливается в 1, если результат
         арифметической  или   логической   операции   равен   0,   и
         устанавливается  в  0, если результат отличен от 0. Значение
         флага может анализироваться инструкциями условного перехода.
               5. Флаг паритета PF устанавливается в 1, если  младшие
         8  бит  результата  арифметической  или  логической операции
         содержат четное число единиц, и устанавливается  в  0,  если
         число  единиц  нечетно.  Флаг  PF введен для совместимости с
         процессорами 8080/8085; он может  также  использоваться  для
         контроля символов в коде ASCII на корректность паритета.
               6.  Флаг  переполнения  OF  устанавливается  в 1, если
         результат слишком велик для положительного числа или слишком
         мал  для  отрицательного  и не помещается в операнд-приемник
         (не считая знаковый разряд). В противном случа значение OF -
         0.  Состояние  этого  флага отражает наличие арифметического
         переполнения   со   знаком.   Он    может    анализироваться
         инструкциями условного перехода (п.6.2) или инструкцией INTO
         (п.6.4). В беззнаковых операциях OF обычно игнорируется.
               
               
               
               
 
                                     - 15 -
         
         
               
               
                               3.3. Сложение.
               
               
               
               
         ADD приемник,источник         СЛОЖЕНИЕ БАЙТОВ ИЛИ СЛОВ
         ---------------------
               Арифметическая сумма  2-х  операндов,  которыми  могут
         быть   байты   или  слова,  замещает  операнд-приемник.  Оба
         операнда могут содержать двоичные числа со  знаком  или  без
         него (см. AAA и DAA). ADD модифицирует флаги AF, CF, OF, PF,
         SF и ZF.
               
               
               
         ADC приемник,источник         СЛОЖЕНИЕ С ПЕРЕНОСОМ
         ---------------------
               Эта инструкция выполняет  арифметическую  сумму  своих
         операндов,  добавляет  1,  если  установлен  в  1 флаг CF, и
         помещает результат на место операнда-приемника. Оба операнда
         могут  содержать  двоичные числа со знаком или без него (см.
         AAA и DAA). ADC модифицирует флаги AF, CF, OF, PF, SF и  ZF.
         Поскольку ADC использует перенос от предыдущей операции, она
         может применяться для сложения чисел длиннее 2 байтов.
               
               
               
         INC приемник                  УВЕЛИЧЕНИЕ БАЙТА ИЛИ СЛОВА НА 1
         ------------
               К содержимому приемника прибавляется 1. Операнд  может
         быть  байтом или словом и рассматривается как двоичное число
         без знака (см. AAA и DAA). INC модифицирует  флаги  AF,  OF,
         PF, SF и ZF и не влияет на CF.
               
               
               
         AAA                           ASCII-НАСТРОЙКА ДЛЯ СЛОЖЕНИЯ
         ---
               Эта  инструкция  преобразует  содержимое регистра AL в
         корректное распакованное десятичное число; старший  полубайт
         обнуляется. AAA модифицирует флаги AF и CF; состояния флагов
         OF, PF, SF и ZF после AAA не определены.
               
               
               
         DAA                        ДЕСЯТИЧНАЯ НАСТРОЙКА ДЛЯ СЛОЖЕНИЯ
         ---
               Эта  инструкция корректирует результат предшествующего
         сложения  2-х  правильных  упакованных   десятичных   чисел,
         содержащийся  в  регистре  AL. Содержимое AL преобразуется в
         пару   корректных   упакованных   десятичных   чисел.    DAA
         модифицирует  флаги  AF, CF, PF, SF и ZF; состояние флага OF
         после DAA не определено.
 
                                     - 16 -
         
         
               
               
               
               
               
               
                              3.4. Вычитание.
               
               
               
         SUB приемник,источник         ВЫЧИТАНИЕ БАЙТОВ ИЛИ СЛОВ
         ---------------------
               Содержимое   источника   вычитается   из   содержимого
         приемника,  и  результат  помещается  на  место   приемника.
         Операнды могут быть байтами или словами и содержать двоичные
         числа   со  знаком  или  без  него  (см.  AAS  и  DAS).  SUB
         модифицирует флаги AF, CF, OF, PF, SF и ZF.
               
               
               
         SBB приемник,источник         ВЫЧИТАНИЕ С ЗАЕМОМ
         ---------------------
               По  этой инструкции содержимое источника вычитается из
         содержимого приемника, из результата вычитается еще 1,  если
         установлен в 1 флаг CF, и окончательный результат помещается
         на место приемника. Оба  операнда  могут  быть  байтами  или
         словами  и  содержать  двоичные числа со знаком или без него
         (см. AAS и DAS). SBB модифицирует флаги AF, CF, OF, PF, SF и
         ZF.  Поскольку  SBB использует заем предыдущей операции, она
         может применяться для вычитания чисел длиннее 2 байтов.
               
               
               
         DEC приемник                  УМЕНЬШЕНИЕ БАЙТА ИЛИ СЛОВА НА 1
         ------------
               Содержимое приемника уменьшается на 1. Приемник  может
         быть  байтом  или словом. DEC модифицирует флаги AF, OF, PF,
         SF и ZF и не влияет на состояние CF.
               
               
               
         NEG приемник                  ОТРИЦАНИЕ БАЙТА ИЛИ СЛОВА
         ------------
               По этой инструкции содержимое приемника, который может
         быть  байтом  или  словом,  вычитается  из  0,  и  результат
         помещается на место приемника. Эта  форма  дополнения  до  2
         используется  для изменения знака целого числа. Если операнд
         равен 0, его знак не изменяется.  Попытка  отрицания  байта,
         содержащего -128, или слова, содержащего -32768, не изменяет
         операнд, но устанавливает в  1  флаг  OF.  NEG  модифицирует
         флаги   AF,   CF,   OF,   PF,   SF  и  ZF.  Флаг  CF  всегда
         устанавливается в 1,  исключая  тот  случай,  когда  операнд
         равен 0 (тогда и CF=0).
               
               
 
                                     - 17 -
         
         
               
         CMP приемник,источник         СРАВНЕНИЕ БАЙТОВ ИЛИ СЛОВ
         ---------------------
               Инструкция   CMP   вычитает  содержимое  источника  из
         содержимого приемника, но результат не возвращает. Операнды,
         которые  могут  быть  байтами или словами, не изменяются, но
         модифицируются флаги AF, CF, OF, PF,  SF  и  ZF,  что  может
         анализироваться    последующими    инструкциями    условного
         перехода. Состояния этих флагов отражают отношение приемника
         к источнику. Например, если после CMP следует инструкция JG,
         переход  произойдет,  если   содержимое   приемника   больше
         содержимого источника.
               
               
               
         AAS                           ASCII-НАСТРОЙКА ДЛЯ ВЫЧИТАНИЯ
         ---
               Эта  инструкция  преобразует находящийся в регистре AL
         результат предшествующей операции вычитания  2-х  корректных
         десятичных   распакованных  чисел  в  корректное  десятичное
         распакованное число, остающееся также в AL. Старший полубайт
         регистра  AL  обнуляется.  AAS  модифицирует  флаги AF и CF;
         состояния флагов OF, PF и ZF после AAS не определены.
               
               
               
         DAS                       ДЕСЯТИЧНАЯ НАСТРОЙКА ДЛЯ ВЫЧИТАНИЯ
         ---
               Эта инструкция преобразует находящийся в  регистре  AL
         результат  предшествующей  операции вычитания 2-х корректных
         десятичных упакованных чисел в  пару  корректных  десятичных
         упакованных  цифр,  остающихся  также в AL. DAS модифицирует
         флаги AF, CF, PF, SF и ZF; состояние флага OF не определено.
               
               
               
               
               
               
                               3.5. Умножение.
               
               
               
         MUL источник             УМНОЖЕНИЕ БАЙТОВ ИЛИ СЛОВ БЕЗ ЗНАКА
         ------------
               Инструкция   MUL   выполняет   беззнаковое   умножение
         содержимых  источника и аккумулятора. Если источник является
         байтом, в качестве аккумулятора используется регистр  AL,  а
         результат  двойной длины помещается в регистры AH и AL. Если
         источник   является   словом,   в   качестве    аккумулятора
         используется   регистр   AX,   а   результат  двойной  длины
         помещается в регистры DX и AX. Операнды рассматриваются  как
         двоичные  числа  без  знака (см. AAM). Если старшая половина
         результата (содержимое AH для источника-байта или содержимое
         DX   для   источника-слова)  не  равна  0,  флаги  CF  и  OF
 
                                     - 18 -
         
         
         устанавливаются в 1, в противном случае - в 0. Когда CF и OF
         установлены  в  1,  это  означает,  что  AH  или DX содержит
         значимые цифры результата. Состояния флагов AF, PF, SF и  ZF
         после MUL не определены.
               
               
               
         IMUL источник        ЦЕЛОЧИСЛЕННОЕ УМНОЖЕНИЕ БАЙТОВ ИЛИ СЛОВ
         -------------
               Инструкция  IMUL   выполняет   умножение   со   знаком
         содержимых  источника и аккумулятора. Если источник является
         байтом, в качестве аккумулятора используется регистр  AL,  а
         результат  двойной длины помещается в регистры AH и AL. Если
         источник   является   словом,   в   качестве    аккумулятора
         используется   регистр   AX,   а   результат  двойной  длины
         помещается  в  регистры  DX  и  AX.  Если  старшая  половина
         результата (содержимое AH для источника-байта или содержимое
         DX  для  источника-слова)  не  является  расширением   знака
         младшей  половины,  флаги  CF  и  OF  устанавливаются в 1, в
         противном случае - в 0. Когда CF и OF установлены в  1,  это
         означает,  что AH или DX содержит значимые цифры результата.
         Состояния флагов AF, PF, SF и ZF после IMUL не определены.
               
               
               
         AAM                           ASCII-НАСТРОЙКА ДЛЯ УМНОЖЕНИЯ
         ---
               Инструкция AAM  корректирует  результат предшествующей
         операции  умножения  2-х корректных десятичных распакованных
         операндов.  Корректное   десятичное   распакованное   число,
         состоящее из 2-х  цифр, извлекается из регистров AH и AL,  и
         результат возвращается в регистры AH и AL. Старшие полубайты
         перемножаемых операндов должны быть обнулены, что необходимо
         AAM   для   формирования   правильного    результата.    AAM
         модифицирует флаги PF, SF и ZF; состояния флагов AF, CF и OF
         после AAM не определены.
               
               
               
               
               
               
                              3.6. Деление.
               
               
               
         DIV источник               ДЕЛЕНИЕ БАЙТОВ ИЛИ СЛОВ БЕЗ ЗНАКА
         ------------
               Инструкция    DIV    выполняет   беззнаковое   деление
         содержимого  аккумулятора  (и  его расширения) на содержимое
         источника. Если источник  является  байтом,  предполагается,
         что  делимое  расположено  в  регистрах  AH  и  AL.  Частное
         остается в регистре  AL,  остаток  -  в  регистре  AH.  Если
         источник   является   словом,  предполагается,  что  делимое
         расположено в регистрах DX  и  AX.  Частное  в  этом  случае
 
                                     - 19 -
         
         
         остается  в  регистре  AX,  остаток  -  в  регистре DX. Если
         значение частного превосходит вместимость регистра-приемника
         (FFh для источника-байта  или  FFFFh  для  источника-слова),
         возникает  ситуация "деление на 0" и генерируется прерывание
         с номером 0; частное и остаток в этом случае не  определены.
         Дробная  часть  частного  отсекается.  После  DIV  состояния
         флагов AF, CF, OF, PF, SF и ZF не определены.
               
               
               
         IDIV источник          ЦЕЛОЧИСЛЕННОЕ ДЕЛЕНИЕ БАЙТОВ ИЛИ СЛОВ
         -------------
               Инструкция   IDIV   выполняет   деление   со    знаком
         содержимого  аккумулятора  (и  его расширения) на содержимое
         источника. Если источник  является  байтом,  предполагается,
         что  делимое  расположено  в  регистрах  AH  и  AL.  Частное
         остается  в регистре AL, остаток - в регистре AH. Для такого
         деления максимально допустимое положительное  частное  равно
         127  (7Fh),  а  минимально  допустимое отрицательное частное
         равно   -127   (81h).   Если   источник   является   словом,
         предполагается, что делимое расположено в регистрах DX и AX.
         Частное в этом случае остается в регистре AX,  остаток  -  в
         регистре  DX.  Для  такого  деления  значение частного может
         находиться в пределах от -32767 (8001h)  до  32767  (7FFFh).
         Если частное положительно и превышает положительный максимум
         или   отрицательно   и   меньше   отрицательного   минимума,
         генерируется  прерывание с номером 0 (деление на 0); частное
         и остаток  в  этом  случае  не  определены.  Нецелочисленное
         частное  округляется  до  целого числа (по направлению к 0).
         Остаток имеет  тот  же  знак,  что  и  делимое.  После  IDIV
         состояния флагов AF, CF, OF, ZF, PF и SF не определены.
               
               
               
         AAD                           ASCII-НАСТРОЙКА ДЛЯ ДЕЛЕНИЯ
         ---
               Инструкция  AAD  модифицирует  числитель в регистре AL
         перед  делением  2-х  корректных  десятичных   распакованных
         операндов таким образом, чтобы частное от деления было также
         корректным десятичным распакованным числом. Для того,  чтобы
         последующая    инструкция    DIV   сформировала   правильный
         результат,  регистр  AH  должен  содержать   нули.   Частное
         остается в регистре AL, остаток - в регистре AH; оба старших
         полубайта обнуляются. AAD модифицирует флаги PF,  SF  и  ZF;
         состояния флагов AF, CF и OF после AAD не определены,
               
               
               
         CBW                           ПРЕОБРАЗОВАНИЕ БАЙТА В СЛОВО
         ---
               Инструкция CBW заполняет регистр  AH  битами,  равными
         знаковому биту однобайтного  числа  в регистре  AL.  CBW  на
         состояния   флагов   не   влияет.   Эта   инструкция   может
         использоваться  для  получения  делимого  двойного   размера
         (слова)   из   результата  предшествующей  операции  деления
 
                                     - 20 -
         
         
         байтов.
               
               
               
         CWD                     ПРЕОБРАЗОВАНИЕ СЛОВА В ДВОЙНОЕ СЛОВО
         ---
               Инструкция  CWD  заполняет  регистр DX битами, равными
         знаковому биту двухбайтного  числа  в  регисте  AX.  CWD  на
         состояния   флагов   не   влияет.   Эта   инструкция   может
         использоваться  для  получения  делимого  двойного   размера
         (двойного   слова)  из  результата  предшествующей  операции
         деления слов.
                                             
                                     - 21 -
               
               
               
               
               
               
                           4. Инструкции обработки бит.
               

               
               Процессоры 8086 и 8088 имеют 3 группы  инструкций  для
         обработки бит в форматах байта или слова: логические, сдвиги
         и вращения (все операции выполняются и над  байтами,  и  над
         словами).
               
               
               
               
               
               
                           4.1. Логические инструкции.
   
               Логические  инструкции  включают булевы  операторы НЕ,
         И, включающие ИЛИ, исключающие ИЛИ и операцию  тестирования,
         которая   устанавливает  флаги,  но  не   изменяет  значения
         своих операндов.
               Инструкции AND,  OR,  XOR  и  TEST  следующим  образом
         влияют  на  флаги.  Флаги  OF  и CF логическими инструкциями
         всегда   устанавливается  в  0,  а  состояние  флага  AF  не
         определено. Состояния флагов SF, ZF, и PF отражают результат
         операции  и  могут  анализироваться  инструкциями  условного
         перехода (п.6.2). Интерпретация этих флагов  такая  же,  как
         для  арифметических инструкций. Флаг SF устанавливается в 1,
         если  результат  отрицателен  (старший  бит  равен   1),   и
         устанавливается в 0, если результат положителен (старший бит
         равен 0). Флаг ZF устанавливается в 1, если результат  равен
         0,  и  устанавливается  в  0  в  противном  случае.  Флаг PF
         устанавливается в 1, если результат  содержит  четное  число
         единиц, и устанавливается в 0 в противном случае. Инструкция
         NOT на состояния флагов не влияет.
               
               
               
         NOT приемник                  ОТРИЦАНИЕ
         ------------
               Инструкция  NOT  инвертирует   все   биты   (формирует
         дополнение до 1) байта или слова.
               
             
               
         AND приемник,источник         ЛОГИЧЕСКОЕ И
         ---------------------
               Инструкция  AND  выполняет  операцию логическое И двух
  

                                     - 22 -
         
         
         операндов  (байтов  или  слов)  и  возвращает  результат   в
         операнд-приемник.  Бит  результа  устанавливается  в 1, если
         установлены в 1 оба соответствуюших ему  бита  операндов,  и
         устанавливается в 0 в противном случае.
               
               
               
         OR приемник,источник          ВКЛЮЧАЮЩЕЕ ИЛИ
         --------------------
               Инструкция OR выполняет операцию логическое включающее
         ИЛИ двух операндов (байтов или слов) и помещает результат на
         место  операнда-приемника.  Бит результата устанавливается в
         1, если равен 1 хотя бы  один  из  2-х  соответствующих  ему
         битов операндов, и устанавливается в 0 в противном случае.
               
               
               
         XOR приемник,источник         ИСКЛЮЧАЮЩЕЕ ИЛИ
         ---------------------
               Инструкция    XOR    выполняет   операцию   логическое
         исключающее ИЛИ 2-х операндов и помещает результат на  место
         операнда-приемника. Бит результата устанавливается в 1, если
         соответствующие ему  биты  операндов  имеют  противоположные
         значения, и устанавливается в 0 в противном случае.
               
               
               
         TEST приемник,источник        ТЕСТИРОВАНИЕ
         ----------------------
               Инструкция  TEST  выполняет операцию логическое И двух
         операндов  (байтов  или  слов),   модифицирует   флаги,   но
         результат не возвращает, т.е.операнды не изменяются. Если за
         TEST следует инструкция JNZ (переход, если не 0), то переход
         будет  иметь место, если в обоих операндах имеются единицы в
         совпадающих позициях.
               
               
               
               
               
               
               
                               4.2. Сдвиги.
               
               
               
               Биты  в  байтах  или  словах   могут   быть   сдвинуты
         арифметически  или  логически. В соответствии с кодируемым в
         инструкции счетчиком может быть выполнено  до  255  сдвигов.
         Счетчик  может  быть  специфицирован как константа 1 или как
         регистр  CL,  что  позволяет  задавать  величину  сдвига   в
         процессе  работы программы. Арифметические сдвиги могут быть
         использованы  для  умножения и деления  двоичных  чисел   на
         степени 2 (см. SAR). Логические сдвиги могут применяться для
         выделения битов в байтах или словах.
 
                                     - 23 -
         
         
               Инструкции  сдвига  следующим  образом воздействуют на
         флаги.   Состояние  флага  AF  всегда  не  определено  после
         операции сдвига. Воздействие на флаги PF, SF и ZF аналогично
         логическим  инструкциям.  Флаг  CF  всегда содержит значение
         последнего сдвинутого за  пределы  операнда  приемник  бита.
         Состояние  флага  OF  после  многобитного  сдвига  всегда не
         определено. При единичном сдвиге  OF  установливается  в  1,
         если   в  реэультате  операции  знаковый  бит  изменил  свое
         значение, и устанавливается в 0 в противном случае.
               
               
               
               
         SHL/SAL приемник,счетчик      СДВИГ ВЛЕВО
         ------------------------                       
               Инструкции SHL и SAL выполняют операции соответственно
         логического   и   арифметического   сдвига   влево  операнда
         приемник  на величину бит, определяемую счетчиком.  Приемник
         может  быть  байтом  или  словом.  Появляющиеся  справа биты
         заполняются   нулями.   Если    знаковый    бит    сохраняет
         первоначальное значение, флаг OF устанавливается в 0.
               
               
               
         SHR приемник,источник         ЛОГИЧЕСКИЙ СДВИГ ВПРАВО
         ---------------------
               Инструкция SHR сдвигает биты операнда приемник  (байта
         или  слова) вправо на число разрядов, определяемое операндом
         счетчик. Появляющиеся слева биты  заполняются  нулями.  Если
         знаковый бит сохраняет свое первоначальное значение, флаг OF
         устанавливается в 0.
               
               
               
         SAR приемник,счетчик          АРИФМЕТИЧЕСКИЙ СДВИГ ВПРАВО
         ---------------------
               Инструкция  SAR сдвигает биты операнда приемник (байта
         или слова) вправо на число разрядов, определяемое  операндом
         счетчик.   Биты,   равные  первоначальному  знаковому  биту,
         появляются слева, сохраняя таким образом первоначальный знак
         числа.  Отметим,  что результат выполнения SAR отличается от
         делимого  "эквивалентной"  операции   IDIV,   если   операнд
         приемника  отрицателен  и за его пределы сдвигаются единицы.
         Например, сдвиг числа -5 вправо на 1 бит дает -3, а  деление
         -5  на 2 дает -2. Различие инструкций заключается в том, что
         IDIV округляет все числа по направлению к 0, а SAR округляет
         положительные числа к 0 и отрицательные - от нуля.
               
               
               
               
               
               
               
               
 
                                     - 24 -
         
         
                                4.3. Вращения.
               
               
               Биты   в   байтах   и   словах  можно  вращать.  Биты,
         сдвигаемые  за  пределы  операнда,  не  теряются,  как   при
         сдвиге,  а  циклически появляются с другой стороны операнда.
         Как  при  сдвиге,  величина  вращения   задается   операндом
         счетчик,  который  может быть специфицирован как константа 1
         или как регистр CL. Флаг CF может выступать  как  расширение
         операнда  в  двух инструкциях вращения (RCL и RCR), позволяя
         выделять бит во флаг  CF  и  затем  проверить  его  значение
         инструкциями JC или JNC.  Вращения  воздействуют  только  на
         флаг  переноса  CF  и  флаг  переполнения OF. Флаг CF всегда
         содержит значение последнего вышедшего за  операнд  бита.  В
         многопозиционных   вращениях   состояние   флага  OF  всегда
         неопределено. В одиночном вращении OF устанавливается  в  1,
         если  операция  изменяет  значение старшего (знакового) бита
         операнда, и устанавливается в 0 в противном случае.
               
               
               
         ROL приемник,счетчик          ВРАЩЕНИЕ ВЛЕВО
         --------------------
               Инструкция ROL вращает байт или слово приемника  влево
         на число бит, определяемое счетчиком.
               
               
               
         ROR приемник,счетчик          ВРАЩЕНИЕ ВПРАВО
         --------------------
               Инструкция ROR работает аналогично ROL, но вправо.
               
               
               
         RCL приемник,счетчик          ВРАЩЕНИЕ ВЛЕВО С ПЕРЕНОСОМ
         --------------------
               Инструкция  RCL вращает биты байта или слова приемника
         влево  на  число  бит,  определяемое  счетчиком.   Флаг   CF
         рассматривается  как  часть приемника, т.е. его значение при
         этом вращении попадает в младший бит  приемника,  а  сам  CF
         принимает значение старшего бита приемника.
               
               
               
         RCR приемник,счетчик          ВРАЩЕНИЕ ВПРАВО С ПЕРЕНОСОМ
         --------------------
               Инструкция  RCR работает в точности как RCL с той лишь
         разницей, что биты вращаются вправо.
                    
                                     - 25 -
               
               
         
         
               
               
               
                        5. Инструкции обработки строк.
               
               
               
               
               
                             5.1. Общие положения.
               
               
               
               5 базовых строковых операций, называемых  примитивами,
         позволяют  оперировать со строками байтов или слов по одному
         элементу  (байту  или  слову)  за  раз.  Эти  операции могут
         обрабатывать  строки  длиной  до  64К.  Операции со строками
         обеспечивают пересылку,  сравнение,  сканирование  строк  по
         значению,  а  также пересылку элементов строки в аккумулятор
         или из него. Этим базовыми инструкциям может  предшествовать
         однобайтный   префикс,   наличие    которого    обеспечивает
         многократное  повторение инструкции аппаратным способом, что
         гарантирует  более  высокое  быстродействие,  чем  в  случае
         программного  цикла. Процесс повторения может быть прекращен
         при возникновении различных  ситуаций,  а  сама  повторяемая
         операция может быть как прервана, так и возобновлена.
               Строковые  инструкции  во многом похожи друг на друга.
         Они могут иметь операнд-приемник, операнд-источник  или  оба
         эти  операнда. Аппаратно предполагается, что исходная строка
         размещена  в  текущем  сегменте  данных  (для  ее  адресации
         используется  регистр  DS);  для  изменения  этого допущения
         может использоваться однобайтный префикс изменения сегмента.
         Строка-приемник должна размещаться в текущем экстра сегменте
         (для ее адресации используется регистр  ES).  Для   проверки
         того,  что  является  элементом  строки  (байт  или  слово),
         ассемблер проверяет атрибуты операндов инструкции. Однако, в
         действительности   эти   операнды  для  адресации  строк  не
         используются.  Для  адресации  используются   регистры   SI,
         который   предполагается   загруженным   значением  смещения
         строки-источника  относительно   содержимого   DS,   и   DI,
         содержимое которого трактуется как смещение строки-приемника
         относительно  содержимого  ES  (табл.5.1).  Все эти регистры
         должны быть загружены требуемыми  значениями  до  выполнения
         строковой операции, для чего могут использоваться инструкции
         LDS, LES и LEA (п.2.3).
               Строковые    инструкции   автоматически   модифицируют
         содержимое регистров SI и/или DI для обеспечения возможности
         обработки  следующего  элемента   строки.   Значение   флага
         направления  DF  определяет, будут ли эти индексные регистры
 

                                     - 26 -
         
         
         автоматически   увеличиваться   (DF=0)   или   автоматически
         уменьшаться   (DF=1)  при  переходе  к  следующему  элементу
         строки. При обработке строк байтов содержимое  SI  и/или  DI
         изменяется на 1; в случае строк слов - на 2.
               
               
               
                   Таблица 5.1. Использование регистров и флагов
                                строковыми инструкциями.
         ___________________________________________________________
         |        |                                                |
         | объект |                назначение                      |
         |________|________________________________________________|
         |        |                                                |
         |   SI   |        смещение строки-источника               |
         |________|________________________________________________|
         |        |                                                |
         |   DI   |        смещение строки-приемника               |
         |________|________________________________________________|
         |        |                                                |
         |   CX   |        счетчик повторений                      |
         |________|________________________________________________|
         |        |                                                |
         |        |        - значение сканирования                 |
         | AL/AX  |        - приемник для LODS                     |
         |        |        - источник для STOS                     |
         |________|________________________________________________|
         |        |                                                |
         |   DF   |        0 - автоматическое увеличение SI, DI    |
         |        |        1 - автоматическое уменьшение SI, DI    |
         |________|________________________________________________|
         |        |                                                |
         |   ZF   |  признак прекращения сканирования/сравнения    |
         |________|________________________________________________|
               
               
               При  использовании  префикса   повторений   содержимое
         регистра  CX  уменьшается  на  1  после  каждого  повторения
         строковой  инструкции.  Регистр  CX  должен  быть   загружен
         требуемым   числом   повторений   до   выполнений  строковой
         операции.   Если   CX  содержит  0,  строковая  операция  не
         выполняется, и управление передается следующей инструкции.
               
               
               
         REP/REPE/REPZ/REPNE/REPNZ    ПРЕФИКСЫ ПОВТОРЕНИЯ
         -------------------------
               Эти ключевые слова представляют собой 5  мнемоник  2-х
         форм   однобайтного   префикса,   управляющего   повторением
         непосредственно  следующей  за  ним  строковой   инструкции.
         Различные  мнемоники  введены для удобства программирования.
         Наличие префикса на состояния флагов не влияет.
               REP используется в сочетании  с  инструкциями  MOVS  и
         STOS  и  интерпретируется  как  "повторение  пока  не  конец
         строки" (в CX не 0). REPE и REPZ работают также и  физически
 
                                     - 27 -
         
         
         являются   тем   же  префиксом,  что  и  REP.  REPE  и  REPZ
         используются в  сочетании  с  инструкциями  CMPS  и  SCAS  и
         требуют, чтобы флаг  ZF,  используемый  этими  инструкциями,
         был установлен в 1 до инициализации следующего повторения.
               REPNE и REPNZ представляют собой  2  мнемоники  одного
         префикса  и функционируют также, как REPE и REPF, но флаг ZF
         должен быть установлен  в  0,  или  повторение  прекратится.
         Заметим,   что   устанавливать  флаг  ZF  перед  выполнением
         повторяемой строковой инструкции необязательно.
               Повторяемая строковая инструкция может  быть  прервана
         (на обработку системных прерываний  это не распостраняется).
         Процессор  распознает это прерывание до обработки очередного
         элемента  строки.  После  возврата из прерывания повторяемая
         операция возобновляется с точки прерывания. Заметим, однако,
         что  выполнение не возобновится правильно, если в дополнение
         к префиксу повторения был специфицирован 2-й или 3-й префикс
         (например,   переключения   сегмента  или  LOCK).  В  момент
         прерывания  процессор  "запоминает"  только  один   префикс,
         причем,    тот,    который    при    кодировании    операции
         непосредственно предшествовал  строковой  инструкции.  После
         возврата  из  прерывания  остальные  префиксы действовать не
         будут. Если все же необходимо воздействие более, чем одного,
         префикса,  прерывания  на  время  работы  строковой операции
         следует запретить инструкцией CLI (п.7.1).  Это,  однако  не
         поможет при появлении немаскируемого прерывания. Кроме того,
         при  обработке  длинных  строк  может  недопустимо  возрасти
         время,  в  течении  которого  система  не сможет отвечать на
         прерывания.
               
               
               
               
               
               
                            5.2. Пересылка строк.
               
               
               
         MOVS приемник,источник      ПЕРЕСЫЛКА СТРОКИ БАЙТОВ ИЛИ СЛОВ
         ----------------------
               Эта инструкция пересылает байт  или  слово  источника,
         адресуемого  регистром  SI,  в  строку-приемник,  адресуемую
         регистром DI, и модифицирует содержимое регистров  SI  и  DI
         таким  образом,  чтобы  они  указывали на следующие элементы
         строк.   Величина   элементов строк   и  соответственно  тип
         пересылки (байт или слово)  определяется  ассемблером  путем
         анализа  атрибутов  операндов  инструкции. При использовании
         префикса REP инструкция MOVS может пересылать блоки памяти.
               
               
               
         MOVSB/MOVSW                 ПЕРЕСЫЛКА СТРОКИ БАЙТОВ ИЛИ СЛОВ
         -----------
               Эти  инструкции  обеспечивают  пересылку байта (MOVSB)
         или  слова (MOVSW) из элемента строки-источника, адресуемого
 
                                     - 28 -
         
         
         регистром  SI,  в  элемент   строки-приемника,   адресуемого
         регистром  DI.  Содержимое  регистров  SI  и  DI  изменяется
         (уменьшается  или  увеличивается в соответствии со значением
         флага DF)на 1 для MOVSB или на 2 для MOVSW с тем, чтобы  они
         указывали  на  следующие  элементы строк. Использование этих
         инструкций полезно в том случае, когда  ассемблер  не  может
         определить  атрибуты  строк, например, при пересылке участка
         программного кода.  Эти  инструкции  могут  повторяться  при
         использовании соответствующих префиксов.
               
               
               
         LODS источник                ЗАГРУЗКА СТРОКИ БАЙТОВ ИЛИ СЛОВ
         -------------
               Инструкция  LODS  загружает  элемент  строки-источника
         (байт  или слово в зависимости от типа операнда), адресуемый
         регистром  SI,  в  регистр  AL  или  AX   соответственно   и
         устанавливает  SI  указывающим  на следующий элемент строки.
         Обычно эта инструкция не повторяется, т.к. каждое повторение
         замещало бы содержимое регистров AL или AX, и сохранялось бы
         только  последнее  значение.  Однако, инструкция LODS весьма
         полезна  в  программных  циклах  как  часть  более   сложной
         строковой операции.
               
               
               
         LODSB/LODSW                  ЗАГРУЗКА СТРОКИ БАЙТОВ ИЛИ СЛОВ
         -----------
               Работа  этих  инструкций  аналогична  LODS  с той лишь
         разницей,  что  здесь  длина  элемента строки задана явно: 1
         байт для LODSB и 2 байта для LODSW.
               
               
               
         STOS приемник              СОХРАНЕНИЕ СТРОКИ БАЙТОВ ИЛИ СЛОВ
         -------------
               Инструкция  STOS  помещает содержимое регистров AL или
         AX   (в   зависимости   от   типа   операнда)   в    элемент
         строки-приемника,  адресуемый  регистром DI, и устанавливает
         регистр DI указывающим  на  следующий  элемент  строки.  Как
         повторяемая  инструкция STOS является традиционным средством
         для заполнения строки каким-либо значением.
               
               
               
         STOSB/STOSW                СОХРАНЕНИЕ СТРОКИ БАЙТОВ ИЛИ СЛОВ
         -----------
               Работа  этих  инструкций  аналогична  STOS  с той лишь
         разницей,  что  здесь  длина  элемента строки задана явно: 1
         байт для STOSB и 2 байта для STOSW.
               
               
               
               
               
 
                                     - 29 -
         
         
               
               
               
               
                            5.3. Сравнение строк.
               
               
               
         CMPS приемник,источник      СРАВНЕНИЕ СТРОКИ БАЙТОВ ИЛИ СЛОВ
         ----------------------
               Инструкция    CMPS    вычитает    байт    или    слово
         строки-приемника,  адресуемые  регистром  DI,  из  байта или
         слова строки-источника, адресуемых  регистром  SI.  Величина
         элементов   строк  определяется  ассемблером  путем  анализа
         атрибутов операндов инструкции. CMPS не изменяет  содержимое
         самих  строк, но устанавливает флаги AF, CF, OF, PF, SF и ZF
         таким  образом,  что   они   отражают   отношение   элемента
         строки-приемника    к    элементу   строки-источника.   Если
         инструкция  CMPS  использована  с  префиксом  REPE или REPZ,
         выполняется операция "сравнение до конца строки (пока  в  CX
         не 0) и пока строки равны (ZF=1)".  Если CMPS использована с
         префиксом REPNE или REPNZ, выполняется  операция  "сравнение
         до конца строки (пока в CX не 0)  и  пока  строки  не  равны
         (ZF=0)".  Таким  образом,  инструкция CMPS может применяться
         для поиска совпадающих или несовпадающих элементов строк.
               
               
               
         CMPSB/CMPSW                 СРАВНЕНИЕ СТРОКИ БАЙТОВ ИЛИ СЛОВ
         -----------
               Работа  этих  инструкций  аналогична  CMPS  с той лишь
         разницей, что здесь длина элемента строк задана явно: 1 байт
         для CMPSB и 2 байта для CMPSW.
               
               
               
               
               
                             5.4. Сканирование.
               
               
               
         SCAS приемник            СКАНИРОВАНИЕ СТРОКИ БАЙТОВ ИЛИ СЛОВ
         -------------
               Инструкция   SCAS  вычитает  элемент  строки-приемника
         (байт или слово в зависимости от типа операнда),  адресуемый
         регистром   DI,   из   содержимого   регистра   AL   или  AX
         соответственно и модифицирует флаги, но не меняет ни строку,
         ни  содержимое аккумулятора. После SCAS регистр DI указывает
         на следующий элемент строки, а флаги AF, CF, OF, PF, SF и ZF
         отражают   отношение  содержимого  аккумулятора  к  элементу
         строки. Если присутствует префикс REPE или REPZ, выполняется
         операция  "сканирование  до  конца строки (пока в CX не 0) и
         пока элемент строки равен содержимому аккумулятора  (ZF=1)".
         Если  присутствует  префикс  REPNE  или  REPNZ,  выполняется
 
                                     - 30 -
         
         
         операция "сканирование до конца строки (пока в CX  не  0)  и
         пока   элемент  строки  не  равен  содержимому  аккумулятора
         (ZF=0)".  Этот  способ  может  использоваться   для   поиска
         значения в строке.
               
               
               
         SCASB/SCASW              СКАНИРОВАНИЕ СТРОКИ БАЙТОВ ИЛИ СЛОВ
         -----------
               Работа  этих  инструкций  аналогична  SCAS  с той лишь
         разницей,  что  здесь  длина  элемента строки задана явно: 1
         байт для SCASB и 2 байта для SCASW.
г                                                
                                     - 31 -
               

               
               
               
               
                       6. Инструкции передачи управления.
               
               
               Последовательность   выполнения  инструкций  программы
         процессором 8086/8088 определяется содержимым регистров CS и
         IP.  Регистр  CS  содержит  базовый  адрес текущего сегмента
         кода,  т.е.  64-килобайтной  области  памяти,   из   которой
         выбираются  инструкции.  Содержимое регистра IP используется
         как смещение от начала сегмента кода.  Комбинация  регистров
         CS  и IP указывает на позицию памяти, из которой должна быть
         выбрана очередная  инструкция  (обычно,  впрочем,  следующая
         инструкция  уже  выбрана и ожидает в очереди инструкций CPU,
         что обеспечивается наличием раздельных механизмов выборки  и
         исполнения  инструкций  процессора 8086/8088).
               Описываемые  в  этом   разделе   инструкции   передачи
         управления  оперируют  с  содержимым  регистров CS и IP, что
         нарушает  нормальную  последовательность   выполнения.   При
         передаче   управления   очередь   не   содержит   корректной
         инструкции, и BIU получает следующую инструкцию  из  памяти,
         используя содержимое CS и IP, после чего передает инструкцию
         непосредственно EU и начинает формировать очередь, начиная с
         нового адреса.
               Процессор 8086/8088 имеет 4 группы инструкций передачи
         управления:  инструкции  безусловной  и  условной   передачи
         управления,  итерации  и прерывания. Только последняя группа
         влияет на состояние флагов  процессора.  Однако,  выполнение
         многих  инструкций  передачи  управления зависит от значений
         флагов.

               
               
               
               
               
                           6.1. Безусловный переход.
               
               
               Инструкции этого типа обеспечивают безусловный переход
         и  могут  передавать управление как внутри текущего сегмента
         кода (внутрисегментная передача управления), так  и  за  его
         пределы  (межсегментная  передача  управления). Тип передачи
         управления может быть задан ассемблеру предшествующим адресу
         перехода ключевым словом  NEAR  (внутрисегментная)  или  FAR
         (межсегментная).
               Описания  инструкций  безусловного  перехода приведены
         ниже.
               
 
                                     - 32 -
         
         
               
               
         CALL имя-процедуры            ВЫЗОВ ПРОЦЕДУРЫ
         ------------------
               Инструкция  CALL  активизирует  указанную   процедуру,
         сохраняя   в  стеке  адрес  следующей  за  CALL  инструкции.
         Ассемблер  генерирует  инструкцию  CALL   разных   типов   в
         зависимости   от   того,   с   каким   описателем  объявлено
         имя-процедуры: NEAR или FAR.  Для  корректного  возврата  из
         процедуры  тип  инструкции  CALL должен соответствовать типу
         инструкции  RET,  выполняющей  этот  возврат.  Потенциальная
         возможность  несоответствия  имеет  место,  когда инструкция
         CALL и сама процедура находятся  в  раздельно  транслируемых
         частях   программы.   Обычно   ассемблер   сам   следит   за
         соответствием вызовов и возвратов. Дополнительно об этом см.
         "Система  программирования  на макроассемблере MS-DOS. Часть
         3. Директивы языка ассемблера", п.3.2.
               Различные  формы   CALL   позволяют   получать   адрес
         процедуры  из  самой инструкции (прямая CALL) или из области
         памяти или регистра, на  которые  ссылается  CALL  (непрямая
         CALL).   Следует   помнить,   что   процессор  автоматически
         устанавливает регистр IP указывающим на следующую инструкцию
         до сохранения его в стеке.
               Для  внутрисегментной  прямой CALL содержимое регистра
         SP уменьшается на 2, и в стек помещается содержимое регистра
         IP.   Затем   к  содержимому  IP  добавляется  относительное
         смещение адреса процедуры, изменяющееся в пределах  от  -32К
         до  +32К.  Эта  форма  CALL  является  самоотносительной   и
         динамически переместимой (CALL и процедура находятся в одном
         сегменте    и   перемещаются   вместе)   и   может   поэтому
         использоваться в адресно независимых программах.
               Внутрисегментная непрямая CALL  может  функционировать
         через память или через регистр. Содержимое SP уменьшается на
         2,  и  в  стек  помещается содержимое IP. Сиещение процедуры
         извлекается  из  специфицированных в инструкции слова памяти
         или 16-битового регистра и заносится в IP.
               Для   межсегментной   прямой   CALL   содержимое    SP
         уменьшается  на  2,  и в стек помещается содержимое регистра
         CS. В CS заносится полученное из инструкции слово  сегмента.
         SP  снова  уменьшается  на 2, и в стек помещается содержимое
         IP, а в сам IP заносится слово смещения из инструкции.
               В случае межсегментной непрямой  CALL,  которая  может
         функционировать   только   через   память,   содержимое   SP
         уменьшается на 2, в стек заносится  регистр  CS,  в  который
         затем  копируется  2-е  слово  из  адресуемого   инструкцией
         4-байтного указателя. SP снова уменьшается на 2,  и  в  стек
         помещается  содержимое регистра IP, куда затем заносится 1-е
         слово указателя.
               
               
               
         RET число                     ВОЗВРАТ ИЗ ПРОЦЕДУРЫ
         ---------
               Инструкция RET передает  управление  из  процедуры  на
         инструкцию, непосредственно следующую за вызвавшей процедуру
 
                                     - 33 -
         
         
         инструкцией CALL. Ассемблер генерирует внутрисегментную RET,
         если  программист  определил NEAR-процедуру, и межсегментную
         RET в случае  FAR-процедуры.  Инструкция  RET  извлекает  из
         адресуемой  регистром  SP вершины стека слово, помещая его в
         регистр IP, и увеличивает  содержимое  SP  на  2.  В  случае
         межсегментной  RET  из  новой  вершины  стека  извлекается и
         помещается в регистр CS еще  одно  слово,  а  содержимое  SP
         увеличивается  еще на 2. Если в инструкции RET указано число
         (оно может отсутствовать), это значение  добавляется  в  SP.
         Эта   возможность   может  быть  использована  для  удаления
         помещенных в стек параметров процедуры.
               
               
               
         JMP адрес                     БЕЗУСЛОВНЫЙ ПЕРЕХОД
         ---------
               По этой инструкции управление безусловно передается по
         указанному  адресу.  В  отличие  от  CALL  инструкция JMP не
         помещает в стек никакой информации, и возврата  к  следующей
         за  JMP  инструкции  не  обеспечивается.  Подобно CALL адрес
         получающей управление инструкции может быть получен из самой
         JMP   (прямая  JMP)  или  из  ячейки  памяти  или  регистра,
         специфицированных в JMP (непрямая JMP).  С  другой  стороны,
         передача  управления  может быть как внутрисегментной, так и
         межсегментной.
               Внутрисегментная  прямая   JMP   изменяет   содержимое
         регистра  IP,  добавляя  туда  смещение  целевой  инструкции
         относительно  себя.  Если  ассемблер  обнаружит,   что   эта
         инструкция  отстоит  от  JMP не более, чем на 127 байтов, он
         автоматически  генерирует   двухбайтную   форму   инструкции
         (короткая  JMP); в противном случае формируется ближний JMP,
         который может адресовать цель в пределах от  -32К  до  +32К. 
         Эти  формы  JMP  являются  самоотносительными и  динамически
         переместимыми (JMP  и  целевая  инструкция находятся в одном
         сегменте   и   перемещаются   вместе)   и   могут    поэтому
         использоваться в адресно независимых программах.
               Внутрисегментная  непрямая  JMP  может функционировать
         через память или через регистр. В первом  случае  содержимое
         адресуемого  инструкцией  слова  памяти помещается в регистр
         IP. Во втором новое значение  IP  выбирается  из  указанного
         16-битового регистра.
               Межсегментная  прямая  JMP помещает в регистры IP и CS
         значения, специфицированные инструкцией.
               Межсегментная  непрямая  JMP   может   функционировать
         только через память. Первое слово из адресуемого инструкцией
         4-байтного указателя помещается в регистр IP, второе - в CS.
               

               



               
               
               
 
                                     - 34 -
         
         
                             6.2. Условный переход.
               
               
               Инструкции  условного  перехода  организуют   передачу
         управления задаваемой инструкции  при выполнении специфичных
         для  каждой  инструкции  этого  типа  условий.  Эти  условия
         определяются текущими состояниями флагов процессора.  Каждая
         из  этих  18  инструкций  (им соответствуют 30 мнемонических
         кодов операций) проверяет  определенную  комбинацию  флагов.
         Если  условие  выполняется, происходит переход по указанному
         адресу;  в  противном  случае   управление   передается   на
         следующую инструкцию программы.
               Все условные переходы являются короткими, т.е. целевая
         инструкция  должна  отстоять  не далее, чем на -128 или +127
         байтов  от  первого  байта  следующей  инструкции  (JMP  00h
         обеспечивает переход к следующей инструкции).
               Поскольку   переход   осуществляется   добавлением   к
         содержимому регистра IP относительного  смещения  цели,  все
         инструкции  условного перехода являются самоотносительными и
         могут   поэтому   использоваться   при   написании   адресно
         независимых программ.
               Инструкции  условной передачи управления и проверяемые
         при их выполнении условия приведены в таблице 6.1.
               
               
               Таблица 6.1. Инструкции условной передачи управления.
         ___________________________________________________________
         |         |                                               |
         |         |              условие перехода                 |
         |  мнем.  |_______________________________________________|
         |   код   |                  |                            |
         |         |       флаги      |           смысл            |
         |_________|__________________|____________________________|
         |         |                  |                            |
         | JA/JNBE |   (CF or ZF)=0   |  выше/не ниже и не равно   |
         |_________|__________________|____________________________|
         |         |                  |                            |
         | JAE/JNB |      CF=0        |  выше или равно/не ниже    |
         |_________|__________________|____________________________|
         |         |                  |                            |
         | JB/JNAE |      CF=1        |  ниже/не выше и не равно   |
         |_________|__________________|____________________________|
         |         |                  |                            |
         | JBE/JNA |   (CF or ZF)=1   |   ниже или равно/не выше   |
         |_________|__________________|____________________________|
         |         |                  |                            |
         |   JC    |      CF=1        |          перенос           |
         |_________|__________________|____________________________|
         |         |                  |                            |
         |  JE/JZ  |      ZF=1        |         равно/нуль         |
         |_________|__________________|____________________________|
         |         |                  |                            |
         | JG/JNLE |   ((SF xor OF)   |          больше/           |
         |         |     or ZF)=0     |    не меньше и не равно    |
         |_________|__________________|____________________________|
 
                                     - 35 -
         
         
                                   Таблица 6.1. Продолжение.
         ___________________________________________________________
         |         |                  |                            |
         | JGE/JNL |   (SF xor OF)=0  | больше или равно/не меньше |
         |_________|__________________|____________________________|
         |         |                  |                            |
         | JL/JNGE |   (SF xor OF)=1  | меньше/не больше и не равно|
         |_________|__________________|____________________________|
         |         |                  |                            |
         | JLE/JNG |   ((SF xor OF)   |     меньше или равно/      |
         |         |     or ZF)=1     |         не больше          |
         |_________|__________________|____________________________|
         |         |                  |                            |
         |   JNC   |      CF=0        |        нет переноса        |
         |_________|__________________|____________________________|
         |         |                  |                            |
         | JNE/JNZ |      ZF=0        |      не равно/не нуль      |
         |_________|__________________|____________________________|
         |         |                  |                            |
         |   JNO   |      OF=0        |       нет переполнения     |
         |_________|__________________|____________________________|
         |         |                  |                            |
         | JNP/JPO |      PF=0        |       нет паритета/        |
         |         |                  |      паритет нечетный      |
         |_________|__________________|____________________________|
         |         |                  |                            |
         |   JNS   |      SF=0        |           знак +           |
         |_________|__________________|____________________________|
         |         |                  |                            |
         |   JO    |      OF=1        |          переполнение      |
         |_________|__________________|____________________________|
         |         |                  |                            |
         | JP/JPE  |      PF=1        |       есть паритет/        |
         |         |                  |       паритет четный       |
         |_________|__________________|____________________________|
         |         |                  |                            |
         |   JS    |      SF=1        |           знак -           |
         |_________|__________________|____________________________|
         
                           Примечания:
                              1. Термины  "выше" и  "ниже"  применимы
                                 для  сравнения  беззнаковых  величин
                                 (адресов).
                              2. Термины    "больше"    и    "меньше"
                                 используются при учете знака числа.
                              3. Слова   xor    и    or    обозначают
                                 соответствующие логические операции.
               
               
               
               


               
               
 
                                     - 36 -
         
         
               
                              6.3. Итерации.
               
               
               Инструкции   управления    итерациями    могут    быть
         использованы   для   регулирования   повторений  программных
         циклов. Они используют содержимое регистра  CX  как  счетчик
         повторений.   Подобно  условным  переходам  инструкции  этой
         группы  являются  самоотносительными  и  могут  осуществлять
         только короткие передачи управления, т.е. в пределах от -128
         до +127.
               
               
               
         LOOP короткая-метка           ЦИКЛ
         -------------------
               Инструкция LOOP уменьшает содержимое регистра CX на  1
         и  передает управление по указанному адресу, если в CX не 0;
         в противном случае выполняется следующая за LOOP инструкция.
               
               
               
         LOOPE/LOOPZ короткая-метка    ЦИКЛ, ПОКА РАВНО/НУЛЬ
         --------------------------
               Эти  2  обозначения  являются  различными  мнемониками
         одной   инструкции,   по   которой  содержимое  регистра  CX
         уменьшается на 1,  и  управление  передается  по  указанному
         адресу, если в CX не 0 и флаг ZF равен 1; в противном случае
         выполняется следующая инструкция.
               
               
               
         LOOPNE/LOOPNZ короткая-метка  ЦИКЛ, ПОКА НЕ РАВНО/НЕ НУЛЬ
         ----------------------------
               Эти  2  обозначения  являются  различными  мнемониками
         одной   инструкции,   по   которой  содержимое  регистра  CX
         уменьшается на 1,  и  управление  передается  по  указанному
         адресу, если в CX не 0 и флаг ZF равен 0; в противном случае
         выполняется следующая инструкция.
               
               
               
         JCXZ короткая-метка           ПЕРЕХОД, ЕСЛИ В CX 0
         -------------------
               Инструкция  JCXZ  передает  управление  по  указанному
         адресу,  если  регистр  CX  содержит  0;  в противном случае
         выполняется следующая за JCXZ  инструкция.  Инструкция  JCXZ
         может   использоваться  в  начале  цикла  для  распознавания
         ситуации, когда CX уже содержит 0.
               
               
               
               
                    
               
 
                                     - 37 -
         
         
                                6.4. Прерывания.
               
               
               Инструкции  этой  группы  позволяют   использовать   в
         программах  сервисные  функции, обеспечиваемые через аппарат
         прерываний операционной системы. С этой  целью  генерируется
         программное  прерывание,  эффект  которого  подобен  эффекту
         аппаратных  прерываний.  Однако, процессор не выполняет цикл
         передачи   подтверждения   прерывания,    если    прерывание
         инициировано программой или связано с NMI.
               Инструкции   прерываний  каждая  по-своему  влияют  на
         состояния флагов процессора.
               
               
               
         INT номер-прерывания          ПРЕРЫВАНИЕ
         --------------------
               Инструкция INT активизирует процедуру, предусмотренную
         для  обработки  прерывания  с  указанным  номером. Указатель
         стека SP уменьшается  на  2,  в  стек  помещаются  флаги  (в
         формате инструкции PUSHF) и флаги TF и IF устанавливаютя в 0
         (для запрета пошагового режима  и  маскируемых  прерываний).
         Затем SP уменьшается еще на 2, и в стек заносится содержимое
         регистра    CS.    Адрес    указателя    прерывания    (т.е.
         местонахождение  адреса  программы   обработки   прерывания)
         вычисляется  путем  умножения  указанного  в  инструкции INT
         номера  на  4:  второе  слово  указателя  замещает  значение
         регистра  CS. SP снова уменьшается на 2, и в стек помещается
         содержимое регистра IP, а в сам IP  заносится  первое  слово
         указателя.
               Если указан номер прерывания 3,  ассемблер  генерирует
         короткую (1 байт) форму инструкции, известную как прерывание
         по достижению точки выхода.
               Программные  прерывания   могут   использоваться   как
         "вызовы  супервизора", т.е. для запроса сервиса операционной
         системы, в частности,  процедур,  написанных  для  обработки
         аппаратных прерываний.
               
               
               
         INTO                      ПРЕРЫВАНИЕ, ЕСЛИ ЕСТЬ ПЕРЕПОЛНЕНИЕ
         ----
               По    инструкции    INTO    генерируется   программное
         прерывание, если установлен в 1 флаг OF; в противном  случае
         управление передается  следующей инструкции  без активизации
         процедуры обработки прерывания. Инструкция INTO обращается к
         требуемой  процедуре  (номер прерывания - 4) через указатель
         прерывания,   расположенный   по   16-ричному   адресу   10,
         устанавливает в 0 флаги TF  и  IF  и  в  остальном  работает
         также,  как  INT. Инструкция INTO может использоваться после
         арифметических  или  логических   операций   для   обработки
         возможных переполнений.
               
               
               
 
                                     - 38 -
         
         
         INT3                          ТОЧКА ВЫХОДА
         ----
               Выполнение  этой  инструкции  эквивалентно  прерыванию   с
         номером  3  ("достигнута  точка  выхода").  Ассемблер генерирует
         короткую, 1-байтную машинную инструкцию.
               
               
               
         IRET                          ВОЗВРАТ ИЗ ПРЕРЫВАНИЯ
         ----
               По  инструкции  IRET  управление  возвращается в точку
         прерывания  путем  восстановления   из   стека   содержимого
         регистров IP и CS и значений  флагов,  помещенных  туда  при
         возникновении  прерывания.  Эта  инструкция используется для
         выхода как из программных, так и из аппаратных прерываний.
                                                       
                                     - 39 -

               
               
               
               
               
                      7. Инструкции управления процессором.
               
               
               Инструкции этого типа позволяют  программно  управлять
         различными  функциями  CPU  и  условно  подразделяются на  3
         группы, соответствующие 3-м типам  операций:  манипуляции  с
         флагами,  синхронизация и пустая операция. Только 1-я группа
         инструкций влияет на состояния флагов процессора.
               
               
               
               
               
               
                         7.1. Операции с флагами.
               
               
         CLC                           УСТАНОВИТЬ В 0 ФЛАГ ПЕРЕНОСА
         ---
               Флаг  переноса  CF  устанавливается  в  0;   состояния
         остальных  флагов  не  изменяются.  Использование инструкций
         CLC, STC и CMC весьма полезно  в  сочетании  с  инструкциями
         вращения RCL и RCR.
               
               
         STC                           УСТАНОВИТЬ В 1 ФЛАГ ПЕРЕНОСА
         ---
               Флаг  переноса  CF  устанавливается  в  1;   состояния
         остальных  флагов  не  изменяются.  Использование инструкций
         CLC, STC и CMC весьма полезно  в  сочетании  с  инструкциями
         вращения RCL и RCR.
               
               
               
         CMC                           ДОПОЛНЕНИЕ ФЛАГА ПЕРЕНОСА
         ---
               Состояние    флага    переноса    CF   изменяется   на
         противоположное; состояния  остальных  флагов  не  меняются.
         Использование  инструкций  CLC,  STC  и CMC весьма полезно в
         сочетании с инструкциями вращения RCL и RCR.
               
               
               
         CLD                          УСТАНОВИТЬ В 0 ФЛАГ НАПРАВЛЕНИЯ
         ---
               Флаг  направления  DF,  используемый   в   инструкциях
         обработки  строк,  устанавливается  в  0,  что  обеспечивает
 
                                     - 40 -
         
         
         автоматическое увеличение содержимого регистров SI и/или DI.
         Состояния остальных флагов не изменяются.
               
               
               
         STD                          УСТАНОВИТЬ В 1 ФЛАГ НАПРАВЛЕНИЯ
         ---
               Флаг  направления  DF,  используемый   в   инструкциях
         обработки  строк,  устанавливается  в  1,  что  обеспечивает
         автоматическое уменьшение содержимого регистров SI и/или DI.
         Состояния остальных флагов не изменяются.
               
               
               
         CLI                УСТАНОВИТЬ В 0 ФЛАГ РАЗРЕШЕНИЯ ПРЕРЫВАНИЙ
         ---
               Флаг  разрешения  прерываний IF устанавливается в 0, в
         результате чего  процессор  не  будет  распознавать  внешние
         запросы  на  прерывания,  появляющиеся  на  линии INTR, т.е.
         блокируются    маскируемые     прерывания.     Немаскируемые
         прерывания,  появляющиеся  на  линии NMI, воспринимаются как
         программные прерывания. Инструкция CLI на  состояния  других
         флагов не влияет.
               
               
               
         STI                УСТАНОВИТЬ В 1 ФЛАГ РАЗРЕШЕНИЯ ПРЕРЫВАНИЙ
         ---
               Флаг  разрешения  прерываний  IF  устанавливается в 1;
         остальные флаги своих значений не меняют. При IF=1 процессор
         способен  распознавать  маскируемые прерывания, появляющиеся
         на линии INTR. Заметим,  однако,  что  прерывание  не  будет
         распознано  до  тех пор, пока не выполнится следующая за STI
         инструкция.
               
               
               
               
               
                            7.2. Внешняя синхронизация.
               
               
               
         HLT                           ОСТАНОВ ПРОЦЕССОРА
         ---
               Инструкция  HLT  переводит   процессор   в   состояние
         останова,  которое  будет  сохраняться  до  тех пор, пока не
         произойдет одно из следующих событий:
               1. Появление сигнала на линии RESET.
               2. Появление   запроса  на   немаскируемое  прерывание
                  (на линии NMI).
               3. Появление   запроса   на    маскируемое  прерывание
                  (на линии INTR).
               Выполнение  инструкции  HLT  на  состояния  флагов  не
         влияет.    HLT   может   использоваться   как   альтернатива
 
                                     - 41 -
         
         
         бесконечному программному  циклу,  когда  программа  ожидает
         прерывание.
               
               
               
         WAIT                          ОЖИДАНИЕ
         ----
               Инструкция   WAIT   переводит  процессор  в  состояние
         ожидания, которое будет сохраняться до тех пор,  пока  линия
         TEST неактивна. На состояния флагов WAIT не влияет.
               
               
               
         ESC код-внешней-операции,источник       ВЫХОД
         ---------------------------------
               По  этой  инструкции внешнему по отношению к 8086/8088
         процессору передаются  указанные  код  операции  и  операнд.
         Код-внешней-операции     представляет     собой    6-битовую
         непосредственно   представленную   константу,   по   которой
         ассемблер  формирует  машинную инструкцию. Внешний процессор
         имеет  монитор  системного  транспортера  и  при  выполнении
         процессором  8086/8088  инструкции  ESC захватывает этот код
         операции. Если в качестве источника задан регистр, процессор
         8086/8088 ничего не  делает.  Если  указан  операнд  памяти,
         процессор  получает  содержимое  памяти и "отбрасывает" его.
         Внешний процессор может захватить операнд памяти при  чтении
         его процессором из памяти.
               
               
               
         LOCK                          БЛОКИРОВАТЬ ТРАНСПОРТЕР
         ----
               LOCK  представляет  собой  1-байтный  префикс, который
         заставляет процессор  8086/8088  (минимальной  конфигурации)
         блокировать  сигнал  транспортера  LOCK  на время выполнения
         следующей инструкции. Состояния флагов не изменяются.
               
               
               
               
               
                           7.3. Пустая операция.
               
               
               
         NOP                           ПУСТАЯ ОПЕРАЦИЯ
         ---
               Процессор не выполняет никаких действий.
                   
                                     - 42 -
               
               
               
               
               
               
                 Приложение 3. Инструкции процессоров 8086/8088.
                           
                           
                           
                           
                           Условные обозначения:    
                             
                  accum   -  аккумулятор AL или AX
                  reg     -  один из регистров данных: AX,AL,
                             AH,BX,BL,BH,CX,CL,CH,DX,DL или DH      
                  segreg  -  один из регистров сегмента:                  
                             CS,DS,SS или ES     
                  r/m     -  один из общих операндов:                
                                 - регистр    
                                 - адрес памяти    
                                 - индексный операнд
                                 - базированный операнд
                                 - базо-индексный операнд
                  immed   -  8- или 16-битовое значение:
                             константа или число
                  mem     -  один из операндов памяти:      
                                 - метка
                                 - переменная
                                 - символ
                  label   -  метка инструкции
                  src     -  источник в операциях со строками
                  dest    -  приемник в операциях со строками
           
           
                      
                      
                      
                      
                      
                           
                           Инструкции пересылки данных
                           
         ________________________________________________________________    
         |          |               |                                   |  
         | код оп.  |   операнды    |           функция                 |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  MOV     |   accum,mem   |  пересылка: память в аккумулятор  |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  MOV     |   mem,accum   |  пересылка: аккумулятор в память  |
         |__________|_______________|___________________________________|
 
                                     - 43 -
         
         
         ________________________________________________________________
         |          |               |                                   |
         |  MOV     |  r/m,immed    |  пересылка: непосредственное      |
         |          |               |             в операнд             |    
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  MOV     |  r/m,reg      |  пересылка: регистр в операнд     |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  MOV     |  r/m,segreg   |  пересылка: регистр сегмента      |
         |          |               |             в операнд             |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  MOV     |  reg,immed    |  пересылка: непосредственное      |
         |          |               |             в регистр             |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  MOV     |  reg,r/m      |  пересылка: операнд в регистр     |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  MOV     |  segreg,r/m   |  пересылка: операнд в регистр     |
         |          |               |             сегмента              |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  PUSH    |     r/m       |  запоминание в стеке 16-битового  |
         |          |               |  операнда                         |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  PUSH    |     reg       |  запоминание в стеке 16-битового  |
         |          |               |  регистра                         |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  PUSH    |    segreg     |  запоминание в стеке регистра     |
         |          |               |  сегмента                         |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  PUSHF   |               |  запоминание в стеке флагов       |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  POP     |     r/m       |  извлечение из стека 16-битового  |
         |          |               |  операнда                         |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  POP     |     reg       |  извлечение из стека 16-битового  |
         |          |               |  регистра                         |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  POP     |    segreg     |  извлечение из стека регистра     |
         |          |               |  сегмента                         |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  POPF    |               |  извлечение из стека флагов       |
         |__________|_______________|___________________________________|
               
               
  

                                     - 44 -
         
         
         ________________________________________________________________
         |          |               |                                   |
         |  XCHG    |   accum,reg   |  обмен аккумулятора с регистром   |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  XCHG    |    r/m,reg    |  обмен операнда с регистром       |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  XCHG    |   reg,accum   |  обмен регистра с аккумулятором   |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  XCHG    |   reg,r/m     |  обмен регистра с операндом       |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  XLAT    |      mem      |  перекодировка байта              |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  LEA     |      r/m      |  загрузка исполнительного адреса  |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  LDS     |      r/m      |  загрузка операнда с DS           |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  LES     |      r/m      |  загрузка операнда с ES           |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  LAHF    |               |  загрузка флагов в AH             |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  SAHF    |               |  запись AH в регистр флагов       |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  IN      |  accum,immed  |  ввод из порта(8-битовый непоср.) |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  IN      |   accum,DX    |  ввод из порта, заданного в DX    |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  OUT     |  immed,accum  |  вывод в порт(8-битовый непоср.)  |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  OUT     |   DX,accum    |  вывод в порт, заданный в DX      |
         |__________|_______________|___________________________________|
         
         
               
               
               
               
               
               
               
         
         
              
 
                                     - 45 -
         
         
                 Арифметические, логические и инструкции сдвига
 
         ________________________________________________________________
         |          |               |                                   |
         | код оп.  |   операнды    |             функция               |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  ADD     |  accum,immed  |  сложение непосредственного с     |
         |          |               |  аккумулятором                    |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  ADD     |   r/m,immed   |  сложение непосредственного с     |
         |          |               |  операндом                        |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  ADD     |    r/m,reg    |  сложение регистра с операндом    |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  ADD     |    reg,r/m    |  сложение операнда с регистром    |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  ADC     |  accum,immed  |  сложение с переносом непосред-   |
         |          |               |  ственного с аккумулятором        |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  ADC     |   r/m,immed   |  сложение с переносом непосред-   |
         |          |               |  ственного с операндом            |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  ADC     |    r/m,reg    |  сложение с переносом регистра    |
         |          |               |  с операндом                      |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  ADC     |    reg,r/m    |  сложение с переносом операнда    |
         |          |               |  с регистром                      |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  INC     |      r/m      |  увеличение операнда на 1         |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  INC     |      reg      |  увеличение 16-битового регистра  |
         |          |               |  на 1                             |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  AAA     |               |  настройка ASCII для сложения     |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  DAA     |               | десятичная настройка для сложения |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  SUB     |  accum,immed  |  вычитание непосредственного      |
         |          |               |  из аккумулятора                  |
         |__________|_______________|___________________________________|
               
               
 
 
                                     - 46 -
         
         
         ________________________________________________________________
         |          |               |                                   |
         |  SUB     |   r/m,immed   |  вычитание непосредственного      |
         |          |               |  из операнда                      |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  SUB     |   r/m,reg     |  вычитание регистра из операнда   |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  SUB     |   reg,r/m     |  вычитание операнда из регистра   |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  SBB     |  accum,immed  |  вычитание с заемом непосредст-   |
         |          |               |  венного из аккумулятора          |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  SBB     |   r/m,immed   |  вычитание с заемом непосредст-   |
         |          |               |  венного из операнда              |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  SBB     |    r/m,reg    |  вычитание с заемом регистра      |
         |          |               |  из операнда                      |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  SBB     |    reg,r/m    |  вычитание с заемом операнда      |
         |          |               |  из регистра                      |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  DEC     |      r/m      |  уменьшение операнда на 1         |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  DEC     |      reg      |  уменьшение 16-битового регистра  |
         |          |               |  на 1                             |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  NEG     |      r/m      |  дополнение до 2 операнда         |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  CMP     |  accum,immed  |  сравнение непосредственного      |
         |          |               |  с аккумулятором                  |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  CMP     |   r/m,immed   |  сравнение непосредственного      |
         |          |               |  с операндом                      |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  CMP     |    r/m,reg    |  сравнение регистра с операндом   |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  CMP     |    reg,r/m    |  сравнение операнда с регистром   |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  AAS     |               |  настройка ASCII для вычитания    |
         |__________|_______________|___________________________________|
               
 
                                     - 47 -
         
         
         ________________________________________________________________
         |          |               |                                   |
         |  DAS     |               | десятичная настройка для вычитания|
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  MUL     |      r/m      | умножение аккумулятора на операнд |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  IMUL    |      r/m      |  целочисленное умножение          |
         |          |               |  аккумулятора на операнд          |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  AAM     |               |  настройка ASCII для умножения    |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  DIV     |      r/m      |  деление аккумулятора на операнд  |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  IDIV    |      r/m      |  целочисленное деление            |
         |          |               |  аккумулятора на операнд          |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  AAD     |               |  настройка ASCII для деления      |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  CBW     |               |  преобразование байта в слово     |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  CWD     |               |  преобразование слова в двойное   |
         |          |               |  слово                            |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  NOT     |      r/m      |  инверсия операнда                |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  AND     |  accum,immed  |  побитовое И непосредственного    |
         |          |               |  с аккумулятором                  |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  AND     |   r/m,immed   |  побитовое И непосредственного    |
         |          |               |  с операндом                      |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  AND     |    r/m,reg    |  побитовое И регистра с операндом |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  AND     |    reg,r/m    |  побитовое И операнда с регистром |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  OR      |  accum,immed  |  побитовое ИЛИ непосредственного  |
         |          |               |  с аккумулятором                  |
         |__________|_______________|___________________________________|
               
               
               
 

                                     - 48 -
         
         
         ________________________________________________________________
         |          |               |                                   |
         |  OR      |   r/m,immed   |  побитовое ИЛИ непосредственного  |
         |          |               |  с операндом                      |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  OR      |    r/m,reg    |  побитовое ИЛИ регистра с         |
         |          |               |  операндом                        |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  OR      |    reg.r/m    |  побитовое ИЛИ операнда с         |
         |          |               |  регистром                        |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  XOR     |  accum,immed  |  побитовое исключающее ИЛИ непо-  |
         |          |               |  средственного с аккумулятором    |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  XOR     |   r/m,immed   |  побитовое исключаюшее ИЛИ непо-  |
         |          |               |  средственного с операндом        |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  XOR     |    r/m,reg    |  побитовое исключающее ИЛИ        |
         |          |               |  регистра с операндом             |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  XOR     |    reg,r/m    |  побитовое исключающее ИЛИ        |
         |          |               |  операнда с регистром             |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  TEST    |  accum,immed  |  побитовое сравнение непосредст-  |
         |          |               |  веного с аккумулятором           |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  TEST    |   r/m,immed   |  побитовое сравнение непосредст-  |
         |          |               |  венного с операндом              |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  TEST    |    r/m,reg    |  побитовое сравнение регистра     |
         |          |               |  с операндом                      |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  TEST    |    reg,r/m    |  побитовое сравнение операнда     |
         |          |               |  c регистром                      |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  SHL     |     r/m,1     |  логический сдвиг операнда        |
         |          |               |  влево на 1 бит                   |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  SHL     |     r/m,CL    |  логический сдвиг операда         |
         |          |               |  влево на число бит в CL          |
         |__________|_______________|___________________________________|
               
               
 
                                     - 49 -
         
         
         ________________________________________________________________
         |          |               |                                   |
         |  SHR     |     r/m,1     |  логический сдвиг операнда        |
         |          |               |  вправо на 1 бит                  |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  SHR     |     r/m,CL    |  логический сдвиг операнда        |
         |          |               |  вправо на число бит в CL         |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  SAL     |     r/m,1     |  арифметический сдвиг операнда    |
         |          |               |  влево на 1 бит                   |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  SAL     |     r/m,CL    |  арифметический сдвиг операнда    |
         |          |               |  влево на число бит в CL          |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  SAR     |     r/m,1     |  арифметический сдвиг операнда    |
         |          |               |  вправо на 1 бит                  |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  SAR     |     r/m,CL    |  арифметический сдвиг операнда    |
         |          |               |  вправо на число бит в CL         |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  ROL     |     r/m,1     |  вращение операнда влево на 1 бит |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  ROL     |     r/m,CL    |  вращение операнда влево          |
         |          |               |  на число бит в CL                |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  ROR     |     r/m,1     | вращение операнда вправо на 1 бит |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  ROR     |     r/m,CL    |  вращение операнда вправо         |
         |          |               |  на число бит в CL                |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  RCL     |     r/m,1     |  вращение с переносом операнда    |
         |          |               |  влево на 1 бит                   |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  RCL     |     r/m,CL    |  вращение с переносом операнда    |
         |          |               |  влево на число бит в CL          |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  RCR     |     r/m,1     |  вращение с переносом операнда    |
         |          |               |  вправо на 1 бит                  |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  RCR     |     r/m,CL    |  вращение с переносом операнда    |
         |          |               |  вправо на число бит в CL         |
         |__________|_______________|___________________________________|
 
                                     - 50 -
         
         



                           Инструкции обработки строк 
                           
         ________________________________________________________________    
         |          |               |                                   |  
         | код оп.  |   операнды    |           функция                 |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  MOVS    |   dest,src    |  пересылка строки                 |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  MOVSB   |               |  пересылка строки побайтно        |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  MOVSW   |               |  пересылка строки по словам       |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  CMPS    |   dest,src    |  сравнение строк                  |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  CMPSB   |               |  сравнение строк по байтам        |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  CMPSW   |               |  сравнение строк по словам        |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  SCAS    |     dest      |  сканирование строки              |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  SCASB   |               |  сканирование строки по байтам    |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  SCASW   |               |  сканирование строки по словам    |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  LODS    |     dest      |  загрузка строки                  |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  LODSB   |               |  загрузка байта                   |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  LODSW   |               |  загрузка слова                   |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  STOS    |     dest      |  сохранение строки                |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  STOSB   |               |  сохранение байта                 |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  STOSW   |               |  сохранение слова                 |
         |__________|_______________|___________________________________|
         
 
                                     - 51 -
         
         
         
         
         
                       

                       Инструкции передачи управления
                       
                       
         ________________________________________________________________
         |          |               |                                   |
         |  код оп. |   операнды    |            функция                |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  JA/JNBE |     label     |  переход, если выше               |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  JAE/JNB |     label     |  переход, если выше или равно     |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  JB/JNAE |     label     |  переход, если ниже               |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  JBE/JNA |     label     |  переход, если ниже или равно     |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  JC      |     label     |  переход, если был перенос        |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  JE/JZ   |     label     |  переход, если равно (нуль)       |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  JG/JNLE |     label     |  переход, если больше             |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  JGE/JNL |     label     |  переход, если больше или равно   |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  JL/JNGE |     label     |  переход, сли меньше              |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  JLE/JNG |     label     |  переход, если меньше или равно   |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  JMP     |     label     |  безусловный переход по метке     |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  JMP     |      r/m      |  безусловный переход по           |
         |          |               |  косвенному адресу                |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  JNC     |     label     |  переход, если не было переноса   |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  JNE/JNZ |     label     |  переход, если не равно (не нуль) |
         |__________|_______________|___________________________________|
 
                                     - 52 -
         
         
         ________________________________________________________________
         |          |               |                                   |
         |  JNO     |     label     |  переход, если не было            |
         |          |               |  переполнения                     |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         | JNP/JPO  |     label     |  переход, если нет четности       |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  JNS     |     label     |  переход, если нет знака          |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  JO      |     label     |  переход, если было переполнение  |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  JP/JPE  |     label     |  переход, если есть четность      |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  JS      |     label     |  переход, если есть знак          |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  JCXZ    |     label     |  переход, если в CX - нули        |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  CALL    |     label     |  вызов процедуры по имени         |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  CALL    |      r/m      |  вызов процедуры по косвенному    |
         |          |               |  адресу                           |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  RET     |    [immed]    |  возврат из процедуры             |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  LOOP    |     label     |  цикл                             |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  LOOPE/  |     label     |  цикл, пока равно (нуль)          |
         |  LOOPZ   |               |                                   |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  LOOPNE/ |     label     |  цикл, пока не равно (не нуль)    |
         |  LOOPNZ  |               |                                   |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  REP     |               |  повторение                       |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  REPE/   |               |  повторение, пока равно (нуль)    |
         |  REPZ    |               |                                   |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  REPNE/  |               |  повторение, пока не равно        |
         |  REPNZ   |               |  (не нуль)                        |
         |__________|_______________|___________________________________|
 
                                     - 53 -
         
         
         ________________________________________________________________
         |          |               |                                   |
         |  INT3    |               |  программное прерывание с кодом 3 |
         |          |               |  (1-байтная команда)              |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  INT     |     immed     |  программное прерывание (0-255)   |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  INTO    |               |  прерывание по переполнению       |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  IRET    |               |  возврат из прерывания            |
         |__________|_______________|___________________________________|
               
         
     
         
         
         
                         Инструкции управления процессором
                         
                         
         ________________________________________________________________
         |          |               |                                   |
         |  код оп. |    операнды   |            функция                |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  STC     |               |  установка флага переноса         |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  CLC     |               |  сброс флага переноса             |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  CMC     |               |  дополнение флага переноса        |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  STD     |               |  установка флага направления      |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  CLD     |               |  сброс флага направления          |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  STI     |               |  установка флага разрешения       |
         |          |               |  прерывания                       |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  CLI     |               | сброс флага разрешения прерывания |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  HLT     |               |  останов системы                  |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  WAIT    |               |  ожидание активности шины TEST    |
         |__________|_______________|___________________________________|
 
                                     - 54 -
         
         
         ________________________________________________________________
         |          |               |                                   |
         |  ESC     |   immed,r/m   |  переключение кода для внешнего   |
         |          |               |  процессора с 6-битовым непосред- |
         |          |               |  венным и операндом               |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  LOCK    |               |  блокировка шины при выполнении   |
         |          |               |  следующей команды                |
         |__________|_______________|___________________________________|
         |          |               |                                   |
         |  NOP     |               |  нет операции                     |
         |__________|_______________|___________________________________|