0

調和級数を計算しようとしています。

今、私は足し算を上げたい番号を入力しています。

1.2のような小さな数値を入力すると、プログラムは停止し、クラッシュせず、計算を行っているようです。

しかし、それはプログラムを終了することはありません

これが私のコードです

denominator:
xor r14,r14             ;zero out r14 register
add r14, 2              ;start counter at 2
fld1                    ;load 1 into st0
fxch    st2
denomLoop:
fld1    
mov [divisor], r14              ;put 1 into st0
fidiv   dword [divisor]         ;divide st0 by r14
inc r14             ;increment r14
fst qword [currentSum]      ;pop current sum value into currentSum
jmp addParts
addParts:
fld qword [currentSum]
fadd    st2     ;add result of first division to 1
fxch    st2             ;place result of addition into st2
fld qword [realNumber]          ;place real number into st0
;compare to see if greater than inputed value
fcom    st2             ;compare st0 with st2
fstsw   ax              ;needed to do floating point comparisons on FPU
sahf                    ;needed to do floating point comaprisons on FPU
jg  done                ;jump if greater than
jmp denomLoop           ;jump if less than 

コードは基本的に1/2または1/3または1/4を計算し、それを現在の合計に追加し、入力した値を超える値に到達したかどうかを比較して、ループを終了する必要があります

君たちは私のエラーを見ますか?

4

1 に答える 1

1

この行は疑わしいようです:

fst qword [currentSum]      ;pop current sum value into currentSum

コメントとは反対にfst、スタックの最上位をポップせずにメモリに格納します。あなたがfstpそれをポップしたいのならあなたは欲しい。

全体として、プログラムのスタックの動作は疑わしいようです。さまざまなものをfpスタックにプッシュしますが、何もポップしません。数回の反復の後、スタックはオーバーフローしてラップアラウンドします。設定に応じて、例外を取得するか、例外を有効にしていない場合は偽の値を取得します。

于 2012-10-09T19:55:09.313 に答える