共有三个指针寄存器:X - 实际上是一对寄存器 r27:r26, Y - r29:r28 和 Z - r31:r30
并且有四种不同的间接访问模型来使用该指针读/写内存:
1) 普通间接访问:
ld r16, X
st Y, r16
仅用于从这些寄存器指向的地址加载和存储数据。
2) 后增量间接访问:
ld r16, X+
st Z+, r16
这些操作使用当前存储在指针寄存器中的地址进行写入和读取。在这些操作之后,存储在相应寄存器对中的值增加一。
3) 带有预减量的间接访问:
ld r16, -Y
st -X, r16
这些操作首先将存储在相应寄存器对中的值减一,然后对新的计算地址进行读/写。
4) 带位移的间接访问(仅适用于 Y 和 Z):
ldd r16, Y+1
std Z+30, r16
这些不会更改存储在指针寄存器中的值,而是使用指针寄存器指定的地址加上给定的偏移量来读取和写入内存。偏移量在 0 到 63(含)之间始终为正数。
X 寄存器没有ldd 和std。
注意。在具有 256 字节和更少可寻址数据空间的设备上,仅使用指针寄存器对的低字节,并且后递增和前递减也不会修改它们。
在能够寻址超过 64KB 的设备上,还有额外的 I/O 寄存器(RAMPX、RAMPY、RAMPZ)用于获取地址的高位。当与后增量或前减一起使用时,这些寄存器也会更新。
另请注意,当使用前置递减或后置递增来存储包含在指针对寄存器之一中的数据时,例如:
st X+, r26 // r26 is a part of X register
st -Y, r29 // r29 is a part of Y register
etc.
那么这些操作的结果是不确定的。
所以,回答你的问题:
如果 Z 指向 char 数组的第一个字节,则操作 ld r23, Z+ 会将第一个字节值加载到 r23 中,然后将 Z(即寄存器 r31:r30)的值增加一个。因此,Z 将指向数组的第二个字节。
然后,下一个操作ld r24, Z 会将第二个字节加载到 r24 中,并且 Z 指针将保持不变。