Advertisement
dariahinz

moje

Nov 17th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.12 KB | None | 0 0
  1.  
  2. .686
  3. .model flat
  4.  
  5. extern _ExitProcess@4 : PROC
  6. extern _MessageBoxA@16 : PROC
  7. extern _MessageBoxW@16 : PROC
  8. extern __write : PROC ; (int handle, char * text, int length)
  9. extern __read : PROC ; (int handle, char * text, int lengthLimit)
  10.  
  11. public _main
  12.  
  13. .data
  14. tytul dw 'd','d',0
  15. magazyn dw 180 dup (?)
  16. obszar db 12 dup (?)
  17. dziesiec db 10 ; mnożnik
  18. dekoder dw 0031h,0032h,0033h,0034h,0035h,0036h,0037h,0038h,0039h,218ah,218bh
  19.  
  20.  
  21. .code
  22. wczytaj_do_EAX PROC
  23. push ebx
  24. push ecx
  25. push edx
  26. push esi
  27. push edi
  28.  
  29. ; max ilość znaków wczytywanej liczby
  30. push dword PTR 12
  31.  
  32. push dword PTR OFFSET obszar ; adres obszaru pamięci
  33. push dword PTR 0 ; numer urządzenia (0 dla klawiatury)
  34. call __read ; odczytywanie znaków z klawiatury
  35. ; (dwa znaki podkreślenia przed read)
  36. add esp, 12 ; usunięcie parametrów ze stosu
  37. ; bieżąca wartość przekształcanej liczby przechowywana jest
  38. ; w rejestrze EAX; przyjmujemy 0 jako wartość początkową
  39. mov eax, 0
  40. mov ebx, OFFSET obszar ; adres obszaru ze znakami
  41. pobieraj_znaki:
  42. mov cl, [ebx] ; pobranie kolejnej cyfry w kodzie
  43. ; ASCII
  44. inc ebx ; zwiększenie indeksu
  45. cmp cl,10 ; sprawdzenie czy naciśnięto Enter
  46. je byl_enter ; skok, gdy naciśnięto Enter
  47. sub cl, 30H ; zamiana kodu ASCII na wartość cyfry
  48. movzx ecx, cl ; przechowanie wartości cyfry w
  49. ; rejestrze ECX
  50. ; mnożenie wcześniej obliczonej wartości razy 10
  51. mul dword PTR dziesiec
  52. add eax, ecx ; dodanie ostatnio odczytanej cyfry
  53. jmp pobieraj_znaki ; skok na początek pętli
  54. byl_enter:
  55. ; wartość binarna wprowadzonej liczby znajduje się teraz w rejestrze EAX
  56. ; Zapisujemy wynik do EAX
  57.  
  58. pop edi
  59. pop esi
  60. pop edx
  61. pop ecx
  62. pop ebx
  63. ret
  64. wczytaj_do_EAX ENDP
  65.  
  66.  
  67.  
  68. wyswietl_EAX_12 PROC
  69. pusha ; przechowanie rejestrów
  70.  
  71. ; rezerwacja 12 bajtów na stosie (poprzez zmniejszenie
  72. ; rejestru ESP) przeznaczonych na tymczasowe przechowanie
  73. ; cyfr dwunastkowych wyświetlanej liczby
  74. sub esp, 12
  75. mov edi, esp ; adres zarezerwowanego obszaru
  76. ; pamięci
  77. ; przygotowanie konwersji
  78. mov ecx, 8 ; liczba obiegów pętli konwersji
  79. mov esi, 1 ; indeks początkowy używany przy
  80. ; zapisie cyfr
  81. ; pętla konwersji
  82. ptl3hex:
  83. ; przesunięcie cykliczne (obrót) rejestru EAX o 4 bity w lewo
  84. ; w szczególności, w pierwszym obiegu pętli bity nr 31 - 28
  85. ; rejestru EAX zostaną przesunięte na pozycje 3 - 0
  86. rol eax, 4
  87. ; wyodrębnienie 4 najmłodszych bitów i odczytanie z tablicy
  88. ; 'dekoder' odpowiadającej im cyfry w zapisie szesnastkowym
  89. mov ebx, eax ; kopiowanie EAX do EBX
  90. and ebx, 0000000FH ; zerowanie bitów 31 - 4 rej.EBX
  91. mov dx, dekoder[2*ebx-2] ; pobranie cyfry z tablicy
  92.  
  93.  
  94. ; przesłanie cyfry do obszaru roboczego
  95. mov [edi][esi], dx
  96. mov magazyn[2*esi-2],dx
  97. inc esi ;inkrementacja modyfikatora
  98. loop ptl3hex ; sterowanie pętlą
  99. wyswietl:
  100. ; wpisanie znaku nowego wiersza przed i po cyfrach
  101. mov byte PTR [edi][0], 10
  102. mov byte PTR [edi][9], 10
  103.  
  104.  
  105. mov dh,0
  106. mov al, 30H ;tu trzymamy zero do porownan
  107. mov dl, 20H ;spacja
  108.  
  109. mov ecx,8
  110. mov ebx,1
  111. ptl:
  112. cmp [edi][ebx], al
  113. jne skok
  114. mov byte PTR[edi][ebx], dl
  115.  
  116. inc ebx
  117. loop ptl
  118.  
  119.  
  120.  
  121.  
  122. skok: ; wyświetlenie przygotowanych cyfr
  123. push 10 ; 8 cyfr + 2 znaki nowego wiersza
  124. push edi ; adres obszaru roboczego
  125. push 1 ; nr urządzenia (tu: ekran)
  126. call __write ; wyświetlenie
  127. ; usunięcie ze stosu 24 bajtów, w tym 12 bajtów zapisanych
  128. ; przez 3 rozkazy push przed rozkazem call
  129. ; i 12 bajtów zarezerwowanych na początku podprogramu
  130.  
  131. add esp, 24
  132.  
  133. popa ; odtworzenie rejestrów
  134. ret ; powrót z podprogramu
  135. wyswietl_EAX_12 ENDP
  136.  
  137.  
  138. _main:
  139.  
  140. call wczytaj_do_EAX
  141. call wyswietl_EAX_12
  142. push 0
  143. push OFFSET tytul
  144. push OFFSET magazyn
  145. push 0
  146. call _MessageBoxW@16
  147. push 0
  148. call _ExitProcess@4
  149.  
  150. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement