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

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

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

notO:

not1:

not2:

endcase:

mov

ax, I

 

 

 

cmp

ax,0

; Проверка

на

0.

jne

notO

 

 

 

call

caseO

 

 

 

jmp

endcase

 

 

 

cmp

ax, 1

; Проверка

на

І.

jne

not1

 

 

 

call

easel

 

 

 

jmp

endcase

 

 

 

cmp

ax, 2

; Проверка

на

2.

jne

not2

 

 

 

call

case2

 

 

 

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

Умножить ВХ на 2 (размер адреса в таблице переходов - 4 для 32-битных адресов). Разумеется, в этом примере достаточно использовать call.

 

mov

bx,I

 

shl

bx, 1.

 

jmp

cs: jump.

3 ump_

table

dw

fooO:

call

caseO

 

jmp

endcase

fool:

call

easel

 

jmp

endcase

foo2:

call

case2

 

jmp

endcase

foo0,foo1,foo2

Таблица переходов.

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