Advertisement
StreetKatya

2laba_2

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