На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 1 / Макро псевдо-CASE Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Макро псевдо-CASE

Последнее макро, которое мы ввели в этой главе,есть макро псевдо-case, представленное Листингом 1-17. Так как макро должно иметь "предвидение" о поддерживаемых в нем структурах, мы не будем рассматривать его как оператор структурного управления. По своим функциям макро case более походит на блок диспетчеризации, типа вычисляемого оператора GOTO в языке Фортран.



                     Листинг 1-17. Описание макро псевдо-саse

         ----------------------------------------------------------------
            @Case        MACRO    кey,сase_list,jmр_labels
                         ??tmp_1  = 0
                         IRP      match,<&case_list> ;;последователь-
                                                    ;;ность вариантов
                           ??tmp_1= ??tmp_1 + 1  ;;установить номер
                                                 ;;индекса
                           cmp    key,&&match  ;вариант найден?
                           ??tmp_2= 0
                           IRP    retl,<&jmp_labels> ;;последователь-
                                                    ;;ность переходов
                             ??tmp_2=0 ??tmp_2 + 1  ;; до достижения
                                                    ;; индекса
                             IF   (??tmp_1 EQ ??tmp_2)
                               je &&&retl                     ; Да!
                               EXITM
                             ENDIF    ;;конец проверки условия
                           ENDM       ;;закончить 2-ой блок IRP
                         ENDM         ;;закончить 1-ый блок IRP
                         ENDM         ;;закончить макроописание
         ---------------------------------------------------------------

Это макро являет собой хороший пример одновременного синтаксического анализа двух списков. Внешний цикл, irp match,<&case_list>, устанавливает последовательность элементов списка вариантов, а внутренний цикл, irp retl,<&jmp_labels>, выбирает соответствующие метки переходов.Такое решение может быть использовано для реализации макросов подстановки.


В макросах подстановки внешний цикл устанавливает последова тельность элементов списка и выявляет совпадение. После определения совпадения, скажем на элементе xth, макро входит во внутренний цикл и устанавливает последовательность элемента xth этого списка. Одним из возможных вариантов реализации может быть создание макро переход_по_невыполнению_условия, где выбранный переход должен был бы заменяться на противоположный. Еще раз напомним, что во вложенных макроблоках необходимо использовать дополнительные амперсанды.


Расширение макро @Case представлено в Листинге 1-18. За то, чтобы в каждом списке появлялся один и тот же номер элемента, отвечает программист. В противном случае может быть получена неверная структура управления.



                    Листинг 1-18. Расширение макро псевдо-@Case

         ----------------------------------------------------------------
                @Case    al,<'A','B','C','D'>,
            2              cmp   al,'A'    ;вариант соответствует?
            3              je    subA               ; да!
            2              cmp   al,'B'    ;вариант соответствует?
            3              je    subB               ; да!
            2              cmp   al,'C'    ;вариант соответствует?
            3              je    subC               ; да!
            2              cmp   al,'D'    ;вариант соответствует?
            3              je    subD               ; да!
                subA:
                         jmp     merge
                subB:
                         jmp     merge
                subC:
                         jmp     merge
                subD:
                         jmp     merge
                default:
                merge:
         ----------------------------------------------------------------

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz