我用64位写了一个ALP代码来找出给定数据集的均值,方差和标准差。平均值很容易计算,但方差出现无穷大。我甚至尝试使用gdb调试程序,它仍然将变量值显示为0.数学处理器调用已经使用过。使用的汇编程序是NASM
%macro rw 3
mov rax,%1
mov rdi, 01
mov rsi,%2
mov rdx,%3
syscall
%endmacro rw
section .data
msg1: db 10,"Mean is: %lf"
len1 equ $-msg1
msg2: db 10,"Variance is: %lf"
len2 equ $-msg2
msg3: db 10,"SD is: %lf"
len3 equ $-msg3
array: dq 10,20,30,40,50
format db "asdas %lf"
count dq 5
section .bss
mean resq 1
m1 resq 1
var resq 1
sd resq 1
temp resq 1
temp_ar resq 5
section .text
extern printf
global main
main:
;;;;;;;;;;;;;;;;;;;;;MEAN CALCULATION;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov rdi,array
xor rcx,rcx
mov rcx,5
fldz
loop_mean:
fadd qword[rdi]
add rdi,8
loop loop_mean
fdiv qword[count]
fstp qword[mean]
mov rax,qword[mean]
mov qword[m1],rax
;;;;print mean;;;;
;rw 1,msg1,len1
lol:
;;;;;;;;;;;;;;;;VAR CALCULATION;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov rdi,array
mov r8,temp_ar
xor rcx,rcx
mov rcx,5
loop_var:
fld qword[rdi]
fsub qword[m1]
fstp qword[temp]
fld qword[temp]
fmul qword[temp]
fstp qword[r8]
add r8,8
add rdi,8
loop loop_var
mov rdi,temp_ar
xor rcx,rcx
mov rcx,5
fldz
loop_here:
fadd qword[rdi]
add rdi,8
loop loop_here
mov qword[count],5
fdiv qword[count]
fstp qword[var]
mov rax,qword[var]
here:
;;;;;;;;;;;;;;;;;;;SD;;;;;;;;;;;;;;;;;;;;;
mov rdi,msg1
sub rsp,8
mov rax,2
movsd xmm0,[mean]
movsd xmm1,[var]
movsd xmm2,[sd]
call printf
add rsp,8
call exit
exit:
mov rax,60
mov rdx,00
syscall