Advertisement
dariahinz

zad 3

Nov 17th, 2017
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.10 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. znaki byte 12 dup (?)
  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 PROC
  64. pusha
  65.  
  66. mov esi, 10 ; indeks w tablicy 'znaki'
  67. mov ebx, 10 ; dzielnik równy 10
  68. konwersja:
  69. mov edx, 0 ; zerowanie starszej części dzielnej
  70. div ebx ; dzielenie przez 10, reszta w EDX,
  71. ; iloraz w EAX
  72. add dl, 30H ; zamiana reszty z dzielenia na kod
  73. ; ASCII
  74. mov znaki [esi], dl ; zapisanie cyfry w kodzie ASCII
  75. dec esi ; zmniejszenie indeksu
  76. cmp eax, 0 ; sprawdzenie czy iloraz = 0
  77. jne konwersja ; skok, gdy iloraz niezerowy
  78. ; wypełnienie pozostałych bajtów spacjami i wpisanie
  79. ; znaków nowego wiersza
  80. wypeln:
  81. or esi, esi
  82. jz wyswietl ; skok, gdy ESI = 0
  83. mov byte PTR znaki [esi], 20H ; kod spacji
  84. dec esi ; zmniejszenie indeksu
  85. jmp wypeln
  86.  
  87. wyswietl:
  88. mov byte PTR znaki [0], 0AH ; kod nowego wiersza
  89. mov byte PTR znaki [11], 0AH ; kod nowego wiersza
  90. ; wyświetlenie cyfr na ekranie
  91. push dword PTR 12 ; liczba wyświetlanych znaków
  92. push dword PTR OFFSET znaki ; adres wyśw. obszaru
  93. push dword PTR 1 ; numer urządzenia (ekran ma numer 1)
  94. call __write ; wyświetlenie liczby na ekranie
  95. add esp, 12 ; usunięcie parametrów ze stosu
  96.  
  97. popa
  98. ret
  99. wyswietl_EAX ENDP
  100.  
  101. _main:
  102.  
  103.  
  104. call wczytaj_do_EAX
  105. mul eax
  106. call wyswietl_EAX
  107.  
  108.  
  109. push 0
  110. call _ExitProcess@4
  111. |
  112. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement