2012-04-03 12 views
0

高調波系列を計算しようとしています。高調波シリーズとx86-64アセンブリ

今すぐ追加したい番号を入力しています。

私が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と実行中の合計にそれを追加して、私が入力した値よりも上の値に達したかどうかを比較して、ループを終了する必要がある場合は

私のエラーが表示されますか?

+0

最終的な 'jmp'は(論理的に)' ORより小さい場合はジャンプする 'です。 x86-64に387コードを使用する正当な理由はありません。 SSEは、不器用なスタックベースのISAよりも直交性があり、比較などの作業がはるかに容易になります。 –

+0

[アセンブリ言語での集計]の可能な複製(http://stackoverflow.com/questions/10021071/summation-in-assembly-language) –

答えて

1

この行は、疑わしいと思われる:

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

コメントに反し、fst店舗スタックの最上位メモリにそれをポップなし。ポップする場合はfstpが必要です。

全体として、プログラムのスタック動作は疑わしいと思われます。さまざまなことがfpスタックにプッシュされますが、何もポップしません。 2回の反復の後、スタックはオーバーフローして折り返します。設定に応じて、例外が有効になっていない場合は、例外を取得するか、偽の値を取得します。