Как мне сделать эту сборку AVR более элегантной

В настоящее время у меня есть этот код:

// 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 или, может быть, .ifs. Однако я не могу заставить это работать. Для .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 в регистр, указанный аргументом макроса .


person Thom Wiggers    schedule 14.03.2014    source источник
comment
Почему бы не просто lpm r\i, Z+ ?   -  person Egor Skriptunoff    schedule 15.03.2014
comment
потому что вы не можете lpm в r0 в r16   -  person Thom Wiggers    schedule 15.03.2014
comment
О, действительно! Почему бы не скопировать пары регистров (для копирования 2 байтов требуется всего 1 цикл): lpm в r24, lpm в r25, загрузить r0-r1 с помощью r24-r25?   -  person Egor Skriptunoff    schedule 15.03.2014
comment
Я не думаю, что у меня есть инструкция load...   -  person Thom Wiggers    schedule 16.03.2014
comment
Извините, мой псевдокод :) Правильное название инструкции movw   -  person Egor Skriptunoff    schedule 16.03.2014
comment
Спасибо, правильный синтаксис был movw r0:r1, r25:r26.   -  person Thom Wiggers    schedule 18.03.2014
comment
И, в конце концов, вы были правы, я действительно мог lpm и в нижние регистры, только не ldi.   -  person Thom Wiggers    schedule 21.03.2014


Ответы (1)


Я знаю, что это не дает прямого ответа на ваш вопрос, но знаете ли вы о том факте, что регистры AVR отображаются в памяти по нулевому адресу? Таким образом, вы можете использовать цикл копирования памяти во время выполнения вместо этой макроконструкции. Без моего ведома у вас, конечно, могут быть какие-то другие ограничения, которые исключают этот вариант.

person Jester    schedule 14.03.2014
comment
Прыжки стоят 2 цикла, и мне нужно использовать как можно меньше циклов. - person Thom Wiggers; 15.03.2014
comment
Да, я думал о чем-то подобном, когда говорил о неизвестных ограничениях :) - person Jester; 15.03.2014