【发布时间】: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