Advertisement
Guest User

Untitled

a guest
Dec 6th, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. format PE GUI 4.0 ; GUI-приложение для
  2. ; Windows (EXE-файл)
  3. include "\fasm\INCLUDE\win32ax.inc" ; путь к
  4. ; подкаталогу /include/
  5.  
  6. .data
  7. lpCommLine dd ? ; указатель на командную строку
  8. form_str db "arg[0]: s=%s",10,10,"arg[1]: a=%.3f",10,10, "arg[2]: b=%.3f",0 ; строка формата вывода
  9. res_str db 512 dup(?) ; строка форматированного вывода
  10. s db 256 dup("Командная строка",0) ; командная строка (default)
  11. a dq 0.5 ; "плавающее" число (default);
  12. b dq 1.0 ; "плавающее" число (default)
  13. n dq 1000.0; Кол-во разбиений интервала
  14. h dq ?; Шаг по X
  15. two dq 2.0; Два
  16. three dq 3.0; Три
  17. i dq ?;
  18. x dq ?;
  19. result dq ?; Ответ
  20. msg db 256 dup ? ; строка вывода
  21.  
  22.  
  23. .code
  24. start: ; точка старта программы
  25.  
  26. cinvoke GetCommandLine ; взять командную строку: eax < указатель на командную строку
  27. MOV [lpCommLine],eax ; запомнили указатель на
  28. ; командную строку по адресу в lpCommLine
  29. ;
  30. cinvoke MessageBox,0,[lpCommLine],"Командная строка полностью",MB_OK ; eax < код нажатой кнопки
  31. ;
  32. cinvoke sscanf, [lpCommLine], "%s %lf %lf", s,a,b ; из
  33. ; строки согласно форматам читаются поля
  34. cinvoke sprintf, res_str, form_str, s,dword[a],dword[a+4], dword[b],dword[b+4]
  35. cinvoke MessageBox,0,res_str,"Аргументы командной строки",MB_OK ; eax < код нажатой кнопки
  36. ; Считали значения a и b
  37. ; ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  38.  
  39. ;st0 - значение шага цикла
  40. ;st1 - значение x
  41. ;st2 - значение площади S
  42.  
  43. fldz;S=0
  44. fld[a];X=a S=0
  45. fldz;i=0 X=a S=0
  46.  
  47. ; Вычислим h и закинем ее в соответствующую переменную
  48. fld[b]
  49. fld[a]
  50. fsubp st1, st0; вычислили b-a
  51. fld[n]
  52. fdivp st1, st0; вычислили (b-a)/n
  53. fstp [h];закинули в h
  54.  
  55. ; ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  56. fld st1; закинули x
  57. fld st2; закинули x
  58. fmulp st1, st0; вычислили x^2
  59.  
  60. fld1; закинули 1
  61. fdiv st0, st1; вычислили 1 / x^(2) = x^(-2)
  62. fstp st1;
  63.  
  64. fld[b]; закинули b
  65. fmulp st1,st0; вычислили b*x^(-2)
  66.  
  67. fld[a]; закинули а
  68. faddp st1,st0; вычислили a + b*x^(-2)
  69.  
  70. faddp st3, st0; S = f(x0)
  71. ; ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  72.  
  73. ; основной цикл программы
  74. loop_start:
  75.  
  76. fld1
  77. faddp st1,st0; увеличиваем значение i на 1
  78.  
  79. fld [h]
  80. faddp st2,st0; увеличиваем значение x на h
  81.  
  82. jmp func; Вычисляем f(x), сохраняем в st0
  83. func_counted:
  84.  
  85. fld[two]
  86. fmulp st1, st0; Вычисляем 2*f(x)
  87.  
  88. fld st1
  89. fcomip st2;
  90. jnp multi_two; если i нечетное, то умножаем значение функции на 2
  91. multi_two_counted:
  92.  
  93. faddp st3,st0; Вычисляем S = S + k*f(x), k = 2 если i четное и 4, если i нечетное
  94.  
  95. fld[n]; закинули n
  96. fld1
  97. fsubp st1, st0; n-1
  98. fcomip st1; сравниваем n с i
  99. jae loop_start ; выходит когда i = n
  100.  
  101.  ; ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  102.  
  103. fld st1; закинули x
  104. fld st2; закинули x
  105. fmulp st1, st0; вычислили x^2
  106.  
  107. fld1; закинули 1
  108. fdiv st0, st1; вычислили 1 / x^(2) = x^(-2)
  109. fstp st1;
  110.  
  111. fld[b]; закинули b
  112. fmulp st1,st0; вычислили b*x^(-2)
  113.  
  114. fld[a]; закинули а
  115. faddp st1,st0; вычислили a + b*x^(-2)
  116.  
  117. faddp st3, st0; S = f(xn)
  118. ; ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  119. ;jmp res_output
  120.  
  121. fld [h]
  122. fld [three]
  123. fdivp st1, st0 ; Вычислили h/3
  124. fmulp st3, st0 ; Вычислили h/3*(...)
  125.  
  126.  
  127. res_output:
  128. fstp [i] ; i
  129. fstp [x] ; X
  130. fstp [result] ; S
  131.  
  132. ; Вывод с помощью sprintf()
  133. ;cinvoke sprintf, msg, "Result = %f", dword[result], dword[result+4]
  134. cinvoke sprintf, msg, "I = %f, X = %f, Result = %f", dword[i], dword[i+4] , dword[x], dword[x+4] , dword[result], dword[result+4]
  135. ; Вывод полученной строки в Виндовую-форму
  136. invoke MessageBox, 0, msg, "Result", MB_OK
  137.  
  138. ; Выход из программы
  139. invoke ExitProcess, 0
  140.  
  141. entry start
  142.  
  143. ; Вычисляет F(X) = a + b*x^(-2)
  144. ; Результат записывает в st0
  145. func:
  146. fld st1; закинули x
  147. fld st2; закинули x
  148. fmulp st1, st0; вычислили x^2
  149.  
  150. fld1; закинули 1
  151. fdiv st0, st1; вычислили 1 / x^(2) = x^(-2)
  152. fstp st1;
  153.  
  154. fld[b]; закинули b
  155. fmulp st1,st0; вычислили b*x^(-2)
  156.  
  157. fld[a]; закинули а
  158. faddp st1,st0; вычислили f(x) = a + b*x^(-2)
  159. jmp func_counted
  160.  
  161.  
  162. ; Умножает значение в st0 на 2
  163. multi_two:
  164. fld[two]
  165. fmulp st1, st0; Вычисляем 2*f(x)
  166. jmp multi_two_counted
  167.  
  168.  
  169. ; ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  170. data import ; импортируем стандартные функции Windows
  171. library user32,'USER32.DLL',\
  172. msvcrt,'MSVCRT.DLL' ,\
  173. kernel32,'KERNEL32.DLL'
  174.  
  175. import kernel32, \
  176. ExitProcess,'ExitProcess', \
  177. GetCommandLine,'GetCommandLineA' ; ANSI-функция
  178.  
  179. import user32, \
  180. MessageBox, 'MessageBoxA'
  181.  
  182. import msvcrt, \
  183. sprintf, 'sprintf', \
  184. sscanf, 'sscanf'
  185. end data
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement