3

嗨,我是 avr asm 编程的新手,在下面的示例中,我有几个问题:

1)它是标签:8位还是16位长?

2) 为什么需要与 2 相乘的标签?

3) 指令 LPM 将其结果放入寄存器 R0?如果是这样,那与 Z 有什么关系?

4)您能否解释提供的链接中引用的文本:

“如果地址不乘以 2 并且标签位于字节地址 0x60(字地址 0x30),Z 将指向存储在那里的代码。我希望这能澄清寻址问题。其他版本是”

ldi ZL, low(2*label)
ldi ZH, high(2*label)

label:
.db "Hello world", 0
lpm

谢谢。

4

2 回答 2

5
  1. 标签为 16 位。
  2. 因为汇编器使用的是字地址,但LPM需要字节地址。请注意,并非所有汇编程序都这样做,尤其gas是 使用的汇编程序不这样avr-gcc做。那么你不需要乘法。
  3. 是的,无操作数版本的LPM自动加载到R0中,它从 中获取地址Z。请参阅指令集参考。
  4. 这不是太清楚 LOL,但请参阅上面的#2。
于 2013-10-10T22:13:05.243 回答
2

就像这样。按照下图进行操作。图表在可视化方面有很大帮助。

字地址..................................字节地址

|--(0d)---;--(0c)---|06                         |--------|06
|--(0b)---;--(0a)---|05                         |--------|05                          
|--(09)---;--(08)---|04                         |--------|04
|--(07)---;--(06)---|03                         |--------|03
|--(05)---;--(04)---|02                         |--------|02
|--(03)---;--(02)---|01                         |--------|01
|--(01)---;--(00)---|00                         |--------|00

所以你看到 0x01 字地址对应 0x02 字节地址 0x04 字地址对应 0x08 字节地址

因此乘以二。假设您已将消息存储在位置。

.org 0x0200
message:
.db "1234567890#"

如果您使用的是 avr studio 并检查程序内存部分。然后你会发现它存储在 0x400 而不是 0x200。

于 2014-05-04T16:12:08.393 回答