如何更优雅地进行AVR组装

时间:2014-03-14 21:07:51

标签: assembly avr atmelstudio attiny

我目前有这段代码:

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

1 个答案:

答案 0 :(得分:0)

我知道这并没有直接回答你的问题,但是你是否知道AVR寄存器是在地址零处进行内存映射的事实?因此,您可以使用运行时内存复制循环而不是此宏构造。在我不知情的情况下,您当然可能会有一些其他约束来规定此选项。