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