私は一般的にアセンブリ、特にFPUの使用法に慣れていません。
乱数の配列の標準偏差を計算する学校の課題を書いています。
配列がロードされ、平均計算が正常に機能します。プロセス全体は、7個以下の値の配列に対して機能しますが、8個以上の要素の配列サイズに対して-1。#IND(これはNaNを意味しますか?)を返します。
(mean --element)^2値を合計するループ内で何かが発生しています。何が起こっているのかわかりませんが、FPUスタックが何らかの形で壊れていると思います。
誰かが私を正しい方向に向けることができれば、私は完全に喜んでいます。
fla = REAL8
; STD DEVIATION
stdDev:
call meanCalcFunc ; fmean = loaded
mov ebx, offset array1 ; Location of Element into EBX
mov ecx, [esp+4] ; ECX = num of elements in array
mov mem1, 0 ; Mem1 = 0
fld mem1 ; ST = 0
fstp fla ; fla = ST = 0
mainFunc:
mov eax, [ebx] ; Array Element into EAX
mov mem1, eax ; Array Element into mem1
fld fmean ; ST = mean of array
fisub mem1 ; mean - element -> ST
fld ST ; Now ST and ST(1) = difference of mean - element
fmulp ST(1), ST ; Difference^2 in ST(1)
fld ST(1) ; Copy Difference^2 to ST
fadd fla ; FLA += Difference^2
fstp fla
add ebx, 4 ; Move to next element in array
loop mainFunc
fld fla ; ST = Sum of squares
mov ecx, [esp+4] ; Num of elements to ECX
mov mem1, ecx ; Num of elements to mem1
fidiv mem1 ; ST = Sum of squares / num of elements
fst fla
fsqrt ; ST = final result
fstp fla ; flb = final result
INVOKE _gcvt, fla, 8, ADDR outstring
output devlbl, outstring
ret