Оператор выбора switch
Оператор switch (переключатель) в программе на ассемблере можно реализовать
несколькими способами. В данной главе мы рассмотрим два наиболее общих и рас-
пространенных способа — с использованием команд сравнения и с использовани-
ем таблицы. Тем не менее на практике можно встретить и другие способы реализа-
ции оператора switch, наиболее полно отражающие условия конкретной решаемой
задачи (см., например [8] и некоторые примеры в данной книге).
238 Глава
Программирование типовых управляющих структур
В нотации языков С и C++ синтаксис оператора switch выглядит так:
switch
{
case константное
операнд_1
case константное
оп.еранд_2
default:
>
Простейший способ реализации оператора switch в программе на ассемблере
заключается в организации последовательных сравнений с условными перехода-
ми. К примеру, необходимо обработать три возможные альтернативы в програм-
ме, которые идентифицируются целочисленными значениями
;...
al,l ;проверка первой альтернативы (константное
]е
;равно, идем на обработку
cmp
;проверка второй альтернативы (константное
je
;равно, идем на обработку
cmp al,3 ;проверка третьей альтернативы (константное
je handle_condition2
идем на обработку
;если
| 2 | 3 , то производим обработку по умолчанию
команд для обработки по умолчанию
end_switch ;уходим на конец switch
команд для обработки
jmp end_switch ;уходим на конец s w i t c h
команд для обработки
jmp end_switch ;уходим на конец switch
команд для обработки
программы
Второй, более элегантный способ реализации конструкции, соответствующей
оператору switch, — табличный. Сразу отмечу, что данный материал логичнее рас-
сматривать после изучения главы 13, посвященной сложным структурам данных.
Поэтому, если у вас возникнут трудности с пониманием представленного здесь
материала, пропустите его и вернитесь к нему позже.
Для реализации рассматриваемого способа в памяти моделируется некоторое
подобие таблицы. Каждая строка таблицы состоит из двух ячеек. Строки таблицы
располагаются в памяти последовательно — друг за другом. В первой ячейке таб-
лицы располагается значение
во второй ячейке — адрес
если выполняется условие
= конс-
Целью адреса перехода может быть процедура или метка, со-
ответствующая фрагменту кода, обрабатывающему выполнение условия, задан-
ного в заголовке оператора выбора. Реализация табличным способом приведенного
ранее примера будет выглядеть так:
db 1
dw
db 2
dw
db
3
dw handle
Оператор выбора switch 239
;
mov
mov
mov
альтернатив
al,[bx] ;проверка очередной альтернативы
jne next_
следующему элементу
ptr
;на обработку совпадения
add bx,3
следующей строки таблицы -> bx
next_:
если
то производим обработку по умолчанию
команд для обработки по умолчанию
jmp
;уходим, куда нужно
последовательность команд для обработки
jmp
куда нужно
последовательность команд для обработки
jmp
куда нужно
последовательность команд для обработки
jmp ... ;уходим, куда нужно
... ;продолжение программы
Для лучшего структурирования программы последовательность команд
обработки условия
можно оформить в виде процедур:
table_switch db 1
процедуры
db 2
dw
процедуры
db 3
dw
;адрес процедуры
proc
команд для обработки
endp
proc
команд для обработки
endp
proc
команд для обработки
endp
.
mov
mov
table_switch
mov
;счетчик циклов=количество альтернатив
cmp al,[bx]
очередной альтернативы
jne next_
следующему элементу
word ptr [bx+1] ;на обработку совпадения
jmp end_switch
add
следующей строки таблицы -> bx
next_:
;если
то производим обработку по умолчанию
240
Программирование типовых управляющих структур
команд для обработки по умолчанию
программы
Do'stlaringiz bilan baham: |