尝试计算谐波系列。
现在我输入我希望添加的数字。
当我输入一个像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并将其添加到运行总和中,然后进行比较以查看我是否已达到高于我输入的值,一旦有了它应退出循环
你们看到我的错误吗?答案 0 :(得分:1)
这条线似乎很可疑:
fst qword [currentSum] ;pop current sum value into currentSum
与评论相反,fst
将堆栈顶部存储到内存中而不会弹出它。如果你想弹出它,你想要fstp
。
总的来说,你的程序的堆栈行为似乎是可疑的 - 它将各种东西推到fp堆栈上但从不弹出任何东西。经过几次迭代后,堆栈将溢出并环绕。根据您的设置,如果没有启用例外,您将获得异常或获取虚假值。