[我知道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
。因此,为了将数据加载到寄存器,您需要从存储器地址中选择要加载的两个字节之一。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
,则执行lsl
和rol
命令将产生带有C标志(0b01100110 10000000
)的C=1
的“字节”存储器。鉴于这里有两次溢出,如何指向所需的程序存储字节?
我知道这个问题存在并且已经得到回答,但是当我得到答案在说什么时,我只是不知道为什么这个答案可以回答问题。在AVR ASM上...
虽然我需要从内存
0x4322
加载数据,但我对Z指针说要从内存地址0x8644
加载数据,因为那是字节地址。