当你把多个值加载到一个寄存器中时,我有点不知所措。也就是说
ldi r18, 28 ldi r19, 24 mov r16, r17 ldi r19, 12 ldi r19, 122 ldi r18, 42 mov r19, r18 mov r18, r19
ldi是否只是将数字相加?mov是否替换寄存器中的值?r18和r19的最终值是多少?这些不是所要求的确切代码,但我想更好地了解
6tqwzwtp1#
ldi指令只将立即数数据加载到寄存器中。即,它用新值覆盖寄存器的内容。
ldi
ldi r18, 28 // now value in r18 is 28 ldi r18, 42 // now 42
如果你想把值相加,你必须使用add(从寄存器中加一个值),adc(进位加)。没有加立即数的指令。相反,你可以使用subi指令和减去2-补码数。例如:
add
adc
subi
ldi r18, 28 // r18 = 28 subi r18, (256 - 42) // now r18 == 70
备注:subi与许多其它带立即数参数的指令一样,只接受r16-r31范围内的寄存器。或者您可以将值加载到另一个寄存器中并使用add:
ldi r18, 28 ldi r19, 42 add r18, r19 // now r8 = 28 + 42 == 70
阅读AVR Instruction Set Manual (pdf)中的更多内容回答你的问题:
ldi r18, 28 // r18 = 28 ldi r19, 24 // r19 = 24 mov r16, r17 // r16 = unknown value from r17 ldi r19, 12 // r19 = 12 ldi r19, 122 // r19 = 122 ldi r18, 42 // r18 = 42 mov r19, r18 // r19 = r18 (= 42) mov r18, r19 // r18 = r19 (= 42)
r18和r19现在都包含值42
r18
r19
1条答案
按热度按时间6tqwzwtp1#
ldi
指令只将立即数数据加载到寄存器中。即,它用新值覆盖寄存器的内容。如果你想把值相加,你必须使用
add
(从寄存器中加一个值),adc
(进位加)。没有加立即数的指令。相反,你可以使用subi
指令和减去2-补码数。例如:备注:
subi
与许多其它带立即数参数的指令一样,只接受r16-r31范围内的寄存器。或者您可以将值加载到另一个寄存器中并使用
add
:阅读AVR Instruction Set Manual (pdf)中的更多内容
回答你的问题:
r18
和r19
现在都包含值42