Реализация оператора case of на ассемблере
- rhf-admin
- администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
- Сообщения: 3060
- Зарегистрирован: 25 авг 2009, 23:19
- Откуда: Уфа
- Контактная информация:
Реализация оператора case of на ассемблере
С уважением, администрация сайта.
-
- спонсор, инженер, идеолог, читатель
- Сообщения: 362
- Зарегистрирован: 15 май 2011, 17:03
- Откуда: г.Москва
- Контактная информация:
Re: Реализация оператора case of на ассемблере
Да Админ челом бью, как еще башня по этой теме соображает, учились где али самоучением занимаетесь?
Если хочешь что-то сделать, сделай это сам!
- rhf-admin
- администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
- Сообщения: 3060
- Зарегистрирован: 25 авг 2009, 23:19
- Откуда: Уфа
- Контактная информация:
Re: Реализация оператора case of на ассемблере
Учился конечно, но и самоучением тоже. Ты же знаешь как у нас учат, - теории много, практики мало и неинтересно.
С уважением, администрация сайта.
Re: Реализация оператора case of на ассемблере
Еще для пика можно было бы сделать так:
работает отлично, время перехода всегда одинаковое, надо только следить за непересечением границ в 256 байт.
Код: Выделить всё
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
...
Re: Реализация оператора case of на ассемблере
Для AVR с использованием индексного перехода (последний листинг в статье) нет необходимости извлекать содержимое счетчика команд через стэк.
Поскольку таблица переходов расположена в програмной памяти статично, проще загружать в индексный регистр начальный адрес этой таблицы:
Поскольку таблица переходов расположена в програмной памяти статично, проще загружать в индексный регистр начальный адрес этой таблицы:
Код: Выделить всё
...
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
- администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
- Сообщения: 3060
- Зарегистрирован: 25 авг 2009, 23:19
- Откуда: Уфа
- Контактная информация:
Re: Реализация оператора case of на ассемблере
Согласен, так ещё оптимальнее , но это я уж так, немножко от лени (пусть железка сама за меня считает)...Поскольку таблица переходов расположена в програмной памяти статично, проще загружать в индексный регистр начальный адрес этой таблицы
Или компилятор сам всё поймёт и нужный адрес вычислит, если ему такой код написать
P.S. Кстати, я тут решил продолжить эту статью циклом всяких таких небольших ассемблерных кульбитов (а то в нете вообще критически мало всего по ассемблеру, даже обидно).
Вот ещё один подобный опус.
P.S. Если у кого-то есть какие-то подобные примеры небольших полезных алгоритмов, которые по-всякому, по-разному можно реализовать - выкладываем, не стесняемся.
С уважением, администрация сайта.
Re: Реализация оператора case of на ассемблере
Ну да, компилятор сам эти адреса и пересчитывает.rhf-admin писал(а):Или компилятор сам всё поймёт и нужный адрес вычислит, если ему такой код написать
Тест пройден!