Реализация оператора case of на ассемблере

Общие вопросы функционирования и программирования МК, обсуждение типовых алгоритмов...
Ответить
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 2951
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
фанатичный радиохламер
Контактная информация:

Реализация оператора case of на ассемблере

Сообщение rhf-admin » 01 ноя 2012, 00:20

С уважением, администрация сайта.

molyman
спонсор, инженер, идеолог, читатель
спонсор, инженер, идеолог, читатель
Сообщения: 362
Зарегистрирован: 15 май 2011, 17:03
Откуда: г.Москва
фанатичный радиохламер
Контактная информация:

Re: Реализация оператора case of на ассемблере

Сообщение molyman » 01 ноя 2012, 02:13

Да Админ челом бью, как еще башня по этой теме соображает, учились где али самоучением занимаетесь?
Если хочешь что-то сделать, сделай это сам!

Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 2951
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
фанатичный радиохламер
Контактная информация:

Re: Реализация оператора case of на ассемблере

Сообщение rhf-admin » 01 ноя 2012, 09:32

Учился конечно, но и самоучением тоже. Ты же знаешь как у нас учат, - теории много, практики мало и неинтересно.
С уважением, администрация сайта.

Fai
инженер, программист, читатель
инженер, программист, читатель
Сообщения: 213
Зарегистрирован: 01 июн 2011, 13:02

Re: Реализация оператора case of на ассемблере

Сообщение Fai » 14 ноя 2015, 17:09

Еще для пика можно было бы сделать так:

Код: Выделить всё

	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
...
работает отлично, время перехода всегда одинаковое, надо только следить за непересечением границ в 256 байт.

Аватара пользователя
Fahivec
писатель, читатель
писатель, читатель
Сообщения: 101
Зарегистрирован: 30 дек 2014, 02:17
Откуда: Из-за речки
настоящий радиохламер

Re: Реализация оператора case of на ассемблере

Сообщение Fahivec » 07 янв 2016, 01:13

Для 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
  ...
Тест пройден! :geek:

Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 2951
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
фанатичный радиохламер
Контактная информация:

Re: Реализация оператора case of на ассемблере

Сообщение rhf-admin » 07 янв 2016, 01:33

Поскольку таблица переходов расположена в програмной памяти статично, проще загружать в индексный регистр начальный адрес этой таблицы
Согласен, так ещё оптимальнее :) , но это я уж так, немножко от лени (пусть железка сама за меня считает)...
Или компилятор сам всё поймёт и нужный адрес вычислит, если ему такой код написать :?:

P.S. Кстати, я тут решил продолжить эту статью циклом всяких таких небольших ассемблерных кульбитов (а то в нете вообще критически мало всего по ассемблеру, даже обидно).
Вот ещё один подобный опус.

P.S. Если у кого-то есть какие-то подобные примеры небольших полезных алгоритмов, которые по-всякому, по-разному можно реализовать - выкладываем, не стесняемся. ;)
С уважением, администрация сайта.

Аватара пользователя
Fahivec
писатель, читатель
писатель, читатель
Сообщения: 101
Зарегистрирован: 30 дек 2014, 02:17
Откуда: Из-за речки
настоящий радиохламер

Re: Реализация оператора case of на ассемблере

Сообщение Fahivec » 08 янв 2016, 22:04

rhf-admin писал(а):Или компилятор сам всё поймёт и нужный адрес вычислит, если ему такой код написать :?:
Ну да, компилятор сам эти адреса и пересчитывает. :)
Тест пройден! :geek:

Ответить