1

我无法理解下面的代码片段加载到每个寄存器中的内容。代码执行后每个寄存器会存储什么?

ldi r20, low(-1)
ldi r21, high(-1)
ldi r17, low(0x600)
ldi r18, high(0x600)

编辑:修正了我的降价,对此感到抱歉。

4

1 回答 1

2

好的,既然这是 AVR 汇编,并假设 8 位寄存器(如 Atmega32 或类似的东西,从寄存器名称来看)。

首先,让我们看一下low() 和high() 在AVR Assembly 中的作用。根据消息来源和个人经验,它仅适用于 16 位数字,并给出高字节或低字节,左侧为最高有效位(MSB)。

-1 作为 16 位数字 = 0b1111111111111111 或 0xFFFF (两者相等),因为负数是使用2 的补码计算的,所以取每个的 low() 和 high() 应该产生以下结果:

ldi r20, low(0b1111111111111111)
ldi r21, high(0xFFFF)

r20 和 r21 都将保存 0b11111111 的值,或十进制表示法中的 -1

至于其他的 0x600,我们先把它显示为一个完整的 16 位数字,这样更容易。0x600 == 0x0600 (只需在 MSB 位置输入 0,因为您实际上并没有添加任何内容)

如果我们取高(0x0600),我们得到前两个数字,高字节,或 0x06。
如果我们取低(0x0600),我们得到底部的两个数字,低字节,或 0x00。

于 2012-11-07T00:47:54.903 回答