assembly 将多个号码加载到寄存器时会发生什么?

tag5nh1u  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(131)

当你把多个值加载到一个寄存器中时,我有点不知所措。
也就是说

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的最终值是多少?
这些不是所要求的确切代码,但我想更好地了解

6tqwzwtp

6tqwzwtp1#

ldi指令只将立即数数据加载到寄存器中。即,它用新值覆盖寄存器的内容。

ldi r18, 28 // now value in r18 is 28
ldi r18, 42 // now 42

如果你想把值相加,你必须使用add(从寄存器中加一个值),adc(进位加)。没有加立即数的指令。相反,你可以使用subi指令和减去2-补码数。例如:

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)

r18r19现在都包含值42

相关问题