| [Назад] [Далее] | ![]() |
Управляющая структура типа 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 окажется еще и значительно меньше.