[Назад] [Далее]

5.1.2. Структуры CASE

Управляющая структура типа CASE проверяет значение некоторой переменной (или выражения) и передает управление на различные участки программы. Кажется очевидным, что эта структура должна реализовываться в виде серии структур IF... THEN... ELSE, как показано в примерах, где требовались различные действия в зависимости от значения нажатой клавиши.

Пусть переменная I принимает значения от 0 до 2, и в зависимости от значения надо выполнить процедуры case0, casel и case2:

        mov        ax,I
        cmp        ax,0           ; проверка на 0
        jne        not0
        call       case0
        jmp        endcase
not0:   cmp        ax,1           ; проверка на 1
        jne        not1
        call       case1
        jmp        endcase
not1:   cmp        ax,2           ; проверка на 2
        jne        not2
        call       case2
not2:
endcase:

Но ассемблер предоставляет более удобный способ реализации таких структур — таблицу переходов.

        mov        bx,I
        shl        bx,1      ; умножить ВХ на 2 (размер адреса
                             ; в таблице переходов - 4 для 32-битных адресов)
        jmp        cs:jump_table[bx]       ; разумеется,
                             ; в этом примере достаточно использовать call

jump_table         dw    foo0,foo1,foo2    ; таблица переходов

foo0:   call       case0
        jmp        endcase
foo1:   call       case1
        jmp        endcase
foo2:   call       case2
        jmp        endcase

Очевидно, что для большого числа значений переменной способ с таблицей переходов гораздо быстрее (не требуется многочисленных проверок), а если большая часть значений переменной — числа, следующие в точности друг за другом (так что в таблице переходов не окажется пустых участков), то эта реализация структуры CASE окажется еще и значительно меньше.


п»ї
"target=_blank><\/a>") //-->