Advertisement
joker546645

3_3 ( SQR of DEC )

Nov 9th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .686
  2. .model flat
  3. extern    __write : PROC
  4. extern    __read : PROC
  5. extern    _ExitProcess@4 : PROC
  6. public _main
  7. .data
  8. znaki               db   12 dup (?)    
  9. obszar              db   12 dup (?)
  10. dziesiec            dd   10 ; mnoznik
  11. .code
  12. wczytaj_EAX     PROC
  13.     push    ebx
  14.     push    ecx
  15.     push    edx
  16.  
  17. ; max ilość znaków wczytywanej liczby
  18.      push      dword PTR 12
  19.      push      dword PTR OFFSET obszar  ; adres obszaru pamięci
  20.      push      dword PTR 0; numer urządzenia (0 dla klawiatury)
  21.      call      __read    ; odczytywanie znaków z klawiatury
  22.                    ; (dwa znaki podkreślenia przed read)
  23.      add       esp, 12   ; usunięcie parametrów ze stosu
  24. ; bieżąca wartość przekształcanej liczby przechowywana jest
  25. ; w rejestrze EAX; przyjmujemy 0 jako wartość początkową
  26.      mov            eax, 0          
  27.      mov       ebx, OFFSET obszar  ; adres obszaru ze znakami
  28. pobieraj_znaki:
  29.      mov       cl, [ebx] ; pobranie kolejnej cyfry w kodzie
  30.                         ; ASCII
  31.      inc       ebx       ; zwiększenie indeksu
  32.      cmp       cl,10     ; sprawdzenie czy naciśnięto Enter
  33.      je        byl_enter ; skok, gdy naciśnięto Enter
  34.      sub       cl, 30H   ; zamiana kodu ASCII na wartość cyfry
  35.      movzx     ecx, cl   ; przechowanie wartości cyfry w
  36.                         ; rejestrze ECX
  37.     ; mnożenie wcześniej obliczonej wartości razy 10
  38.      mul       dword PTR dziesiec            
  39.      add       eax, ecx  ; dodanie ostatnio odczytanej cyfry
  40.      jmp       pobieraj_znaki ; skok na początek pętli
  41. byl_enter:
  42. ; wartość binarna wprowadzonej liczby znajduje się teraz w rejestrze EAX
  43.  
  44.     pop     edx
  45.     pop     ecx
  46.     pop     ebx
  47.                 ret
  48. wczytaj_EAX     ENDP
  49.  
  50.  
  51.  
  52. wyswietl_EAX   PROC
  53.                pusha
  54.  
  55.                mov esi, 10 ; indeks w tablicy znaki
  56.                mov ebx, 10 ; dzielnik rowny 10
  57.  
  58.         konwersja:
  59.                 mov edx, 0 ; zerowanie starszej części dzielnej
  60.                 div ebx    ; dzielenie przez 10, reszta w edx, iloraz w eax
  61.                 add dl, 30h  ; zamiana reszty na ASCII
  62.                 mov znaki [esi] , dl ; zapisanie cyfryw ASCII
  63.                 dec esi     ; zmniejszenie indeksu
  64.                 cmp eax, 0  ;sprawdzenie czy iloraz = 0
  65.                 jne konwersja  ; skok gdy iloraz niezerowy
  66.  
  67.         ; spacje i nowe linie
  68.         wypeln:
  69.                 or esi, esi
  70.                 jz wyswietl ; skok gdy esi  =  0
  71.                 mov byte PTR znaki [esi], 20h ; kod spacji
  72.                 dec esi ; zminiejszenie indeksu
  73.                 jmp wypeln
  74.  
  75.         wyswietl:
  76.                 mov byte PTR znaki [0], 0Ah ; kod new lajn
  77.                 mov byte PTR znaki [11], 0Ah
  78.  
  79.         ; na ekran
  80.                 push dword PTR 12
  81.                 push dword PTR OFFSET znaki
  82.                 push dword PTR 1
  83.                 call __write
  84.                 add esp, 12
  85.  
  86.  
  87.                popa
  88.                ret
  89. wyswietl_EAX   ENDP
  90.  
  91. _main:
  92.  
  93.     call wczytaj_EAX
  94.  
  95.     mul eax
  96.  
  97.     call wyswietl_EAX
  98.  
  99.                push 0
  100.                call _ExitProcess@4
  101. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement