Advertisement
Sylv3rWolf

asembler2

Nov 5th, 2015
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.03 KB | None | 0 0
  1. ;Aplikacja korzystająca z otwartego okna konsoli
  2. .386
  3. .MODEL flat, STDCALL
  4. ;--- stale ---
  5. STD_INPUT_HANDLE equ -10
  6. STD_OUTPUT_HANDLE equ -11
  7. ;--- funkcje API Win32 ---
  8. ;--- z pliku user32.inc ---
  9. CharToOemA PROTO :DWORD,:DWORD
  10. ;--- z pliku kernel32.inc ---
  11. GetStdHandle PROTO :DWORD
  12. ReadConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
  13. WriteConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
  14. ExitProcess PROTO :DWORD
  15. wsprintfA PROTO C :VARARG
  16. lstrlenA PROTO :DWORD
  17. ;-------------
  18. ;includelib .\lib\user32.lib
  19. ;includelib .\lib\kernel32.lib
  20. ;-------------
  21. _DATA SEGMENT
  22. hout DD ?
  23. hinp DD ?
  24. naglow DB "Autor aplikacji Jan Masztalski.",0
  25. ALIGN 4 ; przesuniecie do adresu podzielnego na 4
  26. rozmN DD $ - naglow ;liczba znaków w tablicy
  27. zaprA DB 0Dh,0Ah,"Proszę wprowadzić znaki znaki do bufora: ",0
  28. ALIGN 4
  29. rozmA DD $ - zaprA ;liczba znaków w tablicy
  30. zaprB DB 0Dh,0Ah,"Bufor po wprowadzeniu danych: ",0
  31. ALIGN 4
  32. rozmB DD $ - zaprB ;liczba znaków w tablicy
  33. zaprC DB 0Dh,0Ah,"Bufor po zmianach: ",0
  34. ALIGN 4
  35. rozmC DD $ - zaprC ;liczba znaków w tablicy
  36. ALIGN 4
  37. rout DD 0 ;faktyczna liczba wyprowadzonych znaków
  38. rinp DD 0 ;faktyczna liczba wprowadzonych znaków
  39. lZnakow DD 0
  40. bufor DB 128 dup(?)
  41. rbuf DD 128
  42. bufor2 DB 128 dup(?)
  43. rbuf2 DD 128
  44. _DATA ENDS
  45. ;------------
  46. _TEXT SEGMENT
  47.  
  48. main proc
  49. ;--- wywołanie funkcji GetStdHandle
  50. push STD_OUTPUT_HANDLE
  51. call GetStdHandle ; wywołanie funkcji GetStdHandle
  52. mov hout, EAX ; deskryptor wyjściowego bufora konsoli
  53. push STD_INPUT_HANDLE
  54. call GetStdHandle ; wywołanie funkcji GetStdHandle
  55. mov hinp, EAX ; deskryptor wejściowego bufora konsoli
  56. ;--- nagłówek ---------
  57. push OFFSET naglow
  58. push OFFSET naglow
  59. call CharToOemA ; konwersja polskich znaków
  60. ;--- wyświetlenie ---------
  61. push 0 ; rezerwa, musi być zero
  62. push OFFSET rout ; wskaźnik na faktyczną liczba wyprowadzonych znaków
  63. push rozmN ; liczba znaków
  64. push OFFSET naglow ; wskażnik na tekst
  65. push hout ; deskryptor buforu konsoli
  66. call WriteConsoleA ; wywołanie funkcji WriteConsoleA
  67. ;--- zaproszenie A ---------
  68. push OFFSET zaprA
  69. push OFFSET zaprA
  70. call CharToOemA ; konwersja polskich znaków
  71. ;--- wyświetlenie zaproszenia A ---
  72. push 0 ; rezerwa, musi być zero
  73. push OFFSET rout ; wskaźnik na faktyczną liczba wyprowadzonych znaków
  74. push rozmA ; liczba znaków
  75. push OFFSET zaprA ; wskażnik na tekst
  76. push hout ; deskryptor buforu konsoli
  77. call WriteConsoleA ; wywołanie funkcji WriteConsoleA
  78. ;--- czekanie na wprowadzenie znaków, koniec przez Enter ---
  79. push 0 ; rezerwa, musi być zero
  80. push OFFSET rinp ; wskaźnik na faktyczną liczba wprowadzonych znaków
  81. push rbuf ; rozmiar bufora
  82. push OFFSET bufor ;wskażnik na bufor
  83. push hinp ; deskryptor buforu konsoli
  84. call ReadConsoleA ; wywołanie funkcji ReadConsoleA
  85. lea EBX,bufor
  86. mov EDI,rinp
  87. mov BYTE PTR [EBX+EDI-2],0 ;zero na końcu tekstu
  88.  
  89. ;--- wyświetlenie bufora przed zmianami ---------
  90. push 0 ; rezerwa, musi być zero
  91. push OFFSET rout ; wskaźnik na faktyczną liczbę wyprowadzonych znaków
  92. push rozmB ; liczba znaków
  93. push OFFSET zaprB ; wskaźnik na tekst w buforze
  94. push hout ; deskryptor buforu konsoli
  95. call WriteConsoleA ; wywołanie funkcji WriteConsol
  96.  
  97.  
  98. push OFFSET bufor
  99. call lstrlenA
  100. mov lZnakow, EAX
  101.  
  102. push 0 ; rezerwa, musi być zero
  103. push OFFSET rout ; wskaźnik na faktyczną liczbę wyprowadzonych znaków
  104. push lZnakow ; liczba znaków
  105. push OFFSET bufor ; wskaźnik na tekst w buforze
  106. push hout ; deskryptor buforu konsoli
  107. call WriteConsoleA ; wywołanie funkcji WriteConsoleA
  108.  
  109.  
  110. ;--- wypełnienie bufora2 wartością 0
  111. lea EBX,bufor2
  112. mov ECX,rbuf2
  113. @@: mov BYTE PTR [EBX+ECX-1],32 ;32 - Space
  114. loop @B
  115.  
  116. push ECX
  117. push EBX
  118. push EDI
  119. push ESI
  120.  
  121. mov EDI, offset bufor2
  122. mov ESI, offset bufor
  123. ;mov EBX, 32
  124.  
  125. mov ECX, lZnakow
  126. ptl:
  127. MOVSB
  128. ;mov [EDI],EBX
  129. INC EDI
  130. INC ESI
  131. LOOP ptl
  132.  
  133. pop ESI
  134. pop EDI
  135. pop EBX
  136. pop ECX
  137. ;ToDo: TWOJE DZIAŁANIA NA BUFORZE
  138.  
  139.  
  140. ;--- wyświetlenie bufora po zmianach ---------
  141. push 0 ; rezerwa, musi być zero
  142. push OFFSET rout ; wskaźnik na faktyczną liczbę wyprowadzonych znaków
  143. push rozmC ; liczba znaków
  144. push OFFSET zaprC ; wskaźnik na tekst w buforze
  145. push hout ; deskryptor buforu konsoli
  146. call WriteConsoleA ; wywołanie funkcji WriteConsol
  147.  
  148. push 0 ; rezerwa, musi być zero
  149. push OFFSET rout ; wskaźnik na faktyczną liczbę wyprowadzonych znaków
  150. push lZnakow ; liczba znaków
  151. push OFFSET bufor2 ; wskaźnik na tekst w buforze
  152. push hout ; deskryptor buforu konsoli
  153. call WriteConsoleA ; wywołanie funkcji WriteConsoleA
  154.  
  155. ;--- zakończenie procesu ---------
  156. push 0
  157. call ExitProcess ; wywołanie funkcji ExitProcess
  158. main endp
  159. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  160. ScanInt PROC
  161. ;; funkcja ScanInt przekształca ciąg cyfr do liczby, którą jest zwracana przez EAX
  162. ;; argument - zakończony zerem wiersz z cyframi
  163. ;; rejestry: EBX - adres wiersza, EDX - znak liczby, ESI - indeks cyfry w wierszu, EDI - tymczasowy
  164. ;--- początek funkcji
  165. push EBP
  166. mov EBP, ESP ; wskaźnik stosu ESP przypisujemy do EBP
  167. ;--- odkładanie na stos
  168. push EBX
  169. push ECX
  170. push EDX
  171. push ESI
  172. push EDI
  173. ;--- przygotowywanie cyklu
  174. mov EBX, [EBP+8]
  175. push EBX
  176. call lstrlenA
  177. mov EDI, EAX ;liczba znaków
  178. mov ECX, EAX ;liczba powtórzeń = liczba znaków
  179. xor ESI, ESI ; wyzerowanie ESI
  180. xor EDX, EDX ; wyzerowanie EDX
  181. xor EAX, EAX ; wyzerowanie EAX
  182. mov EBX, [EBP+8] ; adres tekstu
  183. ;--- cykl --------------------------
  184. pocz:
  185. cmp BYTE PTR [EBX+ESI], 0h ;porównanie z kodem \0
  186. jne @F
  187. jmp et4
  188. @@:
  189. cmp BYTE PTR [EBX+ESI], 0Dh ;porównanie z kodem CR
  190. jne @F
  191. jmp et4
  192. @@:
  193. cmp BYTE PTR [EBX+ESI], 0Ah ;porównanie z kodem LF
  194. jne @F
  195. jmp et4
  196. @@:
  197. cmp BYTE PTR [EBX+ESI], 02Dh ;porównanie z kodem -
  198. jne @F
  199. mov EDX, 1
  200. jmp nast
  201. @@:
  202. cmp BYTE PTR [EBX+ESI], 030h ;porównanie z kodem 0
  203. jae @F
  204. jmp nast
  205. @@:
  206. cmp BYTE PTR [EBX+ESI], 039h ;porównanie z kodem 9
  207. jbe @F
  208. jmp nast
  209. ;----
  210. @@:
  211. push EDX ; do EDX procesor może zapisać wynik mnożenia
  212. mov EDI, 10
  213. mul EDI ;mnożenie EAX * EDI
  214. mov EDI, EAX ; tymczasowo z EAX do EDI
  215. xor EAX, EAX ;zerowani EAX
  216. mov AL, BYTE PTR [EBX+ESI]
  217. sub AL, 030h ; korekta: cyfra = kod znaku - kod 0
  218. add EAX, EDI ; dodanie cyfry
  219. pop EDX
  220. nast:
  221. inc ESI
  222. loop pocz
  223. ;--- wynik
  224. or EDX, EDX ;analiza znacznika EDX
  225. jz @F
  226. neg EAX
  227. @@:
  228. et4:;--- zdejmowanie ze stosu
  229. pop EDI
  230. pop ESI
  231. pop EDX
  232. pop ECX
  233. pop EBX
  234. ;--- powrót
  235. mov ESP, EBP ; przywracamy wskaźnik stosu ESP
  236. pop EBP
  237. ret 4
  238. ScanInt ENDP
  239. _TEXT ENDS
  240.  
  241. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement