          Логика и Организация Программы
          
          Цель:  Раскрыть  механизм  передачи  управления  в программе
          (циклы  и переходы)  для логических сравнений  и программной
          организации.
          
          ВВЕДЕНИЕ
          ------------------------------------------------------------
          
             До этой главы примеры выполнялись последовательно команда
          за командой. Однако, программируемые задачи редко бывают так
          просты.  Большинство программ содержат ряд циклов, в которых
          несколько  команд  повторяются  до  достижения определенного
          требования,  и  различные  проверки,  определяюшие  какие из
          нескольких действий  следует выполнять.  Обычным требованием
          является   проверка   -   должна   ли   программа  завершить
          выполнение.
             Эти требования  включают  передачу  управления  по адресу
          команды, которая не находится непосредственно за выполняемой
          в текущий момент командой. Передача управления может осущест
          вляться вперед для выполнения новой группы команд  или назад
          для повторения уже выполненных команд.
             Некоторые команды  могут  передавать  управление, изменяя
          нормальную    последовательность    шагов   непосредственной
          модификацией  значения смещения в командном  указателе. Ниже
          приведены  четыре  способа  передачи  управления  (все будут
          рассмотрены в этой главе):
             
                    Безусловный переход:  JMP
                    Цикл:                 LOOP
                    Условный переход:     Jnnn (больше,меньше,равно)
                    Вызов процедуры:      CALL
             
             Заметим, что имеется три типа адресов: SHORT, NEAR и FAR.
          Адресация SHORT используется при  циклах, условных пеpеходах
          и некоторых  безусловных  переходах.  Адресация  NEAR  и FAR
          используется  для  вызовов  процедур  (CALL)  и  безусловных
          переходов,  которые не квалифицируются ,  как SHORT. Все три
          типа передачи управления воздействуют на содержимое регистра
          IP; тип FAR также изменяет регистр CS.
             
          КОМАНДА JMP
          ------------------------------------------------------------
             
             Одной из команд обычно используемых  для передачи управле
          ния является команда JMP.  Эта команда выполняет безусловный
          переход,  т.е.  обеспечивает  передачу  управления при любых
          обстоятельствах.


          
          Ассемблер для IBM PC. Глава 7                            133


             В COM-программе на рис.  7.1  используется команда JMP. В
          pегистры AX,  BX,  и CX  загружается значение  1,  и затем в
          цикле выполняются следующие операции:
             
                    прибавить 1 к регистру AX,
                    прибавить AX к BX,
                    удвоить значение в регистре CX.
             
          Повторение цикла приводит к увеличению  содержимого регистра
          AX:  1,2,3,4...,  регистра BX:  1,3,6,10...,  и регистра CX:
          1,2,4,8... Начало цикла имеет метку, в данном случае, A20: -
          двоетичие  oбозначает,  что метка находится внутри процедуры
          (в  данном  случае  BEGIN)  в сегменте  кода.  В конце цикла
          находится команда
          
                                   JMP  A20
          
          которая указывает на то, что управление должно быть передано
          команде c меткой A20.  Обратите внимание, что адресная метка
          в операнде  команды   указывается без двоеточия. Данный цикл
          не имеет выхода и приводит к бесконечному выполнению - такие
          циклы обычно не используются.
          
          ------------------------------------------------------------
          ------------------------------------------------------------
                    Рис.7.1. Использование команды JMP.
          
             Метку можно кодировать на одной строке с командой:
             
                              A20:   ADD   AX,01
          
          или на отдельной строке:
          
                              A20:
                                     ADD   AX,01
          
          В обоих случаях адрес  A20  указывает на первый байт команды
          ADD.  Двоеточие в метке A20  указывает на тип метки  - NEAR.
          Запомните:  отсутствие  двоеточия  в  метке  является частой
          ошибкой.  В нашем примере  A20  соответствует  -9  байтам от
          команды  JMP,  в  чем  можно  убедиться  по  объектному коду
          команды -  EBF7.  EB  представляет  собой  машинный  код для
          короткого  перехода  JMP,  а  F7  -  отрицательное  значение
          смещения  (-9).  Команда  JMP  прибавляет  F7  к  командному
          указателю  (IP),  котоpый  содержит адрес  команды после JMP
          (0112):
          
                                        Дес. Шест.
               Командный указатель:     274  112
               Адрес в команде JMP:      -9   F7 (двоичное дополнение)
               Адрес перехода:          265  109
          


          
          Ассемблер для IBM PC. Глава 7                            134


          В результате сложения получается адрес перехода - шест. 109.
          Проверьте  по  листингу  программы,  что относительный адрес
          метки  действительно соответствует  шест.109. Соответственно
          операнд в команде  JMP для перехода  вперед имеет положитель
          ное значение.
             Команда JMP для перехода  в пределах  -128  до  +127 байт
          имеет  тип   SHORT.   Ассемблер  генерирует  в  этом  случае
          однобайтовый операнд в пределах  от  00  до FF. Команда JMP,
          превосходящая эти пределы,  получает  тип FAR,  для которого
          генерируется другой  машинный  код  и  двухбайтовый операнд.
          Ассемблер в первом  просмотре исходной  программы определяет
          длину каждой команды.  Однако, команда JMP может быть длиной
          два  или три байта.  Если  к моменту  просмотра  команды JMP
          ассемблер  уже  вычислил  значение  опеpанда  (при  переходе
          назад):
                         A50:
                              ...
                              JMP  A50
             
          то он генерирует двухбайтовую команду. Если ассемблер еще не
          вычислил значение операнда (при переходе вперед)
          
                              JMP  A90
                              ...
                         A90:
          
          то он  не знает тип  перехода NEAR или FAR,  и автоматически
          генерирует  3-х байтовую  команду.  Для того,  чтобы указать
          ассемблеру на необходимость  генерации двухбайтовой команды,
          следует использовать оператор SHORT:
          
                              JMP  SHORT A90
                              ...
                         A90:
          
             В  качестве  полезного  упражнения,   введите  программу,
          проассемблируйте ее,  скомпануйте и переведите в COM-формат.
          Определение данных не  требуется, поскольку непосредственные
          операнды  генерируют  все  необходимые  данные.  Используйте
          отладчик  DEBUG  для  пошагового  выполнения   COM-модуля  и
          просмотрите несколько  повторений  цикла.  Когда  регистр AX
          будет содержать 08,  BX и CX  увеличатся  до  шест. 24 (дес.
          36)  и  шест.  80  (дес. 128), соответственно. Для выхода из
          отладчика используйте команду Q.
          
          КОМАНДА LOOP
          ------------------------------------------------------------
          
             Команда JMP в  примере на рис.  7.1 реализует бесконечный
          цикл.   Но  более  вероятно  подпрограмма  должна  выполнять
          определенное число циклов.  Команда LOOP, которая служит для
          этой цели,  использует начальное значение  в регистре  CX. В
          каждом цикле команда LOOP автоматически уменьшает содержимое

          
          Ассемблер для IBM PC. Глава 7                            135


          регистра  CX  на  1.  Пока  значение  в  CX  не  равно нулю,
          управление  передается  по адресу,  указанному в операнде, и
          если в CX будет 0,  управление переходит  на слудующую после
          LOOP команду.
             Программа на рис. 7.2, иллюстрирующая использование коман
          ды LOOP, выполняет действия, аналогичные примеру на рис. 7.1
          за  исключением  того,  что  после  десяти  циклов программа
          завершается. Команда MOV инициализирует регистр CX значением
          10.  Так  как  команда  LOOP  использует  регистр  CX,  то в
          программе для удвоения начального значения 1 вместо регистра
          CX используется DX.  Команда JMP A20  заменена командой LOOP
          и для эффективности команда ADD AX,01  заменена командой INC
          AX (увеличение AX на 1).
             Аналогично команде JMP,  операнд команды  LOOP определяет
          расстояние от конца команды LOOP  до адреса метки  A20, кото
          рое прибавляется  к  содержимому  командного  указателя. Для
          команды LOOP это расстояние  должно быть в пределах  от -128
          до +127 байт. Если  операнд превышает эти границы, то ассемб
          лер выдаст сообщение "Relative jump out of range" (превышены
          границы перехода).
             Для   проверки   команды   LOOP   рекомендуется  изменить
          соответствующим  образом программу,  приведенную на рис.7.1,
          выполнить ее ассемблирование,  компановку и преобразование в
          COM-файл.  Для трассировки  всех  десяти  циклов используйте
          отладчик DEBUG.  Когда в значение регистре CX  уменьшится до
          нуля,  содержимое регистpов AX, BX и DX будет соответственно
          шест.  000B,  0042  и 0400.  Для выхода из отладчика введите
          команду Q.
             Дополнительно существует две разновидности команды LOOP -
          это LOOPE (или  LOOPZ)  и LOOPNE  (или  LOOPNZ). Обе команды
          также  уменьшают значение  регистра  CX на 1.  Команда LOOPE
          передает управление  по  адресу  операнда,  если  регистр CX
          имеет ненулевое  значение  и  флаг  нуля  установлен (ZF=1).
          Команда LOOPNE передает управление по  адресу операнда, если
          регистр CX  имеет ненулевое значение  и  флаг  нуля  сброшен
          (ZF=0).
          
          ------------------------------------------------------------
          ------------------------------------------------------------
                    Рис. 7.2. Использование команды LOOP.
          
          ФЛАГОВЫЙ РЕГИСТР
          ------------------------------------------------------------
          
             Следующий материал данной главы  требует более детального
          ознакомления с флаговым регистром.  Этот pегистр содержит 16
          бит  флагов,  которые  управляются различными  командами для
          индикации состояния операции.  Во всех случаях флаги сохраня
          ют свое значение до тех пор,  пока другая команда не изменит
          его. Флаговый регистр содержит следующие девять используемых
          бит (звездочками отмечены неиспользуемые биты):
             
               Номер бита:    15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

          
          Ассемблер для IBM PC. Глава 7                            136


               Флаг:           *  *  *  *  O  D I T S Z * A * P * C
             
          Рассмотрим эти флаги в последовательности справа налево.
             
             CF  (Carry  Flag)  -  флаг  переноса.  Содержит  значение
          "переносов"  (0  или 1) из  старшего разряда при арифметичес
          ких  операциях и некоторых операциях  сдвига  и циклического
          сдвига (см. гл.12).
             
             PF  (Parity   Flag)  -  флаг  четности. Проверяет младшие
          восемь бит pезультатов операций над данными.  Нечетное число
          бит приводит к установке этого флага в 0, а четное - в 1. Не
          следует путать флаг четности с битом контроля на четность.
             
             AF (Auxiliary Carry Flag) - дополнительный флаг переноса.
          Устанавливается в 1,  если  арифметическая операция приводит
          к   переносу четвертого справа бита (бит номер 3) в регистро
          вой однобайтовой  команде.  Данный  флаг   имеет отношение к
          арифметическим  операциям  над  символами  кода  ASCII  и  к
          десятичным упакованным полям.
             
             ZF (Zero Flag)  -  флаг  нуля. Устанавливается в качестве
          результата  aрифметических  команд   и команд сравнения. Как
          это  ни  странно,  ненулевой  результат приводит к установке
          нулевого  значения  этого   флага,  а нулевой -  к установке
          единичного  значения.  Кажущееся   несоответствие  является,
          однако,  логически  правильным,  так  как 0 обозначает "нет"
          (т.е.  результат не равен нулю),  а единица  обозначаeт "да"
          (т.е. результат равен нулю). Команды условного перехода JE и
          JZ проверяют этот флаг.
             
             SF (SIgn Flag) - знаковый флаг. Устанавливается в соответ
          ствии со  знаком результата (старшего бита)  после  арифмети
          ческих опеpаций:  положительный результат устанавливает 0, а
          отрицательный  -  1.  Команды  условного  перехода  JG  и JL
          проверяют этот флаг.
             
             TF  (Trap Flag)  -  флаг пошагового выполнения. Этот флаг
          вам уже приходилось устанавливать,  когда  использовалась ко
          манда Т в отладчике DEBUG.  Если этот флаг  установлен в еди
          ничное cостояние, то  процессор переходит в режим пошагового
          выполнения   команд,  т.е.  в каждый момент выполняется одна
          команда под пользовательским управлением.
             
             IF (Interrupt Flag) - флаг прерывания. При нулевом состоя
          нии  этого  флага  прерывания  запрещены,  при  единичном  -
          разрешены.
             
             DF (DIrection  Flag)   - флаг направления. Используется в
          строковых операциях   для  определения  направления передачи
          данных. При нулевом состоянии команда увеличивает содержимое



          
          Ассемблер для IBM PC. Глава 7                            137


          регистров SI и  DI,   вызывая передачу данных слева направо,
          при нулевом  -  уменьшает содержимое этих регистров, вызывая
          передачу данных справа налево (см. гл.11).
             
             OF (Overflow Flag)  - флаг переполнения. Фиксирует арифме
          тическое  переполнение,  т.е. перенос в/из старшего (знаково
          го) бита при знаковых арифметических операциях.
             В качестве примера:  команда CMP сравнивает  два операнда
          и воздействуте на флаги AF,  CF, OF, PF, SF, ZF. Однако, нет
          необходимости проверять все эти флаги по отдельности. В сле-
          дующем  примере проверяется содержит  ли  регистр BX нулевое
          значение:
             
                         CMP  BX,00          ;Сравнение BX с нулем
                         JZ   B50            ;Переход на B50 если нуль
                         .    (действия при ненуле)
                         .
               B50:      ...                 ;Точка перехода при BX=0
          
          Если BX содержит нулевое значение, команда CMP устанавливает
          флаг нуля ZF в единичное состояние, и возможно изменяет (или
          нет)  другие флаги. Команда JZ (перехлд если нуль) проверяет
          только флаг  ZF.  При  единичном  значении  ZF, обозначающее
          нулевой  признак,  команда  передает  управление  на  адрес,
          указанный в ее операнде, т.е. на метку B50.
          
          КОМАНДЫ УСЛОВНОГО ПЕРЕХОДА
          ------------------------------------------------------------
          
             В предыдущих  примерах  было  показано,  что команда LOOP
          уменьшает на единицу содержимое регистра CX и проверяет его:
          если не ноль, то управление передается по адресу, указанному
          в операнде.  Таким  образом,  передача управления зависит от
          конкретного   состояния.   Ассемблер   поддерживает  большое
          количество  команд условного  перехода, которые осуществляют
          передачу управления  в  зависимости  от  состояний флагового
          регистра.  Например,  при сравнении  содержимого  двух полей
          последующий переход зависит от значения флага.
             Команду LOOP в программе на рис.7.2 можно заменить на две
          команды:  одна  уменьшает содержимое  регистра  CX, а другая
          выполняет условный переход:
             
             Использование LOOP    Использование условного перехода
             
                    LOOP A20                 DEC  CX
                                             JNZ  A20
          Команды  DEC  и  JNZ  действуют   аналогично  команде  LOOP:
          уменьшают содержимое регистра CX на 1 и выполняет переход на
          метку  A20,  если  в CX  не  ноль.  Команда  DEC  кроме того
          устанавливает флаг нуля во  флаговом регистре в  состояние 0
          или 1.  Команда JNZ затем проверяет эту установку. В рассмот
          ренном примере команда LOOP хотя и имеет огпаниченное исполь
          зование, но более эффективна, чем две команды: DEC и JNZ.

          
          Ассемблер для IBM PC. Глава 7                            138


             Аналогично  командам  JMP и LOOP  операнд  в  команде JNZ
          cодержит  значение  расстояния  между концом  команды  JNZ и
          адресом  A20,  которое прибавляется  к командному указателю.
          Это расстояние должно быть в пределах от -128  до +127 байт.
          В случае перехода за эти границы ассемблер  выдаст сообщение
          "Relative jump out of range"  (превышены относительные грани
          цы перехода).
             
             Знаковые и беззнаковые данные.
             
             Рассматривая назначение команд условного перехода следует
          пояснить характер их использования.  Типы данных, над которы
          ми выполняются арифметические операции и  операции сравнения
          определяют  какими командами  пользоваться: беззнаковыми или
          знаковыми.  Беззнаковые данные используют все  биты как биты
          данных;  характерным  примером  являются  символьные строки:
          имена,  адреса и натуральные числа.  В знаковых данных самый
          левый бит представляет собой знак,  причем если его значение
          равно  нулю,  то число  положительное,  и  если  единице, то
          отрицательное.  Многие  числовые  значения  могут  быть  как
          положительными так и отрицательными.
             В качестве примера предположим,  что регистр  AX содержит
          11000110, а BX - 00010110. Команда
             
                                   CMP  AX,BX
             
          сравнивает  содержимое  регистров  AX  и  BX.   Если  данные
          беззнаковые,  то значение в AX больше,  а если знаковые - то
          меньше.
             
             Переходы для беззнаковых данных.
             
          Мнемоника      Описание                 Проверяемые флаги
          
          JE/JZ     Переход, если равно/нуль                ZF
          JNE/JNZ   Переход, если не равно/не нуль          ZF
          JA/JNBE   Переход, если выше/не ниже или равно    ZF,CF
          JAE/JNB   Переход, если выше или равно/не ниже    CF
          JB/JNAE   Переход, если ниже/не выше или равно    CF
          JBE/JNA   Переход, если ниже или равно/не выше    CF,AF
          
             Любую проверку можно кодировать одним из  двух мнемоничес
          ких  кодов.  Например,  JB и JNAE  генерирует один и  тот же
          объектный код,  хотя положительную проверку JB легче понять,
          чем отрицательную JNAE.
             
             Переходыдля знаковых данных
             
          Мнемоника      Описание                 Проверяемые флаги
          
          JE/JZ     Переход, если равно/нуль                  ZF
          JNE/JNZ   Переход, если не равно/не нуль            ZF
          JG/JNLE   Переход, если больше/не меньше или равно  ZF,SF,OF

          
          Ассемблер для IBM PC. Глава 7                            139


          JGE/JNL   Переход, если больше или равно/не меньше     SF,OF
          JL/JNGE   Переход, если меньше/не больше или равно     SF,OF
          JLE/JNG   Переход, если меньше или равно/не больше  ZF,SF,OF
          
             Команды перехода для условия равно или ноль (JE/JZ)  и не
          равно  или не  ноль  (JNE/JNZ)  присутствуют в обоих списках
          для беззнаковых   и  знаковых  данных. Состояние  равно/нуль
          происходит вне зависимости от наличия знака.
             
             Специальныеарифметическиепроверки
             
          Мнемоника      Описание                 Проверяемые флаги
          
               JS   Переход, если есть знак (отрицательно)       SF
               JNS  Переход, если нет знака(положительно)        SF
               JC   Переход, если есть перенос (аналогично JB)   CF
               JNC  Переход, если нет переноса                   CF
               JO   Переход, если есть переполнение              OF
               JNO  Переход, если нет переполнения               OF
               JP/JPE Переход, если паритет четный               PF
               JNP/JP Переход, если паритет нечетный             PF
          
             Еще  одна  команда условного перехода  проверяет равно ли
          содержимое  регистра  CX  нулю.  Эта  команда  необязательно
          должна pасполагаться непосредственно  за командой арифметики
          или  сравнения.  Одним из  мест для команды  JCXZ может быть
          начало  цикла,  где она  проверяет  содержит  ли  регистр CX
          ненулевое значение.
             Не спешите пока заучивать эти команды наизусть. Запомните
          только,  что для беззнаковых данных есть  переходы по состоя
          ниям  равно,  выше  или ниже,  а  для беззнаковых  -  равно,
          больше или меньше.  Переходы по  проверкам  флагов переноса,
          переполнения  и паритета имеют  особое назначение. Ассемблер
          транслирует  мнемонические коды  в объектный  код независимо
          от того,  какую из двух команд вы применили. Однако, команды
          JAE и  JGE  являясь  явно  одинаковыми,  проверяют различные
          флаги.
             
             
          
          ОРГАНИЗАЦИЯ ПРОГРАММ
          ------------------------------------------------------------
          
             Ниже даны  основные рекомендации для  написания ассемблер
          ных программ:
             
          1.   Четко представляйте себе задачу, которую должна  решить
               программа
          
          2.   Сделайте  эскиз задачи  в  общих  чертах  и спланируйте
               общую логику программы. Например, если необходимо прове
               рить операции пеpесылки нескольких  байт (как в примере
               на рис.7.5), начните c определения полей с  пересылаемы
               ми  данными.  Затем спланируйте   общую  стратегию  для
               инициализации,  условного  перехода  и   команды  LOOP.
               Приведем  основную  логику,  которую  используют многие
               программисты в таком случае:
                    инициализация стека и сегментных регистров
                    вызов подпрограммы цикла
                    возврат
               Подпрограмма цикла может быть спланирована следующим
               образом:
                         инициализация регистров значениями адресов

          
          Ассемблер для IBM PC. Глава 7                            149


                         и числа циклов
               Метка:    пересылка одного байта
                         увеличение адресов на 1
                         уменьшение счетчика на 1:
                              если счетчик не ноль, то идти на метку
                              если ноль, возврат
          
          3.   Представьте программу в виде логических  блоков, следую
               щих друг за другом.  Процедуры не превышающие  25 строк
               (размер экрана) удобнее для отладки.
          
          4.   Пользуйтесь тестовыми примерами программ. Попытки запом
               нить все технические детали и  программирование сложных
               программ "из головы"  часто  приводят  к многочисленным
               ошибкам.
          
          5.   Используйте комментарии для описания  того,  что должна
               делать  процедура,  какие  арифметические  действия или
               операции сравнения будут выполняться и что делают редко
               используемые  команды.   (Например,  команда  XLAT,  не
               имеющая операндов).
          
          6.   Для кодирования программы используйте заготовку програм
               мы, скопированной в файл с новым именем.
          
             В  следующих  программах  данной  книги  важным  является
          использование  команды LEA,  индексных  регистров  SI  и DI,
          вызываемых  процедур.   Получив  теперь  базовые  знания  по
          ассемблеру,  можем перейти  к  более  развитому  и полезному
          программированию.
             
          ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
          ------------------------------------------------------------
          
          ▀    Метки процедур (например, B20:) должны завершаться двое
               точием  для указания  типа  NEAR.  Отсутствие двоеточия
               приводит к ассемблерной ошибке.
          
          ▀    Метки  для  команд  условного  перехода  и  LOOP должны
               лежать в границах  -128  до  +127  байт.  Операнд таких
               команд генерирует  один байт объектного  кода. Шест. от
               01  до 7F  соответствует десятичным значениям  от +1 до
               +127,  а шест.  от FF до 80 покрывает значения от -1 до
               +128. Так как длина машинной команды может быть от 1 до
               4  байт,  то соблюдать границы  не  просто. Практически
               можно ориентироваться на размер в  два экрана исходного
               текста (примерно 50 строк).
          
          ▀    При использовании команды LOOP, инициализируйте регистр
               CX  положительным  числом.  Команда  LOOP  контролирует
               только  нулевое значение,  при  отрицательном программа
               будет продолжать циклиться.
          

          
          Ассемблер для IBM PC. Глава 7                            150


          ▀    Если некоторая команда  устанавливает  флаг,  то данный
               флаг сохраняет это значение, пока другая команда его не
               изменит.  Например,  если  за  арифметической командой,
               которая устанавливает флаги,  следуют  команды  MOV, то
               они  не  изменят   флаги. Однако, для минимизации числа
               возможных ошибок,  cледует кодировать команды условного
               перехода непосредственно  после команд, устанавливающих
               проверяемые флаги.
          
          ▀    Выбирайте  команды  условного  перехода  соответственно
               операциям над знаковыми или беззнаковыми данными.
          
          
          ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
          ------------------------------------------------------------
          
          7.1.   Какое максимальное количество байт могут обойти коман
                 ды коpоткий JMP,  LOOP и относительный переход? Какой
                 машинный код операнда при этом генерируется?
          7.2.   Команда  JMP  начинается  на  шест.  0624. Определите
                 адрес перехода, если шест. объектный код для операнда
                 команды JMP: а) 27, б) 6B, в) C6.
          7.3.   Напишите  программу вычисления 12  чисел Фибоначи: 1,
                 1,   2,   3,   5,   8,   13,...   (каждое   число   в
                 последовательности  представляет   собой  сумму  двух
                 предыдущих чисел).  Для организации цикла используйте
                 команду LOOP. Выполните ассемблирование, компановку и
                 с помощью отладчика DEBUG трассировку программы.



          
          Ассемблер для IBM PC. Глава 7                            151


          7.4.   Предположим,  что регистры AX и  BX содержат знаковые
                 данные,  a CX и DX -  беззнаковые. Определите команды
                 CMP (где необходимо)  и команды безусловного перехода
                 для следующих проверок:
                 а) значение в DX больше, чем в CX?
                 б) значение в BX больше, чем в AX?
                 в) CX содержит нуль?
                 г) было ли переполнение?
                 д) значение в BX равно или меньше, чем в AX?
                 е) значение в DX равно или меньше, чем в CX?
          7.5.   На какие флаги воздействуют следующие события и какое
                 значение этих флагов?
                 a) произошло переполнение;
                 б) результат отрицательный;
                 в) результат нулевой;
                 г) обработка в одношаговом режиме;
                 д) передача данных должна быть справа налево.
          7.6.   Что произойдет при выполнении программы , приведенной
                 на   рис.7.4,    если   в   процедуре   BEGIN   будет
                 отсутствовать команда RET?
          7.7.   Какая  разница между  кодированием  в  директиве PROC
                 опеpанда с типом FAR и с типом NEAR?
          7.8.   Каким  образом  может  программа   начать  выполнение
                 процедуры?
          7.9.   В  EXE-программе  процедура  A10  вызывает  B10,  B10
                 вызывает C10,  а C10  вызывает D10.  Сколько адресов,
                 кроме  начальных  адресов  возврата  в  DOS, содержит
                 стек?
          7.10.  Предположим , что регистр BL содержит 11100011 и поле
                 по имени BOONO содержит 01111001. Определите воздейст
                 вие  на  регистр  BL  для  следующих  команд:  а) XOR
                 BL,BOONO;  б)  AND BL,BOONO;  в) OR  BL,BOONO; г) XOR
                 BL,11111111B; д) AND BL,00000000B.
          7.11.  Измените  программу на  рис.7.6  для:  а) определения
                 содержимого TITLEX заглавными буквами; б) преобразова
                 ние заглавных букв  в  строчные.
          7.12.  Предположим,   что  регистр   DX   содержит  10111001
                 10111001,  а  pегистр CL -  03. Определите содержимое
                 регистра  DX  после следующих несвязанных  команд: а)
                 SHR DX,1;  б)  SHR DX,CL;  в) SHL DX,CL; г) SHL DL,1;
                 д) ROR DX,CL; е) ROR DL,CL; ж) SAL DH,1.
          7.13.  Используя  команды  сдвига,   пересылки  и  сложения,
                 умножьте содержимое  регистра  AX  на 10.
          7.14.  Пример программы,  приведенной в конце раздела "сдвиг
                 и   циклический  сдвиг",   умножает  содержимое  пары
                 регистров  DX:AX на  2.  Измените  программу  для: а)
                 умножения на 4;  б) деления на 4; в) умножения 48 бит
                 в регистрах DX:AX:BX на 2.






          
