带有x86-64组件的谐波系列

时间:2012-04-03 22:27:11

标签: x86-64 nasm calculus

尝试计算谐波系列。

现在我输入我希望添加的数字。

当我输入一个像1.2这样的小数字时,程序就会停止,不会崩溃,它似乎正在进行计算。

BUt它永远不会完成程序

这是我的代码

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并将其添加到运行总和中,然后进行比较以查看我是否已达到高于我输入的值,一旦有了它应退出循环

你们看到我的错误吗?

1 个答案:

答案 0 :(得分:1)

这条线似乎很可疑:

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

与评论相反,fst将堆栈顶部存储到内存中而不会弹出它。如果你想弹出它,你想要fstp

总的来说,你的程序的堆栈行为似乎是可疑的 - 它将各种东西推到fp堆栈上但从不弹出任何东西。经过几次迭代后,堆栈将溢出并环绕。根据您的设置,如果没有启用例外,您将获得异常或获取虚假值。