汇编理解高低字节的ldi

时间:2012-11-06 19:43:56

标签: assembly cpu-registers

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

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

编辑:修正了我的降价,对不起。

1 个答案:

答案 0 :(得分:2)

好的,因为这是AVR程序集,并假设8位寄存器(如Atmega32或类似的东西,根据寄存器名称判断)。

首先,我们来看看AVR Assembly中的low()和high()。根据{{​​3}}来源和个人经验,它仅适用于16位数字,并提供高字节或低字节,左侧是最高有效位(MSB)。

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

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

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

至于其他人,0x600,让我们首先将它显示为一个完整的16位数字,以使其更容易。 0x600 == 0x0600(只是在MSB点抛出一个0,因为你实际上没有添加任何东西)

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

相关问题