dariahinz

zad 4

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