【问题标题】:Why is this array pointer shifted by 1?为什么这个数组指针移动了 1?
【发布时间】:2019-12-13 14:34:25
【问题描述】:

我正在为微处理器考试而学习,并且出现了这个示例问题:

总结一下,代码后面的程序内存中有一个数组:

array: .db 11,12,13,14,15,16,17,18,19,20

在代码中,指针被加载为:

ldi ZL, low(array<<1);

我的问题是为什么我给出的代码中会出现 1 的移位。在我看来,标签“数组”应该指向包含数字 11 的内存字节。如果我理解正确,左移 1 将乘以 2。那岂不是一蹶不振?我得到的代码是错误的还是我不明白的东西?

【问题讨论】:

  • 另见this answer,尤其是关于avr-as的注释。
  • 在实际问题中包含足够的代码以使其有意义,而不仅仅是作为图像的一部分。显然关键是我们想使用 Z 作为lpm(加载程序内存)的指针,而不是通常的数据内存。
  • @Jester:这看起来像是重复的(*2<<1 相同,出于相同的lpm 原因)。我不明白为什么这种行为会有用;标签是否适用于数据部分中的标签?或者您还可以用标签地址除以 2 来做其他事情吗?
  • 顺便说一句,图片中“解决方案”的文本部分是错误的。不是0x01010101(十六进制的32位数字),而是0b01010101(二进制的8位数字)。源代码正确:0x55。是的,x & mask == mask 是您检查 all 感兴趣的位是否已设置的方式。 (如果设置了所有掩码位,您可能可以通过添加一个设置进位标志的常量来更有效地执行此操作,否则不设置。然后使用adc 而不是inc 上的分支)

标签: assembly avr memory-address atmega 8-bit


【解决方案1】:

来自the description of LPM

程序存储器按 16 位字组织,而 Z 指针是字节地址。

这样就完成了从字地址到字节地址的转换。

【讨论】:

  • 我想我明白了...所以因为程序存储器是以 16 位除法寻址的,与字节寻址相比,其中的可寻址字数只有一半...所以相乘by 2 将 LDI 定向到程序存储器中的正确位置,因为它假定所有内容都是字节寻址的。
猜你喜欢
  • 2021-01-16
  • 2012-06-11
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多