3

movAVR アセンブリのマクロで操作を実行しようとしています。マクロに数値引数で対象を指定したい。Atmel Studio アセンブラを使用しています。

私はこのようなことをしようとしています:

; accepts 1 argument: target register.
.macro move_r10_into
  mov @0, r10 
.endmacro

; usage example:
move_r10_into 1 ; So this should do mov r1, r10

しかし、このようにすると、「無効なレジスタ」というエラーが表示されます。代わりに使用r@0すると、「Unexpected (」というエラーが表示されます。試行すると(r@0)、「unexpected REGISTER」という結果になります。

どうすればいいですか?

4

1 に答える 1

2

私が入力していた道化師のコメントでこれが回避策として言及されていたことに気付きませんでしたが、完全なレジスタ名を渡すと機能します。シミュレーターで簡単にテストできるように、数行追加しました。

.macro move_r10_into
    mov @0, r10 
.endmacro

inc r10
move_r10_into r1
nop

ただし、ループから呼び出すことができるようにしたいというコメントで言及しました。特定のデバイスのデータシートを確認しますが、通常、レジスタ R0 ~ 31 はデータ アドレス 0x00 ~ 0x1F にマップされます。つまり、次の例のようにポインタ レジスタを使用することで、間接データ アクセスを使用してそれらにアクセスできます。

.macro move_r10_into
    ldi zl, @0 ; Load data address into Z pointer
    ldi zh, 0  ; This will result in R30/31 being changed
    st z, r10
.endmacro

inc r10
move_r10_into 1 ; So this should do mov r1, r10
nop
于 2014-07-27T06:25:56.593 に答える