section .data
nline db 10 , 10
nline_len: equ $- nline
msg db 10 , "MIL assignment 13 : 8087 program for mean, SD, & Variance"
db 10 , "---------------------------------------------" , 10
msg_len: equ $- msg
mmsg db 10 , "CALCULATED MEAN : "
mmsg_len equ $- mmsg
sdmsg db 10 , "CALCULATED STANDARD DEVIATION : "
sdmsg_len equ $- sdmsg
vmsg db 10 , "CALCULATED VARIANCE : "
vmsg_len equ $- vmsg
array dd 102.56 , 198.21 , 100.67 , 230.78 , 67.93
count dw 05
dpoint db '.'
hdec dq 100
;---------------------------------------------------------------
section .bss
char_ans resB 2
resbuff resT 1
mean resD 1
variance resD 1
;---------------------------------------------------------------
; macros as per 64 - bit convensions
% macro print 2
mov rax, 1 ; Function 1 - write
mov rdi, 1 ; To stdout
mov rsi,% 1 ; String address
mov rdx,% 2 ; String size
syscall
; invoke operating
system to WRITE
% endmacro
% macro read 2
mov rax, 0 ; Function 0 - Read
mov rdi, 0 ; from stdin
mov rsi,% 1 ; buffer address
mov rdx,% 2 ; buffer size
syscall
; invoke operating
system to READ
% endmacro
print nline, nline_len
xor rdi, rdi ; we want return code 0
% endmacro
;---------------------------------------------------------------
section .text
global _start
_start:
print msg, msg_len
finit ; initialize coprocessor
fldz ; loads zero on top of stack st( 0 ) = 0
mov rbx, array
mov rsi, 00 ; index of array initalized to 0
xor rcx, rcx
mov cx, [ count] ; load count in cx reg
back: fadd dword[ RBX+ RSI* 4 ] ; st( 0 ) + [ array+ ( index* 4 ) ] = st( 0 )
; each element in array is of type Double word = 4 bytes
inc rsi ; increment array index
loop back ; repeat addition untill all elements are added
fidiv word[ count] ; st( 0 ) = sum of array elements / count = mean
fst dword[ mean] ; store the st( 0 ) in mean
print mmsg, mmsg_len
call display_result
mov rbx, array
mov rsi, 00 ; index of array initalized to 0
xor rcx, rcx
mov cx, [ count] ; load count in cx reg
fldz ; loads zero on top of stack st( 0 ) = 0
back1: fldz
FLD DWORD[ RBX+ RSI* 4 ] ; st( 0 ) = array[ rsi]
FSUB DWORD[ mean] ; st( 0 ) = st( 0 ) - mean
FST ST1
FMUL ; st( 0 ) = st( 0 ) * st( 1 )
FADD ; add squared value to st( 1 ) i.e . st ( 0 ) = st( 0 ) + st( 1 )
INC RSI
LOOP back1
FIDIV word[ count] ; divide result by count to get variance
FST dWORD[ variance]
FSQRT
; st
( 0 ) = sqrt ( st
( 0 ) ) = value of standard deviation
print sdmsg, sdmsg_len
CALL display_result
FLD dWORD[ variance]
print vmsg, vmsg_len
CALL display_result
;---------------------------------------------------------------
display_8:
mov rsi, char_ans+ 1
mov rcx, 2 ; number of digits
cnt: mov rdx, 0
mov rbx, 16
cmp dl, 09h ; check for remainder in RDX
jbe add30
add dl, 07h
add30:
add dl, 30h ; calculate ASCII code
mov [ rsi] , dl ; store it in buffer
dec rsi ; point to one byte back
dec rcx ; decrement count
jnz cnt
print char_ans, 2 ; display result on screen
ret
;---------------------------------------------------------------
display_result:
fimul dword[ hdec]
fbstp tword[ resbuff]
xor rcx, rcx
mov rcx, 09H
mov rsi, resbuff+ 9
nextdigit:
push rcx
push rsi
xor rax, rax
mov al, [ rsi]
call display_8
pop rsi
dec rsi
pop rcx
loop nextdigit
print dpoint, 1
xor rax, rax
mov al, [ resbuff]
call display_8
ret
;-------------------
CnNlY3Rpb24gLmRhdGEKCW5saW5lCQlkYgkxMCwxMAoJbmxpbmVfbGVuOgllcXUJJC1ubGluZQogICAgIAoJbXNnIAkJZGIgCTEwLCJNSUwgYXNzaWdubWVudCAxMyA6IDgwODcgcHJvZ3JhbSBmb3IgbWVhbiwgU0QsICYgVmFyaWFuY2UiCgkJCWRiCTEwLCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iLDEwCgltc2dfbGVuOgllcXUgCSQtbXNnCiAgICAJCgltbXNnIAlkYiAJMTAsIkNBTENVTEFURUQgTUVBTiAJCTogIgogICAgCW1tc2dfbGVuIAllcXUgCSQtbW1zZwogICAgCiAgICAJc2Rtc2cgCWRiIAkxMCwiQ0FMQ1VMQVRFRCBTVEFOREFSRCBERVZJQVRJT04JOiAiCiAgICAJc2Rtc2dfbGVuIAllcXUgCSQtc2Rtc2cKICAgIAogICAgCXZtc2cgCWRiIAkxMCwiQ0FMQ1VMQVRFRCBWQVJJQU5DRSAJCTogIgogICAgCXZtc2dfbGVuIAllcXUgCSQtdm1zZwogICAgIAogICAKICAgIAlhcnJheSAJZGQgCTEwMi41NiwgMTk4LjIxLCAxMDAuNjcsIDIzMC43OCwgNjcuOTMKICAgIAljb3VudAkJZHcgCTA1CgogICAgCWRwb2ludAlkYiAJJy4nCiAgICAJaGRlYyAJZHEgCTEwMAo7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIApzZWN0aW9uIC5ic3MKCWNoYXJfYW5zIAlyZXNCIDIKICAgIAlyZXNidWZmIAlyZXNUIDEKCgltZWFuIAkJcmVzRCAxCgl2YXJpYW5jZSAJcmVzRCAxCjstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCjttYWNyb3MgYXMgcGVyIDY0LWJpdCBjb252ZW5zaW9ucwoKJW1hY3JvICAJcHJpbnQgICAyCgltb3YgCXJheCwxCQk7IEZ1bmN0aW9uIDEgLSB3cml0ZQogIAltb3YgCXJkaSwxCQk7IFRvIHN0ZG91dAogICAJbW92IAlyc2ksJTEJICAgICAgIDsgU3RyaW5nIGFkZHJlc3MKICAgCW1vdiAJcmR4LCUyCSAgICAgICA7IFN0cmluZyBzaXplCiAgIAlzeXNjYWxsCQk7IGludm9rZSBvcGVyYXRpbmcgc3lzdGVtIHRvIFdSSVRFCiVlbmRtYWNybwoKJW1hY3JvICByZWFkICAgMgoJbW92IAlyYXgsMAkJOyBGdW5jdGlvbiAwIC0gUmVhZAogIAltb3YgCXJkaSwwCQk7IGZyb20gc3RkaW4KICAgCW1vdiAJcnNpLCUxCSAgICAgICA7IGJ1ZmZlciBhZGRyZXNzCiAgIAltb3YgCXJkeCwlMgkgICAgICAgOyBidWZmZXIgc2l6ZQogICAJc3lzY2FsbAkJOyBpbnZva2Ugb3BlcmF0aW5nIHN5c3RlbSB0byBSRUFECiVlbmRtYWNybwoKJW1hY3JvCWV4aXQJMAoJcHJpbnQJbmxpbmUsIG5saW5lX2xlbgoJbW92IAlyYXgsIDYwCTsgc3lzdGVtIGNhbGwgNjAgaXMgZXhpdAoJeG9yIAlyZGksIHJkaSAJOyB3ZSB3YW50IHJldHVybiBjb2RlIDAKCXN5c2NhbGwgCQk7IGludm9rZSBvcGVyYXRpbmcgc3lzdGVtIHRvIGV4aXQKJWVuZG1hY3JvCjstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCgpzZWN0aW9uIC50ZXh0CiAgIGdsb2JhbCBfc3RhcnQKX3N0YXJ0OgoKCXByaW50CW1zZywgbXNnX2xlbgoKCWZpbml0CQkJICAgICAgIAkJOyBpbml0aWFsaXplIGNvcHJvY2Vzc29yCglmbGR6CQkJICAgICAgIAkJCTsgbG9hZHMgemVybyBvbiB0b3Agb2Ygc3RhY2sgc3QoMCk9MAoKCW1vdiAJcmJ4LGFycmF5Cgltb3YgCXJzaSwwMAkJICAgICAgIAkJOyBpbmRleCBvZiBhcnJheSBpbml0YWxpemVkIHRvIDAKCXhvciAJcmN4LHJjeAkKCW1vdiAJY3gsW2NvdW50XQkgICAgICAgCQk7IGxvYWQgY291bnQgaW4gY3ggcmVnCgpiYWNrOglmYWRkIAlkd29yZFtSQlgrUlNJKjRdCTsgc3QoMCkrW2FycmF5KyhpbmRleCo0KV09c3QoMCkKCQkJCQkJCQk7IGVhY2ggZWxlbWVudCBpbiBhcnJheSBpcyBvZiB0eXBlIERvdWJsZSB3b3JkID0gNCBieXRlcwoJaW5jIAlyc2kJCQkJCQk7IGluY3JlbWVudCBhcnJheSBpbmRleAoJbG9vcCAJYmFjawkJCQkJOyByZXBlYXQgYWRkaXRpb24gdW50aWxsIGFsbCBlbGVtZW50cyBhcmUgYWRkZWQKCglmaWRpdgl3b3JkW2NvdW50XQkJOyBzdCgwKT1zdW0gb2YgYXJyYXkgZWxlbWVudHMgLyBjb3VudCA9IG1lYW4KCWZzdCAJZHdvcmRbbWVhbl0JCTsgc3RvcmUgdGhlIHN0KDApIGluIG1lYW4KCglwcmludCAgbW1zZyxtbXNnX2xlbgkKCWNhbGwgCWRpc3BsYXlfcmVzdWx0CgoJbW92IAlyYngsYXJyYXkKCW1vdiAJcnNpLDAwCQkgICAgICAgOyBpbmRleCBvZiBhcnJheSBpbml0YWxpemVkIHRvIDAKCXhvciAJcmN4LHJjeAkKCW1vdiAJY3gsW2NvdW50XQkJOyBsb2FkIGNvdW50IGluIGN4IHJlZwoKCWZsZHoJCQkJOyBsb2FkcyB6ZXJvIG9uIHRvcCBvZiBzdGFjayBzdCgwKT0wCmJhY2sxOmZsZHoKCUZMRCAJRFdPUkRbUkJYK1JTSSo0XSAgICAgO3N0KDApPWFycmF5W3JzaV0KCUZTVUIgCURXT1JEW21lYW5dICAgICAgICAgIDtzdCgwKT1zdCgwKS1tZWFuCglGU1QgCVNUMQoJRk1VTCAgICAgICAgICAgICAgICAgICAgICAgIDtzdCgwKT1zdCgwKSpzdCgxKSAgICAgICAgICAgICAgICAgCglGQUREICAgICAgICAgICAgICAgICAgICAgICAgO2FkZCBzcXVhcmVkIHZhbHVlIHRvIHN0KDEpIGkuZS4gc3QoMCk9c3QoMCkrc3QoMSkKCUlOQyAJUlNJCglMT09QIAliYWNrMQoKCUZJRElWCXdvcmRbY291bnRdICAgICAgICAgIDtkaXZpZGUgcmVzdWx0IGJ5IGNvdW50IHRvIGdldCB2YXJpYW5jZQoJRlNUIAlkV09SRFt2YXJpYW5jZV0KCUZTUVJUICAgICAgICAgICAgICAgICAgICAgICA7c3QoMCk9c3FydChzdCgwKSk9IHZhbHVlIG9mIHN0YW5kYXJkIGRldmlhdGlvbgoKCXByaW50ICBzZG1zZyxzZG1zZ19sZW4KCUNBTEwgCWRpc3BsYXlfcmVzdWx0CgoJRkxEIAlkV09SRFt2YXJpYW5jZV0KCXByaW50IHZtc2csdm1zZ19sZW4KCUNBTEwgCWRpc3BsYXlfcmVzdWx0CgkKCWV4aXQKOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKZGlzcGxheV84OgoJbW92IAlyc2ksY2hhcl9hbnMrMQkKCW1vdiAJcmN4LDIJCTsgbnVtYmVyIG9mIGRpZ2l0cyAKCmNudDoJbW92IAlyZHgsMAkJCgltb3YgCXJieCwxNgkKCWRpdiAJcmJ4CgljbXAgCWRsLCAwOWgJOyBjaGVjayBmb3IgcmVtYWluZGVyIGluIFJEWAoJamJlICAJYWRkMzAKCWFkZCAgCWRsLCAwN2ggCmFkZDMwOgoJYWRkIAlkbCwzMGgJOyBjYWxjdWxhdGUgQVNDSUkgY29kZQoJbW92IAlbcnNpXSxkbAk7IHN0b3JlIGl0IGluIGJ1ZmZlcgoJZGVjIAlyc2kJCTsgcG9pbnQgdG8gb25lIGJ5dGUgYmFjawoKCWRlYyAJcmN4CQk7IGRlY3JlbWVudCBjb3VudAoJam56IAljbnQJCQoJCglwcmludCBjaGFyX2FucywyCTsgZGlzcGxheSByZXN1bHQgb24gc2NyZWVuCglyZXQKOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKZGlzcGxheV9yZXN1bHQ6CgoJZmltdWwJZHdvcmRbaGRlY10KCWZic3RwCXR3b3JkW3Jlc2J1ZmZdCgl4b3IgCXJjeCxyY3gKCW1vdiAJcmN4LDA5SAoJbW92IAlyc2kscmVzYnVmZis5CgpuZXh0ZGlnaXQ6CQoJcHVzaCAJcmN4CglwdXNoIAlyc2kKCgl4b3IJcmF4LHJheAoJbW92IAlhbCxbcnNpXQoJY2FsbCAJZGlzcGxheV84CgoJcG9wIAlyc2kKCWRlYyAJcnNpCglwb3AgCXJjeAoJbG9vcCAJbmV4dGRpZ2l0CgoJcHJpbnQgZHBvaW50LDEKCgl4b3IJcmF4LHJheAoJbW92IGFsLFtyZXNidWZmXQoJY2FsbCBkaXNwbGF5XzgKCglyZXQKOy0tLS0tLS0tLS0tLS0tLS0tLS0K