Реализация оператора case of на ассемблере
Добавлено: 01 ноя 2012, 00:20
полезные устройства из радиохлама
http://radiohlam.ru/forum/
Код: Выделить всё
movf switch_var,w
andlw 0x03 ; для безопасности :)
addwf pcl,f
goto case_0
goto case_1
goto case_2
goto case_3
;
case_0
; код для случая 0.
return
;
case_1
; код для случая 1.
return
...
Код: Выделить всё
...
Start_Case:
ldi ZH, high(Tab_jmp - Ch1) ; загружаем адрес начала таблицы минус начальное значение возможных вариантов,
ldi ZL, low(Tab_jmp - Ch1) ; чтобы после вычисления смещение в таблице для числа Ch1 было нулевое
add ZL,T0 ; добавляем T0 (вычисляем адрес команды
; перехода на нужный "оператор")
brcc NotC ; если флаг переноса не установился -
inc ZH ; пропускаем эту команду
NotC:
ijmp ; и переходим по вычисленному адресу в блок переходов
; здесь можно было сохранить в стек ZL и ZH
; а потом выполнить команду ret, но
; ijmp - короче и быстрее
Tab_jmp: ; начало блока переходов
rjmp Op1 ; переход на процедуру для Ch1
rjmp Op2 ; переход на процедуру для Ch2
...
Согласен, так ещё оптимальнее , но это я уж так, немножко от лени (пусть железка сама за меня считает)...Поскольку таблица переходов расположена в програмной памяти статично, проще загружать в индексный регистр начальный адрес этой таблицы
Ну да, компилятор сам эти адреса и пересчитывает.rhf-admin писал(а):Или компилятор сам всё поймёт и нужный адрес вычислит, если ему такой код написать