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

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

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

Сообщение rhf-admin »

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

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

Сообщение molyman »

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

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

Сообщение rhf-admin »

Учился конечно, но и самоучением тоже. Ты же знаешь как у нас учат, - теории много, практики мало и неинтересно.
С уважением, администрация сайта.
Fai
инженер, программист, читатель
инженер, программист, читатель
Сообщения: 213
Зарегистрирован: 01 июн 2011, 13:02

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

Сообщение Fai »

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

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

	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
писатель, читатель
писатель, читатель
Сообщения: 121
Зарегистрирован: 30 дек 2014, 02:17
Откуда: Из-за речки

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

Сообщение Fahivec »

Для 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
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

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

Сообщение rhf-admin »

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

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

P.S. Если у кого-то есть какие-то подобные примеры небольших полезных алгоритмов, которые по-всякому, по-разному можно реализовать - выкладываем, не стесняемся. ;)
С уважением, администрация сайта.
Аватара пользователя
Fahivec
писатель, читатель
писатель, читатель
Сообщения: 121
Зарегистрирован: 30 дек 2014, 02:17
Откуда: Из-за речки

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

Сообщение Fahivec »

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