Mean, Variance, Standard Deviation using 8087 (Assembly x86)
April 23, 2016
Categorised in: Assembly Codes, MIT Codes
%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
Pratik Kataria is currently learning Springboot and Hibernate.
Technologies known and worked on: C/C++, Java, Python, JavaScript, HTML, CSS, WordPress, Angular, Ionic, MongoDB, SQL and Android.
Softwares known and worked on: Adobe Photoshop, Adobe Illustrator and Adobe After Effects.