2012-04-03 7 views
0

Der Versuch, eine harmonische Reihe zu berechnen.Harmonische Serie mit x86-64 Baugruppe

Im Moment gebe ich die Nummer ein, die ich hinzufügen möchte.

Wenn ich eine kleine Zahl wie 1.2 eingeben, stoppt das Programm einfach, stürzt nicht ab, es scheint Berechnungen zu machen.

aber es endet nie das Programm

hier mein Code

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 

Der Code ist im Grunde der Berechnung des 1/2 oder 1/3 oder 1/4 und es zu einer laufenden Summe hinzufügen, dann vergleicht, um zu sehen, wenn ich einen Wert über dem erreicht habe, was ich eingegeben habe, sobald es die Schleife verlassen sollte

siehst du meinen Fehler?

+0

Der letzte 'jmp' ist (logisch)' springen wenn kleiner als ODER gleich'. Es gibt keinen guten Grund, 387-Code auf x86-64 zu verwenden. SSE ist orthogonaler als die plumpe, stack-basierte ISA - und macht Dinge wie Vergleiche usw. viel einfacher. –

+0

mögliches Duplikat von [Summierung in Assembler] (http://stackoverflow.com/questions/10021071/summation-in-assembly-language) –

Antwort

1

Diese Linie scheint verdächtig:

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

entgegen den Kommentar, fst speichert die Oberseite des Stapels in dem Speicher, ohne es zu knallen. Sie möchten fstp, wenn Sie es pop wollen.

Insgesamt wirkt das Stack-Verhalten Ihres Programms verdächtig - es verschiebt verschiedene Dinge auf den FP-Stack, aber nie erscheint etwas. Nach ein paar Iterationen wird der Stapel überlaufen und sich umwickeln. Abhängig von Ihren Einstellungen erhalten Sie dann entweder eine Ausnahme oder falsche Werte, wenn Sie keine Ausnahmen aktiviert haben.