繁体   English   中英

AVR组装总结

[英]Summation in AVR Assembly

我想实现一个例程,该例程计算从1到n的所有自然数的总和。 n是存储在RAM中的变量。 结果也必须存储在RAM中的两个字节的变量中。 我是汇编程序设计的新手,因此很难找出实现该目标的算法。 到目前为止,我已经做到了:

.DSEG

.ORG 0x100

n:  .BYTE l_n
result: .BYTE l_result

.CSEG

.ORG 0x100

SUM:
LDI XL, n               ;the direction of n is stored in XL
LD R16, X               ;now r16=n
LDI XL, LOW(result)
LDI XH, HIGH(result)    ;X points to result
CLC                     ;in case C is full with trash
LDI R17, 0x0            ;R17 = 0
LDI R18, 0x1            ;R18 = 1
CALL LOOP   
LDI R16,0
LDI R17,0
ADC R16, R17        ;if C is on when the loop finishes, then it has to be summed as well
ST X, R16
RET                 ;returns to the program that called the routine

我之所以进行R17R18的初始化,是因为我认为子例程LOOP应该像将这个数字一一增加直到执行n次一样。 使我最复杂的是事实,即结果有两个字节,而每个被求和的数字仅包含一个字节。 我不知道该如何处理。 任何帮助将不胜感激。

您需要的是
添加R18,R24 // sumL + = nL
ADC R19,R25 // sumH + = nH +进位

对于2个字节的变量,最大和为65535,因此对于
1 + 2 + 3 + ... + n = n *(n + 1)/ 2 <= 65535然后N <= 361 = 0x0169
1 + 2 + 3 + ... + 361 = 361 * 362/2 = 65341

代码将如下所示:

//CPU: ATmega128A
.include "m128Adef.inc"

.DSEG 
//.ORG 0x100
n: .BYTE 2      // define 2 bytes var
result: .BYTE 2 // define 2 bytes var

.CSEG
.ORG 0
    RJMP boot

n0: .DW 0x0169 //init value for n=361 (max value for 2 byte result)

//in: N=R24:R25
//out: Sum=R18:R19
//calc sum 1 to n (n >=1 and n <=361)
//1+2+3+...+n=n*(n+1)/2 <= 65535 => n<=361= 0x0169
Sum1toN:
    LDI R18,0x00 //sumL=0
    LDI R19,0x00 //sumH=0
Lsum:
    ADD R18,R24 //sumL + = nL
    ADC R19,R25 //sumH += nH + C
    SBIW R24,0x01 //n--
    BRNE Lsum // n >0 ?
    RET

boot:
    CLR R1
    OUT SREG,R1 //Clear all

    //init stack pointer
    LDI R28,LOW(RAMEND)  //LDI R28,0xFF
    LDI R29,HIGH(RAMEND) //LDI R28,0x10
    OUT SPH,R29
    OUT SPL,R28

//init
    LDI ZL,LOW(n0<<1)
    LDI ZH,HIGH(n0<<1)

    LDI XL,LOW(n)
    LDI XH,HIGH(n)

    LDI R24,2
    LDI R25,0
init:
    LPM R0,Z+
    ST X+,R0
    SBIW R24,1  
    BRNE init 

//calc:
    LDS R24,n   // LDS R24,0x0100
    LDS R25,n+1 // LDS R25,0x0101
    RCALL Sum1toN
    STS result,R18
    STS result+1,R19

main:
    RJMP main

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM