首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在AVR部件中添加数字

在AVR部件中添加数字
EN

Stack Overflow用户
提问于 2012-06-04 18:27:54
回答 2查看 8.4K关注 0票数 1

如何在AVR组装中做到这一点?

我有两个数字(小端)在不同的注册表。

代码语言:javascript
运行
复制
# Number 1
LDI R16 0x…
LDI R17 0x…
LDI R18 0x…
LDI R19 0x…
# Number 2
LDI R20 0x…
LDI R21 0x…
LDI R22 0x…
LDI R23 0x…

我想将它们相加,并将结果保存到R20 - R23。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-05 17:22:05

关于它背后的“数学”:它与十进制系统中的一样:

当两个一位数相加时,必须考虑两种情况。这两个数字的和要么是一个新的个位数(5+4 = 9),要么是发生‘溢出’并需要另一个数字(5+6 = 11)。请注意,对于任何两个n位数长度的数字(在任何基数中,可以是10、2、256或其他任何数),这两个数字的总和将始终小于最小n+1位数长度的两倍;假设ij是长度为1的数字(基数为10),即两者都在09之间(包括这两个数)。由于10是长度n+1 = 2的最小数目,因此它们的总和将始终小于2 x 10

当将两个数字相加时,可能没有溢出,或者溢出恰好为1。进位存储上一次算术运算的溢出;它可以是0或1。

因此,当将两个4x8位的数字相加(可以看作是以256为基数的4位数)时,第一次相加将不会有溢出,因此只有ADDADD可以被视为x = x + y + 0的操作。然而,在第一次相加之后,可能会有一个需要考虑的溢出,这是通过使用ADDC来完成的;ADDC表示x = x + y + carry的操作,其中carry只能是0或1,如上所述。在所有数字相加后,最后一次相加可能再次导致溢出,这将在随后的进位位中反映出来,并且可以评估为可能对数字范围的溢出做出反应,例如:

代码语言:javascript
运行
复制
x = x + y;

if ( carry == 1 ) {
  error "The sum is too big for the datatype of x";
}
票数 3
EN

Stack Overflow用户

发布于 2012-06-13 11:03:09

非常简单的操作。第一次操作使用add,后续加法使用add-with-carry

代码语言:javascript
运行
复制
# Number 1
LDI R16 0x…
LDI R17 0x…
LDI R18 0x…
LDI R19 0x…
# Number 2
LDI R20 0x…
LDI R21 0x…
LDI R22 0x…
LDI R23 0x…
# Add LSB of 1 and 2, result will be in R20
ADD R20,R16
# Add remaining bytes using the add-with-carry operation
ADC R21,R17
ADC R22,R18
ADC R23,R19 # MSB

结果将覆盖R20:R23中的值。

我知道您只是将常量加载到寄存器中作为示例,但不要忘记您可以使用subi和sbci操作码添加常量。例如,要将5添加到R18:R19:

代码语言:javascript
运行
复制
SUBI R18,-5
SBCI R19,-1 # This isn't intuitive, but needs to be -1, not zero

要从r18:r19中减去5:

代码语言:javascript
运行
复制
SUBI R18,5
SBCI R19,0 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10879819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档