在AVR汇编中,代码执行后寄存器r24的值是多少?
In AVR assembly, what is the value in register r24 after code executes?
我刚刚开始了解数组是如何存储在寄存器中的,我对指针的工作方式感到很困惑。
假设指针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
并且有四种不同的间接访问模型 read/write 使用该指针的内存:
1) 普通间接访问:
ld r16, X
st Y, r16
仅用于加载和存储数据from/to这些寄存器指向的地址。
2) 间接访问 post-increment:
ld r16, X+
st Z+, r16
这些操作使用当前存储在指针寄存器中的地址进行写入和读取。经过这些操作后,存储在相应寄存器对中的值将增加一个。
3) 带前置递减的间接访问:
ld r16, -Y
st -X, r16
这些操作首先将存储在相应寄存器对中的值减一,然后read/write from/to 计算新的地址。
4) 带位移的间接访问(仅针对 Y 和 Z):
ldd r16, Y+1
std Z+30, r16
它们不会改变存储在指针寄存器中的值,而是使用指针寄存器指定的地址加上给定的偏移量来读写内存。偏移量在 0 到 63(含)之间始终为正。
X寄存器没有ldd
和std
。
注。在具有 256 字节和更少可寻址数据 space 的设备上,仅使用指针寄存器对的低字节并且 post-递增和预递减也不修改它们。
在能够寻址超过 64KB 的设备上,还有额外的 I/O 寄存器(RAMPX、RAMPY、RAMPZ)用于获取地址的高位。当与 post 递增或预递减一起使用时,这些寄存器也会更新。
另请注意,当使用预递减或 post-递增来存储指针对寄存器之一中包含的数据时,例如:
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指针保持不变。
我刚刚开始了解数组是如何存储在寄存器中的,我对指针的工作方式感到很困惑。
假设指针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
并且有四种不同的间接访问模型 read/write 使用该指针的内存:
1) 普通间接访问:
ld r16, X
st Y, r16
仅用于加载和存储数据from/to这些寄存器指向的地址。
2) 间接访问 post-increment:
ld r16, X+
st Z+, r16
这些操作使用当前存储在指针寄存器中的地址进行写入和读取。经过这些操作后,存储在相应寄存器对中的值将增加一个。
3) 带前置递减的间接访问:
ld r16, -Y
st -X, r16
这些操作首先将存储在相应寄存器对中的值减一,然后read/write from/to 计算新的地址。
4) 带位移的间接访问(仅针对 Y 和 Z):
ldd r16, Y+1
std Z+30, r16
它们不会改变存储在指针寄存器中的值,而是使用指针寄存器指定的地址加上给定的偏移量来读写内存。偏移量在 0 到 63(含)之间始终为正。
X寄存器没有ldd
和std
。
注。在具有 256 字节和更少可寻址数据 space 的设备上,仅使用指针寄存器对的低字节并且 post-递增和预递减也不修改它们。 在能够寻址超过 64KB 的设备上,还有额外的 I/O 寄存器(RAMPX、RAMPY、RAMPZ)用于获取地址的高位。当与 post 递增或预递减一起使用时,这些寄存器也会更新。
另请注意,当使用预递减或 post-递增来存储指针对寄存器之一中包含的数据时,例如:
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指针保持不变。