3

我正在尝试mov在 AVR 程序集中的宏中执行操作。我想通过宏的数字参数指定目标。我正在使用 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)导致“意外注册”。

我该怎么做呢?

4

1 回答 1

2

我没有注意到在我打字时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
于 2014-07-27T06:25:56.593 回答