Advertisement
Guest User

Untitled

a guest
Oct 15th, 2014
344
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.54 KB | None | 0 0
  1. INCLUDE Irvine32.inc
  2. .data
  3.  
  4. ;Prompts
  5. inputPrompt BYTE "Please enter a number, 0 to exit: ", 0
  6. output BYTE "The square root is: ", 0
  7. absErrorPrompt BYTE "The absoulte error is: ", 0
  8. relErrorPrompt BYTE "The relative error is: ", 0
  9. actualRootPrompt BYTE "The actual square root is: ", 0
  10.  
  11. ;Constants
  12. zero REAL8 0.0 ;0 constant
  13. two REAL8 2.0 ;2 constant
  14.  
  15. ;Variables
  16. inputVar REAL8 ? ;Number to find sqrt of
  17. min REAL8 ? ;minimum boundary
  18. mid REAL8 ? ;mid point
  19. max REAL8 ? ;maximum boundary
  20. epsilon REAL8 1.0E-12 ;Epsilon
  21. root REAL8 ? ;Square sqrt
  22. realRoot REAL8 ? ;Stores actual sqrt for later calculations
  23. midSquared REAL8 ? ;variable for calculations
  24. absError REAL8 ? ;The value of absolute error
  25. relError Real8 ? ;The value of relative error
  26.  
  27. .code
  28. main PROC
  29. finit
  30. ;Gets input from user and finds max boundary, lower boundary, and does sqrt function for later
  31. input:
  32. fld zero ;Load zero to stack
  33. fstp min ;Set min bound as 0
  34.  
  35. mov edx,OFFSET inputPrompt ;Print input prompt
  36. call WriteString
  37.  
  38. call ReadFloat ;Read in number
  39. fst inputVar ;Store as input variable
  40. fst max ;Make max input variable
  41. fsqrt ;Gets sqrt of var for later
  42. fstp realRoot ;Stores in realRoot variable
  43.  
  44. fld inputVar ;Load input
  45. fld zero ;Load zero
  46. fcomip st(0), st(1) ;Compare input and 0
  47. je finish ;If input 0 end program
  48.  
  49. ;Main while loop for calculations
  50. while_loop:
  51. ffree st(0)
  52. ffree st(1)
  53.  
  54. fld min ;Load min
  55. fadd max ;Min + Max
  56. fdiv two ;(Min + Max) / 2
  57. fst mid ;Store in mid
  58. fst root ;Stores mid in root
  59. fmul mid ;Mid^2
  60. fstp midSquared ;Store in midSquared
  61.  
  62. fld inputVar ;Loads input
  63. fsub midSquared ;Input - mid^2
  64. fabs ;Takes absolute value
  65.  
  66. fld epsilon ;Loads epsilon
  67. fcomip st(0), st(1) ;Compares differrence between mid^2 and input
  68. ja end_loop ;If smaller prints out results
  69.  
  70. ffree st(0) ;Clears stack
  71. ffree st(1)
  72.  
  73. fld inputVar ;Loads inputVar
  74. fld midSquared ;Loads mid^2
  75. fcomip st(0), st(1) ;Compares mid^2 to inputVar
  76. jb if_lower ;If mid^2 lower jumps to if lower
  77.  
  78. ;If square root is greater than actual root
  79. if_greater:
  80. fld mid ;Loads mid
  81. fstp max ;Stores in high
  82. jmp while_loop ;Jumps back to while loop
  83.  
  84. ;If square root is lower than actual sqrt
  85. if_lower:
  86. fld mid ;Loads mid
  87. fstp min ;Stores in low
  88. jmp while_loop ;Jumps back to while loop
  89.  
  90. ;Calculates error
  91. end_loop:
  92. ffree st(0) ;Clears stack
  93. ffree st(1)
  94.  
  95. fld realRoot ;Actual sqrt
  96. fsub root ;Actual sqrt - measured sqrt
  97. fstp absError ;Stores absolute error
  98.  
  99. fld absError ;Loads absolute error
  100. fdiv realRoot ;Divides by real root
  101. fstp relError ;Stores in relative root
  102.  
  103.  
  104. ;Outputs results
  105. print_output:
  106. mov edx,OFFSET output ;Prints out calculated root
  107. call WriteString
  108.  
  109. fld root
  110. call WriteFloat
  111. call CrLf
  112. ffree st(0) ;Clears stack
  113.  
  114. mov edx,OFFSET actualRootPrompt ;Prints out actual root
  115. call WriteString
  116.  
  117. fld realRoot
  118. call WriteFloat
  119. call CrLf
  120. ffree st(0) ;Clears stack
  121.  
  122. mov edx,OFFSET absErrorPrompt ;Prints absolute error
  123. call WriteString
  124.  
  125. fld absError
  126. call WriteFloat
  127. ffree st(0) ;Clears stack
  128. call CrLf
  129.  
  130. mov edx,OFFSET relErrorPrompt ;Prints relative error
  131. call WriteString
  132.  
  133. fld relError
  134. call WriteFloat
  135. ffree st(0) ;Clears stack
  136. call CrLf
  137. call CrLf
  138. jmp input ;Starts over
  139.  
  140. finish:
  141. call WaitMsg ; wait for user to read results
  142. exit
  143. main ENDP
  144. END main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement