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

ご覧のとおり、本当によく似たコードがたくさん繰り返されています。

.irpこれを withや Maybe .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 レジスタがアドレス 0 にメモリ マップされているという事実を認識していますか? したがって、このマクロ コンストラクトの代わりにランタイム メモリ コピー ループを使用できます。もちろん、このオプションを除外する他の制約があるかもしれません。

于 2014-03-14T22:11:59.137 に答える