Advertisement
Guest User

Untitled

a guest
Nov 14th, 2018
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.14 KB | None | 0 0
  1. .386
  2. .MODEL flat, STDCALL
  3.  
  4. WriteConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
  5. ReadConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
  6. GetStdHandle PROTO :DWORD
  7. ExitProcess PROTO :DWORD
  8. wsprintfA PROTO C :VARARG
  9. lstrlenA PROTO :DWORD
  10. .data
  11.  
  12.  
  13. dest BYTE 10 dup(0)
  14. dest2 BYTE 10 dup(0)
  15. hout DWORD 0
  16. zach1 BYTE "Wprowadz liczbe: "
  17. za DWORD 0
  18. zach2 BYTE "Wprowadz liczbe: "
  19. zb DWORD 0
  20. zach3 BYTE "Wprowadz liczbe: "
  21. zc DWORD 0
  22. zach4 BYTE "Wprowadz liczbe: "
  23. zd DWORD 0
  24. zacha BYTE "Wprowadz a: "
  25. zaa DB 1
  26. zachb BYTE "Wprowadz b: "
  27. zbb DB 1
  28. zachc BYTE "Wprowadz c: "
  29. zcc DB 1
  30. zachd BYTE "Wprowadz d: "
  31. zdd DB 1
  32. rout dd 0
  33. hin DWORD 0
  34. solutionText BYTE "Wynik obliczen dla funkcji y = a/(b+c)*d to: %i" , 0
  35. solutionBuffer BYTE 255 dup(0)
  36. solutionText2 BYTE "Wynik obliczen dla funkcji y = a AND (b OR c) XOR d to: %i" , 0
  37. solutionBuffer2 BYTE 255 dup(0)
  38. rinp DD 0 ;faktyczna liczba wprowadzonych znaków
  39. bufor DB 128 dup(?)
  40. rbuf DD 128
  41. buforBin BYTE 8 DUP(0),0
  42. .code
  43.  
  44. main proc
  45.  
  46. ;pobranie uchwytów do okna
  47. push -10
  48. call GetStdHandle
  49. mov hin, eax
  50.  
  51. push -11
  52. call GetStdHandle
  53. mov hout, eax
  54. ;koniec pobierania uchwytów
  55.  
  56. ;wyswietlanie zachety
  57. push 0
  58. push offset rout
  59. push 17
  60. push offset zach1
  61. push hout
  62. call WriteConsoleA
  63.  
  64. ;czytanie a
  65. push 0
  66. push offset rout
  67. push 5
  68. push offset za
  69. push hin
  70. call ReadConsoleA
  71.  
  72. mov EDX, OFFSET za
  73. add EDX, rout
  74.  
  75. mov [EDX-2],BYTE PTR 0
  76. push OFFSET za ;adres poczatku ciagu znakow przekazywany na stos
  77. call atoi ;wywolanie procedury atoi
  78. mov za, EAX ;przeniesienie wyniku procedury atoi z rejestru EAX do zmiennej za
  79.  
  80. ;zacheta b
  81. push 0
  82. push offset rout
  83. push 17
  84. push offset zach2
  85. push hout
  86. call WriteConsoleA
  87.  
  88. ;czytanie b
  89. push 0
  90. push offset rout
  91. push 5
  92. push offset zb
  93. push hin
  94. call ReadConsoleA
  95.  
  96. mov EDX, OFFSET zb
  97. add EDX, rout
  98.  
  99. mov [EDX-2],BYTE PTR 0
  100. push offset zb ;adres poczatku ciagu znakow przekazywany na stos
  101. call atoi ;wywolanie procedury atoi
  102. mov zb, EAX ;przeniesienie wyniku procedury atoi z rejestru EAX do zmiennej zb
  103.  
  104. ;zacheta c
  105. push 0
  106. push offset rout
  107. push 17
  108. push offset zach3
  109. push hout
  110. call WriteConsoleA
  111.  
  112. ;czytanie c
  113. push 0
  114. push offset rout
  115. push 5
  116. push offset zc
  117. push hin
  118. call ReadConsoleA
  119.  
  120. mov EDX, OFFSET zc
  121. add EDX, rout
  122.  
  123. mov [EDX-2],BYTE PTR 0
  124. push offset zc ;adres poczatku ciagu znakow przekazywany na stos
  125. call atoi ;wywolanie procedury atoi
  126. mov zc, EAX ;przeniesienie wyniku procedury atoi z rejestru EAX do zmiennej zc
  127.  
  128. ;zacheta d
  129. push 0
  130. push offset rout
  131. push 17
  132. push offset zach4
  133. push hout
  134. call WriteConsoleA
  135.  
  136. ;czytanie d
  137. push 0
  138. push offset rout
  139. push 5
  140. push offset zd
  141. push hin
  142. call ReadConsoleA
  143.  
  144.  
  145. mov EDX, OFFSET zd
  146. add EDX, rout
  147.  
  148. mov [EDX-2],BYTE PTR 0
  149. push offset zd ;adres poczatku ciagu znakow przekazywany na stos
  150. call atoi ;wywolanie procedury atoi
  151. mov zd, EAX ;przeniesienie wyniku procedury atoi z rejestru EAX do zmiennej zd
  152.  
  153. ; a/(b+c)*d
  154. mov EDX, 0
  155. mov ECX, zd
  156. mov EAX, zb
  157. mov EBX, zc
  158. add EAX, EBX
  159. mul ECX
  160. mov ECX, EAX
  161. mov ECX, za
  162. div ECX
  163. mov EAX, EDX
  164.  
  165. push EAX
  166. push OFFSET solutionText
  167. push OFFSET solutionBuffer
  168. call wsprintfA
  169. add ESP, 12
  170. mov rinp, EAX
  171.  
  172. ;wypisanie wyniku
  173. push 0
  174. push offset rout
  175. push rinp
  176. push offset solutionBuffer
  177. push hout
  178. call WriteConsoleA
  179.  
  180. ;zacheta aa
  181. push 0
  182. push offset rout
  183. push 12
  184. push offset zacha
  185. push hout
  186. call WriteConsoleA
  187.  
  188. ;czytanie aa
  189. push 0
  190. push OFFSET rinp ; wskaźnik na faktyczną liczba wprowadzonych znaków
  191. push rbuf ; rozmiar bufora
  192. push OFFSET bufor ;wskażnik na bufor
  193. push hin
  194. call ReadConsoleA
  195.  
  196. lea EBX,bufor
  197. mov EDI,rinp
  198. mov BYTE PTR [EBX+EDI-2],0 ;zero na końcu tekstu
  199. ;--- przekształcenie A
  200. push OFFSET bufor
  201. call ScanBin
  202. mov zaa, AL
  203.  
  204. ;zacheta bb
  205. push 0
  206. push offset rout
  207. push 12
  208. push offset zachb
  209. push hout
  210. call WriteConsoleA
  211.  
  212. ;czytanie bb
  213. push 0
  214. push OFFSET rinp ; wskaźnik na faktyczną liczba wprowadzonych znaków
  215. push rbuf ; rozmiar bufora
  216. push OFFSET bufor ;wskażnik na bufor
  217. push hin
  218. call ReadConsoleA
  219.  
  220. lea EBX,bufor
  221. mov EDI,rinp
  222. mov BYTE PTR [EBX+EDI-2],0 ;zero na końcu tekstu
  223. ;--- przekształcenie B
  224. push OFFSET bufor
  225. call ScanBin
  226. mov zbb, AL
  227.  
  228. ;zacheta cc
  229. push 0
  230. push offset rout
  231. push 12
  232. push offset zachc
  233. push hout
  234. call WriteConsoleA
  235.  
  236. ;czytanie cc
  237. push 0
  238. push OFFSET rinp ; wskaźnik na faktyczną liczba wprowadzonych znaków
  239. push rbuf ; rozmiar bufora
  240. push OFFSET bufor ;wskażnik na bufor
  241. push hin
  242. call ReadConsoleA
  243.  
  244. lea EBX,bufor
  245. mov EDI,rinp
  246. mov BYTE PTR [EBX+EDI-2],0 ;zero na końcu tekstu
  247. ;--- przekształcenie C
  248. push OFFSET bufor
  249. call ScanBin
  250. mov zcc, AL
  251.  
  252. ;zacheta dd
  253. push 0
  254. push offset rout
  255. push 12
  256. push offset zachd
  257. push hout
  258. call WriteConsoleA
  259.  
  260. ;czytanie dd
  261. push 0
  262. push OFFSET rinp ; wskaźnik na faktyczną liczba wprowadzonych znaków
  263. push rbuf ; rozmiar bufora
  264. push OFFSET bufor ;wskażnik na bufor
  265. push hin
  266. call ReadConsoleA
  267.  
  268. lea EBX,bufor
  269. mov EDI,rinp
  270. mov BYTE PTR [EBX+EDI-2],0 ;zero na końcu tekstu
  271. ;--- przekształcenie D
  272. push OFFSET bufor
  273. call ScanBin
  274. mov zdd, AL
  275.  
  276. mov AL, zcc
  277. OR zbb, AL
  278. mov AL, zbb
  279. AND zaa, AL
  280. mov AL, zdd
  281. XOR zaa, AL
  282.  
  283. mov AL, zaa
  284.  
  285. mov ecx,8
  286. mov edi,OFFSET buforBin
  287. L1: shl al,1
  288. mov BYTE PTR [edi],'0' ;wstawiamy do bufora kod ASCII 0
  289. jnc L2 ;jump if not carry - jeżeli cf=0 to skok do etykiety L2
  290. mov BYTE PTR [edi],'1' ;gdy cf=1 wstawiamy jednak do bufora kod 1
  291. L2: inc edi
  292. loop L1 ;od ecx odejmujemy 1, jeżeli nie 0 to skok do etykiety L1
  293.  
  294. push 0 ; rezerwa, musi być zero
  295. push OFFSET rout ; wskaźnik na faktyczną liczbę wyprowadzonych znaków
  296. push 8 ; liczba znaków a nasz rejestr 8 bitowy
  297. push OFFSET buforBin ; wskaźnik na tekst w buforze
  298. push hout ; deskryptor buforu konsoli
  299. call WriteConsoleA ; wywołanie funkcji WriteConsoleA
  300.  
  301. push 0
  302. call ExitProcess
  303. main endp
  304.  
  305.  
  306. ;funkcja atoi
  307. atoi proc uses esi edx inputBuffAddr:DWORD
  308. mov esi, inputBuffAddr
  309. xor edx, edx
  310. xor EAX, EAX
  311. mov AL, BYTE PTR [esi]
  312. cmp eax, 2dh
  313. je parseNegative
  314.  
  315. .Repeat
  316. lodsb
  317. .Break .if !eax
  318. imul edx, edx, 10
  319. sub eax, "0"
  320. add edx, eax
  321. .Until 0
  322. mov EAX, EDX
  323. jmp endatoi
  324.  
  325. parseNegative:
  326. inc esi
  327. .Repeat
  328. lodsb
  329. .Break .if !eax
  330. imul edx, edx, 10
  331. sub eax, "0"
  332. add edx, eax
  333. .Until 0
  334.  
  335. xor EAX,EAX
  336. sub EAX, EDX
  337. jmp endatoi
  338.  
  339. endatoi:
  340. ret
  341. atoi endp
  342. ScanBin PROC
  343. ;; funkcja ScanInt przekształca ciąg cyfr dziesiętnych do liczby, którą jest zwracana przez EAX
  344. ;; argument - zakończony zerem wiersz z cyframi
  345. ;--- początek funkcji
  346. push EBP
  347. mov EBP, ESP ; wskaźnik stosu ESP przypisujemy do EBP
  348. ;--- odkładanie na stos
  349. push EBX
  350. push ECX
  351. push EDX
  352. push ESI
  353. push EDI
  354. ;--- przygotowywanie cyklu
  355. mov EBX, [EBP+8]
  356. push EBX
  357. call lstrlenA
  358. mov EDI, EAX ;liczba znaków
  359. mov ECX, EAX ;liczba powtórzeń = liczba znaków
  360. xor ESI, ESI ; wyzerowanie ESI
  361. xor EDX, EDX ; wyzerowanie EDX
  362. xor EAX, EAX ; wyzerowanie EAX
  363. mov EBX, [EBP+8] ; adres tekstu
  364. ;--- cykl --------------------------
  365. pocz:
  366. cmp BYTE PTR [EBX+ESI], 0h ;porównanie z kodem \0
  367. jne @F
  368. jmp et4
  369. @@:
  370. cmp BYTE PTR [EBX+ESI], 0Dh ;porównanie z kodem CR
  371. jne @F
  372. jmp et4
  373. @@:
  374. cmp BYTE PTR [EBX+ESI], 0Ah ;porównanie z kodem LF
  375. jne @F
  376. jmp et4
  377. @@:
  378. cmp BYTE PTR [EBX+ESI], 02Dh ;porównanie z kodem -
  379. jne @F
  380. mov EDX, 1
  381. jmp nast
  382. @@:
  383. cmp BYTE PTR [EBX+ESI], 030h ;porównanie z kodem 0
  384. jae @F
  385. jmp nast
  386. @@:
  387. cmp BYTE PTR [EBX+ESI], 031h ;porównanie z kodem 9
  388. jbe @F
  389. jmp nast
  390. ;----
  391. @@:
  392. push EDX ; do EDX procesor może zapisać wynik mnożenia
  393. mov EDI, 2
  394. mul EDI ;mnożenie EAX * EDI
  395. mov EDI, EAX ; tymczasowo z EAX do EDI
  396. xor EAX, EAX ;zerowani EAX
  397. mov AL, BYTE PTR [EBX+ESI]
  398. sub AL, 030h ; korekta: cyfra = kod znaku - kod 0
  399. add EAX, EDI ; dodanie cyfry
  400. pop EDX
  401. nast:
  402. inc ESI
  403. loop pocz
  404. ;--- wynik
  405. or EDX, EDX ;analiza znacznika EDX
  406. jz @F
  407. neg EAX
  408. @@:
  409. et4:;--- zdejmowanie ze stosu
  410. pop EDI
  411. pop ESI
  412. pop EDX
  413. pop ECX
  414. pop EBX
  415. ;--- powrót
  416. mov ESP, EBP ; przywracamy wskaźnik stosu ESP
  417. pop EBP
  418. ret 4
  419. ScanBin ENDP
  420. _TEXT ENDS
  421. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement