0

我目前有这个代码:

// 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

如您所见,重复了许多非常相似的代码。

如果没有办法以更短的方式编写它,例如 with.irp或 may .ifs,那将是荒谬的。但是,我无法让它发挥作用。因为.irp我试过这个:

.irp i, 0,1,2,3,4,5,6,7,8
   lpm r25, Z+
   mov r\i, r25
.endr

虽然 Atmel Studio 确实突出显示.irp(它没有突出显示以 a 开头的所有内容.)但它不起作用:Invalid directive: '.irp'

另请参阅我的另一个相关问题:MOV into a register specified by macro argument

4

1 回答 1

1

我知道这并不能直接回答您的问题,但是您是否知道 AVR 寄存器在地址零处映射内存这一事实?所以你可以使用运行时内存复制循环而不是这个宏结构。我不知道,您当然可能有一些其他限制排除此选项。

于 2014-03-14T22:11:59.137 回答