Assembly MOV到宏参数指定的寄存器中

Assembly MOV到宏参数指定的寄存器中,assembly,macros,avr,atmelstudio,Assembly,Macros,Avr,Atmelstudio,我试图在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相反,

我试图在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
相反,给出了错误“意外”(.Trying
(r@0)
导致“意外寄存器”


如何做到这一点?

在我打字时,我没有注意到有人在评论中提到这是一种解决方法,但传入完整的寄存器名确实有效。我只是添加了几行,以便在模拟器中轻松测试:

.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

我猜您需要一个代码>令牌粘贴操作符< /C>。但是我在手册中找不到。作为一个解决方案,考虑传递整个登记名(即<代码> R1 < /代码>)。作为参数。是的,这听起来像我想弄明白的。我不想传递整个寄存器名,因为我想在宏中使用它,在宏中循环不同的值。