1からn
までのすべての自然数の合計を計算するルーチンを実装したいと思います。 n
はRAMに格納された変数です。結果はRAM内のバイトの2バイトのにも格納する必要があります。私はアセンブリプログラミングでは非常に新しいので、これを達成するためのアルゴリズムを見つけようとしています。これまでのところ、私はこれをやった:AVRアセンブリでの集計
.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
私はR17
とR18
の初期化をした私は、サブルーチンLOOP
がそれn
回をやっまで1により、この数字の1が増加するような何かをしなければならないと思ったので。私を最も複雑にしているのは、結果が2バイトであり、合計される各数字がちょうど1バイトで構成されているという事実です。私はこれに対処する方法を知らない。どんな助けもありがとう。
あなたのコードは混乱していて、LOOPの部分が欠落しているため、コードを辿るのは難しいです。重要なアイデアは、現在の1バイトの数値をADDで結果の下位バイトに加算し、次にキャリーADCで結果の上位バイトに0を加算することです。その後、現在の1バイトを減らし、停止する必要があるかどうかを確認します。 – UncleO
私はあなたの考えを得ました、それは非常に明確でした。ありがとう、 – Tendero
(AVR8と仮定)最初の文には '1からnまでのすべての自然数の和を計算する 'という文が含まれています。よく知られている式があります。これが悪用されるかどうかは、MUL命令の可用性によります。 – greybeard