如何在AVR组装中做到这一点?
我有两个数字(小端)在不同的注册表。
# 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。
发布于 2012-06-05 17:22:05
关于它背后的“数学”:它与十进制系统中的一样:
当两个一位数相加时,必须考虑两种情况。这两个数字的和要么是一个新的个位数(5+4 = 9),要么是发生‘溢出’并需要另一个数字(5+6 = 11)。请注意,对于任何两个n位数长度的数字(在任何基数中,可以是10、2、256或其他任何数),这两个数字的总和将始终小于最小n+1位数长度的两倍;假设i和j是长度为1的数字(基数为10),即两者都在0和9之间(包括这两个数)。由于10是长度n+1 = 2的最小数目,因此它们的总和将始终小于2 x 10。
当将两个数字相加时,可能没有溢出,或者溢出恰好为1。进位存储上一次算术运算的溢出;它可以是0或1。
因此,当将两个4x8位的数字相加(可以看作是以256为基数的4位数)时,第一次相加将不会有溢出,因此只有ADD;ADD可以被视为x = x + y + 0的操作。然而,在第一次相加之后,可能会有一个需要考虑的溢出,这是通过使用ADDC来完成的;ADDC表示x = x + y + carry的操作,其中carry只能是0或1,如上所述。在所有数字相加后,最后一次相加可能再次导致溢出,这将在随后的进位位中反映出来,并且可以评估为可能对数字范围的溢出做出反应,例如:
x = x + y;
if ( carry == 1 ) {
error "The sum is too big for the datatype of x";
}发布于 2012-06-13 11:03:09
非常简单的操作。第一次操作使用add,后续加法使用add-with-carry
# 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:
SUBI R18,-5
SBCI R19,-1 # This isn't intuitive, but needs to be -1, not zero要从r18:r19中减去5:
SUBI R18,5
SBCI R19,0 https://stackoverflow.com/questions/10879819
复制相似问题