Давай разберем варианты. Первый вариант.
; В r16 состояние автомата.
cpi r16,0
breq Label_1
cpi r16,1
breq Label_2
Неплохой вариант, минус-" -64 < k <+63 "
Относительно компактно.
Приведенный мною вариант:
.macro Case
cpi STREG,@0
brne Exit_Case
rjmp @1
Exit_Case:
.endmacro
Позволяет перейти практически куда угодно.
Минус-если много кейсов, жрет много кода.
Третий-самый компактный вариант-индексный переход:
; В r16 состояние автомата.
cpi r16,States_Quantity
clr ZH
mov ZL,r16
ldi ZL,LOW(-Table_States*2)
ldi ZH,HIGH(-Table_States*2)
lpm r17,Z+
lpm r16,Z
movw ZH:r17,ZL:r16
ijmp
Возможно есть варинаты оптимальнее. Укажи. Буду знать.