为什么使用AVR ASM上的Z寄存器访问程序存储器时乘以2

问题描述 投票:1回答:1

[我知道this question exists并且已经回答了,但是当我得到答案时,我只是没有得到为什么这个答案回答了问题。

在AVR ASM微控制器上,当我使用Z指针访问程序存储器时,为什么必须将加载在ZH / ZL寄存器上的地址乘以2?

这里是示例代码:

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

label:
.db "Hello world", 0
lpm

这是我到目前为止在互联网上所做的研究所知道的(来源太有限了):

  • [程序存储器是字寻址,而寄存器是字节寻址:我从这句话中了解到,程序存储器(16 bit)中的地址包括2 bytes,而AVR上的寄存器是8-bit。因此,为了将数据加载到寄存器,您需要从存储器地址中选择要加载的两个字节之一。
  • Z指针的LSB选择要加载的字节] >>:这意味着(Z指针中)只有15-bits供您指定将从中加载程序存储器的地址。数据。
  • 所以乘以2显然可以解决问题,但我不知道为什么。改写我可以说的问题:

虽然我需要从内存0x4322加载数据,但是我说Z指针从内存地址0x8644加载数据,因为这是字节地址。组装者怎么知道的?

侧面问题:

我已经看到这种实现:

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

lsl ZL
rol ZH
label:
.db "Hello world", 0
lpm

如果标签程序存储器的地址为0b10110011 11000000,则执行lslrol命令将产生带有C标志(0b01100110 10000000)的C=1的“字节”存储器。鉴于这里有两次溢出,如何指向所需的程序存储字节?

我知道这个问题存在并且已经得到回答,但是当我得到答案在说什么时,我只是不知道为什么这个答案可以回答问题。在AVR ASM上...

assembly memory avr
1个回答
0
投票

虽然我需要从内存0x4322加载数据,但我对Z指针说要从内存地址0x8644加载数据,因为那是字节地址。

© www.soinside.com 2019 - 2024. All rights reserved.