Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在AVR程序集中添加数字_Assembly_Avr - Fatal编程技术网

Assembly 在AVR程序集中添加数字

Assembly 在AVR程序集中添加数字,assembly,avr,Assembly,Avr,如何在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中。关于其背后的“数学”:它与十进制中的相同: 当添加两个单位数时,必须考虑两种情况。二者之和要么是一个新的单位数(5+4=9),要么出现“溢出”,需

如何在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中。

关于其背后的“数学”:它与十进制中的相同:

当添加两个单位数时,必须考虑两种情况。二者之和要么是一个新的单位数(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+进位
的操作,其中
进位
只能为0或1,如上所述。在添加所有数字后,最后一次添加可能再次导致溢出,该溢出将在随后的进位中反映出来,并可评估为可能对numberrange溢出作出反应,如:

x = x + y;

if ( carry == 1 ) {
  error "The sum is too big for the datatype of x";
}
关于其背后的“数学”:它与十进制中的“数学”完全相同:

当添加两个单位数时,必须考虑两种情况。二者之和要么是一个新的单位数(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+进位
的操作,其中
进位
只能为0或1,如上所述。在添加所有数字后,最后一次添加可能再次导致溢出,该溢出将在随后的进位中反映出来,并可评估为可能对numberrange溢出作出反应,如:

x = x + y;

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

操作非常简单。第一次操作使用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 

操作非常简单。第一次操作使用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 

如果您还没有,那么StackOverflow还不是一个合适的地方。(如果标准方法不起作用,你应该指出这一点。)我试过谷歌;-)但是如果加了很多瑞吉斯酒,你就别吃了。-应该是这样的吗<代码>添加R20、R16。。。。ADC R21、R17……等等?是的,就是这样做的:)如果你没有,那么StackOverflow还不是一个合适的地方。(如果标准方法不起作用,你应该指出这一点。)我试过谷歌;-)但是如果加了很多瑞吉斯酒,你就别吃了。-应该是这样的吗<代码>添加R20、R16。。。。ADC R21、R17……等等?是的,就是这样做的:)在C中,你可以写
无符号和=x+y;无符号进位=(和(仅适用于无符号值)。有些编译器在编译时会使用
add
指令的执行结果,而不是实际进行比较;无符号进位=(和(仅适用于无符号值)。有些编译器在编译时会使用
add
指令的执行结果,而不是实际执行比较。