您好我是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
感谢。
答案 0 :(得分:3)
LPM
需要字节地址。请注意,并非所有汇编程序都执行此操作,尤其是gas
使用的avr-gcc
,并非如此。然后你不需要乘法。LPM
的无操作数版本会自动加载到R0
,并从Z
获取地址。请参阅指令集参考。答案 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。