gpt4 book ai didi

c - 在AVR汇编中,代码执行后寄存器r24的值是多少?

转载 作者:太空宇宙 更新时间:2023-11-04 04:17:45 25 4
gpt4 key购买 nike

我刚刚开始了解数组是如何存储在寄存器中的,我对指针的工作方式感到非常困惑。

假设指针 Z 指向内存中的以下字符数组,地址为 0xABCD:

['1', '3', '2']

给定以下代码段:

ld r23, Z+
ld r24, Z

代码执行后r24的值是多少?

Z 会是索引 0 吗?还是索引 0 处的值为 1,或者它是否与地址 0xABCD 有关?

请客气一点。我真的很想学这些东西,我的老师不是最擅长解释的。任何帮助将不胜感激!

最佳答案

共有三个指针寄存器:X - 实际上是一对寄存器 r27:r26、Y - r29:r28 和 Z - r31:r30

并且有四种不同的间接访问模型来使用这些指针读/写内存:

1) 普通间接访问:

ld r16, X
st Y, r16

仅用于从/向这些寄存器指向的地址加载和存储数据。

2) 后增量间接访问:

ld r16, X+
st Z+, r16

这些操作使用当前存储在指针寄存器中的地址进行写入和读取。经过这些操作后,存储在相应寄存器对中的值将增加 1。

3) 带预递减的间接访问:

ld r16, -Y
st -X, r16

这些操作首先将存储在相应寄存器对中的值减一,然后从/写入新的计算地址。

4) 带位移的间接访问(仅针对 Y 和 Z):

ldd r16, Y+1
std Z+30, r16

它们不会改变存储在指针寄存器中的值,而是使用指针寄存器指定的地址加上给定的偏移量来读写内存。偏移量在 0 到 63(含)之间始终为正。X 寄存器没有 lddstd

注意。在具有 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)的值增加 1在那之后。因此,Z 将指向数组的第二个字节。然后,下一个操作ld r24, Z将第二个字节加载到r24中,Z指针保持不变。

关于c - 在AVR汇编中,代码执行后寄存器r24的值是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49990795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com