Avr asm标签* 2

时间:2013-10-10 20:03:53

标签: assembly avr avr-gcc

您好我是avr asm编程的新手,在下面的example中,我几乎没有问题:

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

2)为什么需要乘法标签2?

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

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

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

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

label:
.db "Hello world", 0
lpm

感谢。

2 个答案:

答案 0 :(得分:3)

  1. 标签是16位。
  2. 因为汇编程序使用字地址,但LPM需要字节地址。请注意,并非所有汇编程序都执行此操作,尤其是gas使用的avr-gcc,并非如此。然后你不需要乘法。
  3. 是的,LPM的无操作数版本会自动加载到R0,并从Z获取地址。请参阅指令集参考。
  4. LOL并不太清楚,但请参见上面的#2。

答案 1 :(得分:2)

就像这样。请按照下图.diagrams在可视化方面提供了很多帮助。

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

|--(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字节地址

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

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

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