2012-04-03 62 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'(邏輯上)'跳轉。沒有很好的理由在x86-64上使用387代碼。 SSE比笨拙的,基於堆棧的ISA更正交 - 並且使比較等事情變得更容易。 – 2012-04-04 05:06:39

+0

[彙編語言彙總]的可能重複(http://stackoverflow.com/questions/10021071/summation-in-assembly-language) – 2012-04-05 01:08:04

回答

1

此行顯得可疑:

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

違背了評論,fst存儲堆棧到內存中的開頭而不用彈出它。如果你想彈出它,你想要fstp

總的來說,你的程序的堆棧行爲似乎是可疑的 - 它將各種東西推到fp堆棧上,但從不彈出任何東西。經過幾次迭代後,堆棧將溢出並環繞。根據您的設置,如果您沒有啓用例外,您將得到異常或獲取假冒值。