配列のすべてを最初に追加して印刷したプログラムがあります。今は配列の平均値を取得しようとしていますが、問題があります。アセンブリ内の配列の平均値を求める(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の配列の合計と、近づいていると思いますか?
てくださいとお願いします:)
'FILD QWORD [ECX]'お菓子 'ecx'により、ST1を分割、あなたが
fdivp
を使用する必要がをそれを考え出しましたループが残っているのでゼロです。ロードする前に、それをメモリに保存する必要があります。 –
重複と同じエラーです(https://stackoverflow.com/a/2395802/224132は実際にそれをデバッグしました):数字を 'fild'しようとしていますが、実際にアドレスとして使用しています。 –
質問をより正確に編集しました。セグメンテーションエラーは、アセンブリコードの構文を正しく動作させるためのものではありません。 @PeterCordes –