В настоящее время у меня есть этот код:
// takes a table reference as an argument
.macro load_table_into_r0_to_r8
ldi ZL, low(2*@0)
ldi ZH, high(2*@0)
lpm r25, Z+
mov r0, r25
lpm r25, Z+
mov r1, r25
lpm r25, Z+
mov r2, r25
lpm r25, Z+
mov r3, r25
lpm r25, Z+
mov r4, r25
lpm r25, Z+
mov r5, r25
lpm r25, Z+
mov r6, r25
lpm r25, Z+
mov r7, r25
lpm r25, Z+
mov r8, r25
.endm
Как видите, много действительно похожего кода повторяется.
Было бы смешно, если бы не было способа написать это короче, например, с помощью .irp
или, может быть, .if
s. Однако я не могу заставить это работать. Для .irp
я попробовал это:
.irp i, 0,1,2,3,4,5,6,7,8
lpm r25, Z+
mov r\i, r25
.endr
Хотя Atmel Studio выделяет .irp
(он не выделяет все, что начинается с .
), он не работает: Invalid directive: '.irp'
См. также мой другой связанный вопрос: MOV в регистр, указанный аргументом макроса а>.
lpm r\i, Z+
? - person Egor Skriptunoff   schedule 15.03.2014lpm
вr0
вr16
- person Thom Wiggers   schedule 15.03.2014load
... - person Thom Wiggers   schedule 16.03.2014movw
- person Egor Skriptunoff   schedule 16.03.2014movw r0:r1, r25:r26
. - person Thom Wiggers   schedule 18.03.2014lpm
и в нижние регистры, только неldi
. - person Thom Wiggers   schedule 21.03.2014