1

私は一般的にアセンブリ、特に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
4

1 に答える 1

5

ループには不均衡な数のロードとポップが含まれているため、ループを繰り返すたびにx87スタックにもう1つのアイテムが残ります。スタックがオーバーフローすると、観察している結果が得られます。そうしないでください。

instruction        elements on stack
-------------------------------------------
mainFunc:          k
fld     fmean      k + 1
fisub   mem1       k + 1
fld     ST         k + 2
fmulp   ST(1), ST  k + 1
fld     ST(1)      k + 2
fadd    fla        k + 2
fstp    fla        k + 1
loop    mainFunc   k + 1
于 2012-05-12T19:45:28.043 に答える