2017-10-23 10 views
0

配列のすべてを最初に追加して印刷したプログラムがあります。今は配列の平均値を取得しようとしていますが、問題があります。アセンブリ内の配列の平均値を求める(nasm)

extern printf     ; the C function to be called 

    SECTION .data     ; Data section 

table   dd    1.0 
       dd    1.0 
       dd    3.5 
       dd    2.0 
       dd    1.5 
N    equ    ($-table)/4  ; number of items in table 


msg  db  "Average = %e",0x0a,0x00 
temp dq  0 
;count dd  0 
sum  dd  0  

    SECTION .text     ; Code section. 

    global main     ; "C" main program 
main:         ; label, start of main program 
    mov  ecx, N 
    mov  ebx, 0 
    mov  [count], ecx 

     fldz       ; st0 <- 0 
for: fld  dword [table + ebx*4] ; st0 <- new value, st1 <- sum of previous 
     fadd       ; st0 <- sum of new plus previous sum 
     inc  ebx 
     loop for 

    ;fldz 
    fild dword [count]   ; store count into fpu 
    fdiv st1, st0    ; divide sum by count (N) 

;;; get sum back from FPU 
    fstp dword [sum]    ; put final sum in variable 

;;; print resulting sum 
    fld  dword [sum]    ; transform z in 64-bit word 
    fstp qword [temp]   ; store in 64-bit temp and pop stack top 


    push dword [temp+4]   ; push temp as 2 32-bit words 
    push dword [temp] 
    push dword msg    ; address of format string 
    call printf     ; Call C function 
    add  esp, 12     ; pop stack 3*4 bytes 

    mov  eax, 1     ; exit code, 0=normal 
    mov  ebx, 0 
    int  0x80     ; 

ループの直後のセクションは、私がそれを分割しようとしているところです。

fild dword [count]   ; store count into fpu 
    fdiv st1, st0    ; divide sum by count (N) 

は、私は私のプログラムは、それが2であるべきとき、誰もがいくつかの光を当てることができ、その結果5を取得し、私は10の配列の合計と、近づいていると思いますか?

てくださいとお願いします:)

+0

'FILD QWORD [ECX]'お菓子 'ecx'により、ST1を分割、あなたがfdivpを使用する必要が

をそれを考え出しましたループが残っているのでゼロです。ロードする前に、それをメモリに保存する必要があります。 –

+0

重複と同じエラーです(https://stackoverflow.com/a/2395802/224132は実際にそれをデバッグしました):数字を 'fild'しようとしていますが、実際にアドレスとして使用しています。 –

+0

質問をより正確に編集しました。セグメンテーションエラーは、アセンブリコードの構文を正しく動作させるためのものではありません。 @PeterCordes –

答えて

0

は、ポインタとしてST0

+0

ああ、 'fdiv st1、st0'を使っていました。スタックの底ではなく' st1'に結果を格納しています。ちょうど 'fidiv dword [count]'を使うことができました。被除数の代わりに除数を保持するオペランドに結果を格納する 'fdivr'と' fdivrp'もあります。 –

関連する問題