Страница 1 из 1

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

Добавлено: 01 ноя 2012, 00:20
rhf-admin

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

Добавлено: 01 ноя 2012, 02:13
molyman
Да Админ челом бью, как еще башня по этой теме соображает, учились где али самоучением занимаетесь?

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

Добавлено: 01 ноя 2012, 09:32
rhf-admin
Учился конечно, но и самоучением тоже. Ты же знаешь как у нас учат, - теории много, практики мало и неинтересно.

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

Добавлено: 14 ноя 2015, 17:09
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 байт.

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

Добавлено: 07 янв 2016, 01:13
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
  ...

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

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

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

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

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

Добавлено: 08 янв 2016, 22:04
Fahivec
rhf-admin писал(а):Или компилятор сам всё поймёт и нужный адрес вычислит, если ему такой код написать :?:
Ну да, компилятор сам эти адреса и пересчитывает. :)