assembly AVR汇编程序中两个9位数的进位相加

yi0zb3m4  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(115)

我需要使用指令ADD和ADC将两个9位数字相加。这些数字存储在R21:R20R23:R22(MSB:LSB)对寄存器。寄存器不应被覆盖。
我使用的微控制器是AtMega16A,其最大寄存器大小为8位。
以下是我的解决方案。如果有人能分享他们的反馈,我将非常感激。

ldi r24, 0 ; result LSB
ldi r25, 0 ; result MSB
clr r26 ; helper
mov r24, r21 ; move MSB part of first number to r24
add r24, r23 ; sum it with MSB part of second number
adc r25, r26 ; add overflow to r25
add r24, r20 ; add LSB part of number 1 to r24
add r24, r22 ; add LSB part of number 2 to r24
; result is R25:R24
fwzugrvs

fwzugrvs1#

你可以像16位加法那样做,唯一的区别是它不会溢出。
16位加法的基本代码为:

add r20, r22 ; A:LSB += B:LSB
adc r21, r23 ; A:MSB += B:MSB + LSB carry

如果要保持初始寄存器不变,必须复制一个值:

mov r24, r20
mov r25, r21
add r24, r22
adc r25, r23

如果您的MCU支持movw指令(ATmega16A支持),则可以移入一条指令:

movw r24, r20 ; r24:r25 = r20:r21
add  r24, r22
adc  r25, r23

相关问题