Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
StarCraft II Wings of Liberty |#10| Страшная Правда
StarCraft II: Wings of Liberty |#9| Шепот Судьбы
StarCraft II: Wings of Liberty |#8| Большие раскопки
Minecraft |#3| Сборная солянка и новый мир

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Различные авторы Весь текст 2311.07 Kb

Программирование и кодирование

Предыдущая страница Следующая страница
1 ... 5 6 7 8 9 10 11  12 13 14 15 16 17 18 ... 198
         тора  equ или =.  Затем эти символы вычисляются MASM и заменяются
         их значениями.  Иногда случается,  что программист забывает,  что
         аргументы макро не являются символами и наоборот.  Согласно Руко-
         водству по MASM аргументы макро заменяются действительными  пара-
         метрами  с использованием подстановки "один к одному".  Аргументы
         макро могут создаваться в одном макро  и,  используя  возможность
         текстовой подстановки, передаваться как составная строка текста в
         другое макро.  Это невозможно с символами.  Символам  может  быть
         присвоено  текстовое  значение  при помощи оператора equ,  что не
         позволяет модифицировать их впоследствии.  Только оператор = раз-
         решает  присваивать символам цифровые значения или атрибуты TYPE.
         Пример такого ограничения и один из способов его обхода представ-
         лен при рассмотрении операторов структурного управления.

             Листинг 1-13. Пример расширения обобщенного макро @PushOp
         -----------------------------------------------------------------
            dat_seg SEGMENT
            datq    dq      4040414142424343h
            dat_seg ENDS
                    .
                    .
                    .
            start:
                    @PushOp ax          ;сохранение общего регистра
            1               push   ax
                    @PushOp cs          ;сохранение регистра сегмента
            1               push   cs
                    @PuchOp al          ;сохранение короткого регистра
            2               push   ax...     ;сделать общий регистр
                    @PushOp 01234h      ;сохранить константу
            2               push   bp
            2               mov    bp,sp
            2               push   ax
            2               mov    ax,01234h
            2               xchg   [bp],ax
            2               mov    bp,ax
            2               pop    ax
                    @PushOp  'A'         ;сохранение константы
            2                push   bp
            2                mov    bp,sp
            2                push   ax

                                      - 1-31 -
            2                mov    ax,'A'
            2                xchg   [bp],ax
            2                mov    bp,ax
            2                pop    ax
                   @PushOp   start     ;сохранить смещение програм.метки
            2                push   bp
            2                mov    bp,sp
            2                push   ax
            2                mov    ax,offset start
            2                xchg   [bp],ax
            2                mov    bp,ax
            2                pop    ax
                   @PushOp   datq       ;сохранить четверную переменную
            2                push   ?argadd         ;1-ое слово
            2                push   ?argadd         ;2-ое слово
            2                push   ?argadd         ;3-ое слово
            2                push   ?argadd         ;4-ое слово
                   .
                   .
                   .
         ----------------------------------------------------------------

                Структурные операторы управления в языке Ассемблер

            Теперь, когда мы имеем все необходимые средства для построения
         структурных операторов управления,  разрешите приступить к этому.
         Наиболее  часто  употребимые  операторы  структурного  управления
         представлены в Табл. 1-8.
            Операторы Табл. 1-8 наиболее часто используются для реализации
         структурного управления в структурированных программах. В некото-
         рых языках их больше;  в других -  меньше.  Заметим  только,  что
         ФОРТРAH  добился  использования  структуры IF-THEN-ELSE в ФОРТРА-
         НЕ-77. Почти все ассемблеры не имеют таких структур для целей ко-
         дирования,  хотя  многие из них поддерживают IF-THEN-ELSE для ус-
         ловного  ассемблирования.   Причина   проста:   полагается,   что
         ассемблеры  находятся  на  более низком уровне чем языки высокого
         уровня.  Так как мы решили,  что эти структуры могут  значительно
         упростить программирование,  и мы можем реализовать их, используя
         средства, рассмотренные ранее.
            Мы упустили  из рассмотрения одну конструкцию.  Это - оператор
         CASE (выбор). Конструкция, которую мы представим, заимствована из
         синтаксиса языка Паскаль,  однако аналогичные конструкции имеются
         в Си и других языках программирования. Задача оператора CASE зак-
         лючается в проверке на равенство значения ключевой переменной var
         элементу из списка.  Если исходный оператор и варианты из  списка
         не содержатся в одном и том же макро,  невозможно определить, что
         является ключевой переменной. Вспомним, что MASM не разрешает ис-
         пользовать строки с (=) оператором назначения символа.
            Создать оператор CASE можно, перечисляя для него все вероятные
         случаи  и  соответствующие  им метки в качестве аргументов одного
         макро. Это псевдомакро рассматривается в следующем разделе данной
         главы.
            Полный список описаний структурированных макросов  управления
         приведен в Листинге 1-14. Обратите внимание на обильное использо-
         вание комментариев макро (;;), экономящих память  области  макро.
         Эти макросы вырабатывают множество символов.Они могут использова-
         ться в любом допустимом порядке с теоретическим ограничением уро-

                                      - 1-32 -
         вней вложенности до 89. Однако MASM скорее выходит за пределы па-
         мяти,  чем за предел вложенности. Никакая инициализация не требу-
         ется. Все символы самоинициализирующиеся.


                  Таблица 1-8. Операторы структурного управления

            --------------------------------------------------------
            Оператор                         Структура
            --------------------------------------------------------
            IF-THEN           IF<условие> (выполнить, если условие
                              истинно)
                              ENDIF
            IF-THEN-ELSE      IF<условие> (выполнить, если условие ис-
                              тинно)
                              ELSE (выполнить, если условие ложно)
                              ENDIF
            DO-WHILE          WHILE <условие> (выполнить, если усло-
                              вие истинно)
                              END_WHILE
            REPEAT-UNTIL      REPEAT (выполнить, если условие ложно)
                              UNTIL <условие>
            FOR-DO            FOR =  to  (выполнить
                              для каждого целого значения var между
                              begin и  end  включительно,  увеличивая
                              или уменьшая var при каждом прохождении
                              цикла)
                              END_FOR
            CASE_OF_     CASE  OF
                               (выполнить, если var = A)
                               (выполнить, если var = B)
                              .  .  .
                               (выполнить, если var = N)
                              <по умолчанию> (выполнить, если нет со-
                              ответствия)
                              END_CASE


                Листинг 1-14. Структурированные макросы управления
         -----------------------------------------------------------------

            PAGE    50,132   ;установить выдачу листинга на полный экран
            ;;********************************************************
            ;;                М А К Р О О П И С А Н И Я
            ;;********************************************************
            ;;
            FALSE   EQU     0          ;определить "FALSE"
            TRUE    EQU     0FFFFh     ;определить "TRUE"
            ;;
            ;;** @TestSym *************************SUPPORT MACRO******
            ;; Выявить, был ли определен уровень вложенности. Если нет,
            ;; то установить "?SYMDEF" для инициализации счетчика этого
            ;; уровня. Обычно все процессы первого прохода запускают
            ;; счетчик с 0. Значения всех символов в начале прохода 2
            ;; должны быть сброшены. Заметьте, что символы "?p2sw..."
            ;; остаются для "Phase 2 SWitch" (переключатели фазы 2).
            ;; Проверьте, что первым уровнем при реинициализации явля-

                                      - 1-33 -
            ;; ется уровень 10. Замечание: значение 10 выбрано для пер-
            ;; воначального уровня с тем, чтобы зарезервировать для
            ;; уровня вложенности   две цифры.
            ;;
            @TestSym MACRO p1,p2
                    IF1       ;;если 1-ый проход,проверить что определено
                    IFNDEF    &p1&p2
            ?p2sw&p1&p2      = TRUE    ;;установить для 2-го прохода
                                       ;;переопределение переключателей,
            ?symdef          = FALSE   ;;вызывающее инициал-ию счетчика
                     ELSE
            ?symdef          = true    ;;разрешить приращение счетчика
                     ENDIF   ;;конец проверки описания символа
                     ENDIF   ;;конец проверки 1-го прохода
                     ;;
                     IF2     ;;если 2-ой проход, переинициал-ать
                     IF      (?p2sw&p1&p2) ;;если переинициал. нет, то
            ?p2sw&p1&p2      = FALSE   ;;очистить переключатель переопре-
                                       ;;деления 2-го прохода
                     IF      (?p2sw&р1&10) ;; и проверить инициал-ию
                                           ;;уровня 10
                     .ERR    ;; выйти с сообщением об ошибке
                     %OUT @TestSym macro: &p1 уровень вложенности не
                     %OUT                 закрыт на 2-ом проходе
                     ENDIF   ;;закон. уровень 10 по проверке инициал-ции
            ?symdef          = FALSE   ;;вызвать переинициал-ию счетчика
                     ELSE
            ?symdef          = TRUE    ;;разрешить приращение счетчика
                     ENDIF   ;;закончить проверку "если не переинициал."
                     ENDIF   ;;закончить проверку прохода 2
                     ENDM    ;;закончить макроописание
            ;;
            ;;**@ZeroSym**************************SUPPORT MACRO********
            ;; Инициализировать счетчик последовательности вложенностей
            ;; при первом использовании
            @ZeroSym         MACRO     p1,p2
            &p1&p2 =        0
                   ENDM
            ;;
            ;; ** @IncSym *********************** SUPPORT MACRO ******
            ;; Увеличить на 1 счетчик последовательности вложенностей
            @IncSym          MACRO    p1,p2
            &p1&p2 =                  &p1&p2   + 1
                   ENDM
            ;;
            ;; ** @DecSym *********************** SUPPORT MACRO *****
            ;; Уменьшить на 1 счетчик последовательности вложенностей
            @DecSym          MACRO    p1,p2
            &p1&p2 =                  &p1&p2   -1
                   ENDM
            ;;
            ;; ** @MakeJmp2 ********************** SUPPORT MACRO *****
            ;; Вставить команду перехода (JMP) в программный код
            @MakeJmp2        MACRO    p1,p2,p3
                    jmp               &p1&p2&p3
                   ENDM

                                      - 1-34 -
            ;;
Предыдущая страница Следующая страница
1 ... 5 6 7 8 9 10 11  12 13 14 15 16 17 18 ... 198
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 

Реклама