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と実行中の合計にそれを追加して、私が入力した値よりも上の値に達したかどうかを比較して、ループを終了する必要がある場合は
私のエラーが表示されますか?
最終的な 'jmp'は(論理的に)' ORより小さい場合はジャンプする 'です。 x86-64に387コードを使用する正当な理由はありません。 SSEは、不器用なスタックベースのISAよりも直交性があり、比較などの作業がはるかに容易になります。 –
[アセンブリ言語での集計]の可能な複製(http://stackoverflow.com/questions/10021071/summation-in-assembly-language) –