assembly - AVR 汇编标签*2

标签 assembly avr avr-gcc

嗨,我是 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

谢谢。

最佳答案

  1. 标签是 16 位。
  2. 因为汇编程序使用的是字地址,而LPM 需要字节地址。请注意,并非所有汇编程序都这样做,特别是 avr-gcc 使用的 gas 不会这样做。那么你就不需要乘法了。
  3. 是的,LPM 的无操作数版本会自动加载到 R0,并从 Z 获取地址。请参阅指令集引用。
  4. 这不是很清楚,大声笑,但请参阅上面的 #2。

关于assembly - AVR 汇编标签*2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19305155/

相关文章:

loops - x86 NASM 程序集 - 输入问题

c - DDS 插值 - 8 位 Atmel AVR ASM 到 12 位 DAC

assembly - 来自 FS (MASM) 的 LODS

eclipse - Xcode 4 的 AVR?

C 应用程序链接失败,错误代码为 "undefined reference to __mulhi3"

c - 鼠标初始化后如何从端口 60h 提取 3 或 4 字节鼠标数据包

avr - 读取 I2C 传感器值(位联动)

c - 保证 int32_t 和 float 之间的数据保存?

c - 多个定义 - GCC 虚假错误

在 ATmega8 中将 C 代码转换为汇编代码