Advertisement
StreetKatya

Система уравнений

Sep 15th, 2021
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.31 KB | None | 0 0
  1. ; Новый проект fasm32 успешно создан
  2. ; Заполнен демо программой «Здравствуй, мир!»
  3. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  4. format PE console
  5. entry start
  6. include 'includes\win32ax.inc'
  7. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  8. section '.data' data readable writeable
  9. a dd ?
  10. c dd ?
  11. b dd ?
  12. z dd ?
  13. Buffer db 12 dup(?)
  14. lBuffer = $ - Buffer
  15. CntCharRead dd ?
  16. answer dd ?
  17. stdin dd ?
  18. stdout dd ?
  19. first db 5 dup(?)
  20. lfirst dd ?
  21. MsgA db 'a = '
  22. lMsgA = $-MsgA
  23. Msgb db 'b = '
  24. lMsgb = $-Msgb
  25. MsgZ db 'Z = '
  26. lMsgZ = $-MsgZ
  27. MsgErr db 'Input error'
  28. LMsgErr = $- MsgErr
  29. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  30. section '.code' code readable executable
  31. start:
  32. invoke GetStdHandle,STD_OUTPUT_HANDLE
  33. mov [stdout],eax
  34. invoke GetStdHandle,STD_INPUT_HANDLE
  35. mov [stdin],eax
  36. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  37. ;Ввод данных
  38. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  39.  
  40. invoke WriteConsole,[stdout], MsgA, lMsgA, NULL, NULL
  41. stdcall readInt, a , answer
  42. cmp dword[answer], 0
  43. jne Err1
  44.  
  45. invoke WriteConsole,[stdout], Msgb, lMsgb, NULL, NULL
  46. stdcall readInt, b , answer
  47. cmp dword[answer], 0
  48. jne Err1
  49. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  50. ;Проверяем второе условие на равенство
  51. mov eax,[a] ;Тут будет жить a - eax
  52. mov ebx,[b] ;Тут будет жить b - ebx
  53. cmp eax,ebx
  54. je Ravno ;если равны
  55. jg Bolzhe ;если больше
  56. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  57. ; a < b ===> (a*a-b)/b
  58. mov esi,eax ; esi = a
  59. imul esi ;a*a
  60. sub eax,ebx ;(a*a-b)
  61. mov ebx,[b]
  62. cdq
  63. idiv ebx
  64. jmp Konec
  65. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  66. ; a = b ===> -5
  67. Ravno:
  68. mov eax,-5
  69. jmp Konec
  70. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  71. ; a > b ===> b/a +5
  72. Bolzhe:
  73. mov eax,[b]
  74. ;cinvoke printf,"%d ",eax
  75. cdq
  76. idiv [a]
  77. ;cinvoke printf,"%d ",eax
  78. add eax,5
  79. ;cinvoke printf,"%d ",eax
  80. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  81. Konec: mov [z],eax
  82. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  83. invoke WriteConsole,[stdout], MsgZ, lMsgZ, NULL, NULL
  84. stdcall writeInt, [z]
  85. jmp exit
  86. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  87. Err1:
  88. invoke WriteConsole,[stdout],MsgErr,LMsgErr, NULL, NULL
  89.  
  90. exit:
  91. invoke ReadConsole,[stdin],first,1,lfirst,NULL
  92. invoke ExitProcess,0
  93. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  94. proc writeInt number
  95. push eax
  96. push edx
  97. push ecx
  98. push esi
  99. push ebx
  100. push ebp
  101.  
  102. mov eax, [number]
  103. mov esi, Buffer
  104. xor ecx,ecx
  105. xor ebp,ebp
  106. ;обработка знака
  107. cmp eax, 0
  108. jge m1
  109. mov byte[esi],'-'
  110. inc esi
  111. inc ebp
  112. neg eax
  113. ;получение цифр числа
  114. m1:
  115. mov ebx, 10
  116. ldiv: cdq
  117. idiv ebx
  118. push edx
  119. inc ecx
  120. cmp eax, 0
  121. jne ldiv
  122.  
  123. add ebp,ecx ; длина строки для вывод
  124. ; извлечение цифр из стека и преобразование в символы
  125. l1: pop edx
  126. add dl, '0'
  127. mov [esi], dl
  128. inc esi
  129. loop l1
  130. invoke WriteConsole,[stdout],Buffer,ebp,NULL,NULL
  131.  
  132. pop ebp
  133. pop ebx
  134. pop esi
  135. pop ecx
  136. pop edx
  137. pop eax
  138.  
  139. ret
  140. endp
  141. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  142. proc readInt number, errorIn ; errorIn =0 OK errorIn = 1 bukva errorIn = 2 over
  143. pusha
  144. invoke ReadConsole,[stdin],Buffer,lBuffer,CntCharRead,NULL ; чтение строки
  145. mov ecx, [CntCharRead]
  146. sub ecx, 2
  147. xor eax,eax
  148. xor esi, esi
  149. xor ebx, ebx
  150. mov edi, 10
  151. ; анализ знака
  152. cmp byte [Buffer],'-'
  153. jne m2
  154. dec ecx
  155. inc esi
  156.  
  157. m2: ; выбираем сивол и преобразуем в цифру
  158. mov bl, [Buffer + esi]
  159. sub bl, '0'
  160. cmp bl, 0
  161. jl er1
  162. cmp bl, 9
  163. jg er1
  164. ; схема горнера
  165. imul edi
  166. jo er2
  167. add eax, ebx
  168. jc er2
  169. inc esi
  170. loop m2
  171. ; анализ знака
  172. cmp byte [Buffer],'-'
  173. jne m3
  174. neg eax
  175. m3: mov edx,[number] ; засение результатов в параметры
  176. mov [edx], eax
  177. mov edx, [errorIn]
  178. mov dword[edx], 0
  179. jmp m4
  180. er1: mov edx, [errorIn]
  181. mov dword[edx], 1
  182. jmp m4
  183. er2: mov edx, [errorIn]
  184. mov dword[edx], 2
  185. m4: popa
  186. ret
  187. endp
  188. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  189. section '.idata' import data readable writeable
  190. library kernel32,'kernel32.dll', msvcrt, 'msvcrt.dll'
  191. import kernel32,ExitProcess , 'ExitProcess' ,\
  192. GetStdHandle,'GetStdHandle',\
  193. WriteConsole,'WriteConsoleA',\
  194. ReadConsole,'ReadConsoleA',\
  195. GetProcessHeap, 'GetProcessHeap',\
  196. HeapCreate , 'HeapCreate' ,\
  197. HeapDestroy , 'HeapDestroy' ,\
  198. HeapAlloc , 'HeapAlloc' ,\
  199. HeapFree , 'HeapFree'
  200. import msvcrt, printf,'printf',scanf, 'scanf' ,getchar,'getchar'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement