嗨,我是 avr asm 编程的新手,在 example下面,我有几个问题:
1) label: 8 bit or 16bit long?
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
谢谢。
最佳答案
- 标签是 16 位。
- 因为汇编程序使用的是字地址,而
LPM
需要字节地址。请注意,并非所有汇编程序都这样做,特别是avr-gcc
使用的gas
不会这样做。那么你就不需要乘法了。 - 是的,
LPM
的无操作数版本会自动加载到R0
,并从Z
获取地址。请参阅指令集引用。 - 这不是很清楚,大声笑,但请参阅上面的 #2。
关于assembly - AVR 汇编标签*2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19305155/