我目前有这段代码:
// 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
,那将是荒谬的。但是,我无法让它发挥作用。对于.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 into a register specified by macro argument。
答案 0 :(得分:0)
我知道这并没有直接回答你的问题,但是你是否知道AVR寄存器是在地址零处进行内存映射的事实?因此,您可以使用运行时内存复制循环而不是此宏构造。在我不知情的情况下,您当然可能会有一些其他约束来规定此选项。