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 回答