Mean, Variance, Standard Deviation using 8087 (Assembly x86)

%macro disp 4  mov eax,%1  mov ebx,%2  mov ecx,%3  mov edx,%4  int 80h  %endmacro    section .data  arr dd 10.00 , 20.00 , 30.00 , 40.00 , 50.00  num dd 5.00  mult dd 10000.00  dot db “.”  newl db 10    section .bss    mean rest 1  result resb 15  temp resb 1  meanst resd 1  store1 resd 1  store2 resd 1  section .text    global _start  _start:    mov esi,arr  mov edx,5    finit    ; initialization of co processor  fldz    ;load zero on top the stack    ;ADDITION OF ARRAY STARTED    above:    fadd dword[esi]    ; top of the stack= top of the stack+[esi]  add esi,4  dec edx  jnz above    ;ADDITION OF ARRAY ENDED    fdiv dword[num]    ;top of the stack = top of the stack/[num]    fst dword[meanst];this will store top of the stack real in [meanst] variable    fmul dword[mult];this will store =top of the stack multiply by 10000.00  this is done to print decimal    fbstp tword[mean]; this will convert top of the stack to BCD and pop in mean register    ;mean get displayed    mov esi,mean  call print    ;variance (variance =((firstno. -mean)2+(secondno. -mean)2….)/totalnumber  disp 0,0,0,0  mov esi,0  mov esi,arr ;first esi will point to the array  mov edx,5    ;as there are total 5 number  mov dword[store2],0h    ;initialisinf store2 to 0 which will contain final variance answer    above4:    fldz            ;top of stack is initialize to 0  fadd dword[esi]        ;top of stack is initialise by [esi]  fsub dword[meanst]    ;mean is subtracted  fst dword[store1]    ; no. -mean is stored in [store1]  fmul dword[store1]    ;top of the stack is multiply by same number  fadd dword[store2]    ;added to top of stack  fst dword[store2]    ;finally store store2 number which final value will have (firstno. -mean)2+(secondno. -mean)2….  add esi,4        ;as array is dd  dec edx            ;counter is decremented  jnz above4    fdiv dword[num]        ;top of stack will be divided by total number thus having variance value  fst dword[store1]    ;store top of stack in store1  fmul dword[mult]    ;multiply top of stack with 10000  fbstp tword[mean]    ;and store in mean variable  mov esi,mean  call print        ;display of variance    disp 0,0,0,0  fldz  fld dword[store1]  fsqrt        ;this will find square root of variance and store in top of stack  fmul dword[mult]  fbstp tword[mean]  mov esi,mean  call print    disp 1,0,0,0    ;exit is called    print:    disp 0,0,0,0    ;all ax,bx,cx,dx register is initialize to 0    mov edi,result    ;edi pointing through display buffer  add esi,9    ;esi now pinted to last element  mov edx,10    ;edx act as a counter    ;this loop is for checking when the byte of esi is not  0 if not 0 then move to below else repeat process  above1:    mov al,byte[esi]  cmp al,00  jne below  dec esi  dec edx  jmp above1    below:    mov eax,0    ;eax is initialise to 0    above3:    mov al,byte[esi]    ;al will contain 2 packed number  mov cx,2        ;cx is used as counter    above2:    rol al,4  mov [temp],al        ;first ah bit will convert into ascii then al register converted into ascii  and al,0FH  add al,30h  mov [edi],al  inc edi  mov al,[temp]  dec cx  jnz above2    dec esi  cmp edx,3  jne below1  mov al,byte[dot]    ;if edx become 3 then . should be printed  mov [edi],al  inc edi    below1:    dec edx  jnz above3    disp 4,1,result,15  disp 4,1,newl,1  ret

View Article Page
Download