Advertisement
StreetKatya

Значение

Sep 15th, 2021
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.01 KB | None | 0 0
  1. ; Новый проект fasm32 успешно создан
  2. ; Заполнен демо программой «Здравствуй, мир!»
  3. format PE console
  4. entry start
  5. include 'includes\win32ax.inc'
  6.  
  7. ;include 'WIN32AX.INC'
  8. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  9. section '.data' data readable writeable
  10. a dd ?
  11. b dd ?
  12. c dd ?
  13. tmp4 dd 4
  14. tmp3 dd 3
  15. result dd ?
  16. buffer db 20 dup(?)
  17. lbuffer dd ?
  18. stdin dd ?
  19. stdout dd ?
  20. first db 10 dup(?)
  21. lfirst dd ?
  22. ;Начальные сообщения
  23. MsgA db ' A='
  24. lMsgA = $-MsgA
  25. MsgB db ' B='
  26. lMsgB = $-MsgB
  27. MsgC db ' C='
  28. lMsgC = $-MsgC
  29. MsgRes db ' Result='
  30. lMsgRes = $-MsgRes
  31. ;Ошибки
  32. MsgEr0 db ' OverFlow'
  33. lMsgEr0 = $-MsgEr0
  34. MsgEr1 db ' Incorrect input'
  35. lMsgEr1 = $-MsgEr1
  36. MsgEr2 db ' Input error'
  37. lMsgEr2 = $-MsgEr2
  38. MsgEr3 db ' Division by ZERO'
  39. lMsgEr3 = $-MsgEr3
  40. kodEr dd 0
  41. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  42. section '.code' code readable executable
  43. start:
  44. invoke GetStdHandle, STD_OUTPUT_HANDLE
  45. mov [stdout], eax
  46. invoke GetStdHandle, STD_INPUT_HANDLE
  47. mov [stdin], eax
  48. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  49. ;Вводим A
  50. invoke WriteConsole, [stdout], MsgA, lMsgA, NULL, NULL
  51. stdcall readInt,a,kodEr
  52. cmp dword[kodEr],0
  53. jne vErr1
  54. ;Вводим B
  55. invoke WriteConsole, [stdout], MsgB, lMsgB, NULL, NULL
  56. stdcall readInt,b,kodEr
  57. cmp dword[kodEr],0
  58. jne vErr1
  59. ;Вводим C
  60. invoke WriteConsole, [stdout], MsgC, lMsgC, NULL, NULL
  61. stdcall readInt,c,kodEr
  62. cmp dword[kodEr],0
  63. jne vErr1
  64. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  65. ;(a+b/4-1)/(c/3-a*b)
  66. ;cinvoke printf,"%d",[a]
  67. ;cinvoke printf,"%d",[b]
  68. ;cinvoke printf,"%d",[c]
  69. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  70. mov eax, [c]
  71. cdq
  72. idiv [tmp3]; c/3 - eax
  73. mov ecx, eax; c/3 - ecx
  74.  
  75. mov eax, [a]
  76. imul [b]; a*b - eax:edx
  77. jo vErr0 ;переполнение
  78. mov ebx, eax ; a*b - ebx
  79.  
  80. sub ecx,ebx; c/3 - a*b - ecx
  81. cmp ecx,0
  82. je vErr3
  83.  
  84. mov eax, [b]
  85. cdq
  86. idiv [tmp4]; b/4 - eax
  87. add eax,[a]; a+b/4 - eax
  88. sub eax, 1; a+b/4-1 - eax
  89.  
  90. cdq
  91. idiv ecx
  92. mov [result], eax
  93. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  94. invoke WriteConsole,[stdout],MsgRes,lMsgRes,NULL,NULL
  95. stdcall WriteInt,[result]
  96. jmp exit
  97. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  98. vErr0:
  99. invoke WriteConsole,[stdout],MsgEr0,lMsgEr0,NULL,NULL ;overflow
  100. jmp exit
  101. ;vErr1:
  102. ;cmp dword[kodEr],1
  103. ;jne vErr2
  104. ;invoke WriteConsole,[stdout],MsgEr1,lMsgEr1,NULL,NULL ;incorrect input
  105. ;jmp exit
  106. vErr1:
  107. invoke WriteConsole,[stdout],MsgEr2,lMsgEr2,NULL,NULL ;input error
  108. jmp exit
  109. vErr3:
  110. invoke WriteConsole,[stdout],MsgEr3,lMsgEr3,NULL,NULL ; division by zero
  111. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  112. exit:
  113. cinvoke getchar
  114. cinvoke getchar
  115. invoke ExitProcess, 0
  116. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  117. proc WriteInt number
  118. push eax
  119. push edx
  120. push esi
  121. push ecx
  122. push ebx
  123. push ebp
  124.  
  125. mov eax,[number]
  126. mov esi,buffer
  127. mov ebp,10
  128. xor ecx,ecx
  129. xor ebx,ebx
  130. cmp eax,0
  131. jge m1
  132. mov byte[esi],'-'
  133. inc esi
  134. inc ebx
  135. neg eax
  136. m1:
  137. cdq
  138. idiv ebp
  139. push edx
  140. inc ecx
  141. cmp eax,0
  142. jne m1
  143. add ebx,ecx
  144. m2: pop edx
  145. add dl,'0'
  146. mov [esi],dl
  147. inc esi
  148. loop m2
  149. invoke WriteConsole,[stdout],buffer,ebx,NULL,NULL
  150.  
  151. pop ebp
  152. pop ebx
  153. pop ecx
  154. pop esi
  155. pop edx
  156. pop eax
  157. ret
  158. endp
  159. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  160. proc readInt numbers,ErrorIn
  161. pusha
  162.  
  163. invoke ReadConsole,[stdin],buffer,12,lbuffer,NULL
  164. mov ecx,[lbuffer]
  165. sub ecx,2
  166. mov esi,buffer
  167. cmp byte[esi],'-'
  168. jne m3
  169. inc esi
  170. dec ecx
  171. m3:
  172. xor eax,eax
  173. mov edi,10
  174. xor ebx,ebx
  175. m4:
  176. mov bl,byte[esi]
  177. sub bl,'0'
  178. cmp bl,0
  179. jl er1
  180. cmp bl,9
  181. jg er1
  182. imul edi
  183. jo er2
  184. add eax,ebx
  185. jo er2
  186. jc er2
  187. inc esi
  188. loop m4
  189. cmp byte[buffer],'-'
  190. jne m5
  191. neg eax
  192. m5:
  193. mov edx,[numbers]
  194. mov [edx],eax
  195. mov edx,[ErrorIn]
  196. mov dword[edx],0
  197. jmp m6
  198. er1:
  199. mov edx,[ErrorIn]
  200. mov dword[edx],1
  201. jmp m6
  202. er2:
  203. mov edx,[ErrorIn]
  204. mov dword[edx],2
  205. m6:
  206. popa
  207. ret
  208. endp
  209. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  210. section '.idata' import data readable writeable
  211. library kernel32,'KERNEL32.DLL',\
  212. msvcrt,'msvcrt.dll'
  213. import kernel32,\
  214. GetStdHandle, 'GetStdHandle',\
  215. WriteConsole, 'WriteConsoleA',\
  216. ReadConsole, 'ReadConsoleA',\
  217. ExitProcess, 'ExitProcess'
  218. import msvcrt,printf,'printf',\
  219. scanf,'scanf',\
  220. getchar,'getchar'
  221. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement