我正在尝试在AVR程序集中的宏中执行mov
操作。我想通过宏的数字参数指定目标。我正在使用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
代替错误“意外(”。尝试(r@0)
会导致“意外注册”。
我该怎么做?
答案 0 :(得分:1)
我没有注意到在我输入时jester的评论中已经提到这是一种解决方法,但传入完整的注册名称确实有效。我刚添加了几行,因此可以在模拟器中轻松测试:
.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