我需要使用指令ADD和ADC将两个9位数字相加。这些数字存储在R21:R20和R23: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
1条答案
按热度按时间fwzugrvs1#
你可以像16位加法那样做,唯一的区别是它不会溢出。
16位加法的基本代码为:
如果要保持初始寄存器不变,必须复制一个值:
如果您的MCU支持
movw
指令(ATmega16A支持),则可以移入一条指令: