joker546645

3_6 ( HEX to DEC )

Nov 9th, 2017
42
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.  
  10. .code
  11. wczytaj_do_EAX_hex PROC
  12.  
  13.      push      ebx
  14.      push      ecx
  15.      push      edx
  16.      push      esi
  17.      push      edi
  18.      push      ebp
  19. ; rezerwacja 12 bajtów na stosie przeznaczonych na tymczasowe
  20. ; przechowanie cyfr szesnastkowych wyświetlanej liczby
  21.      sub       esp, 12   ; rezerwacja poprzez zmniejszenie ESP
  22.      mov       esi, esp ; adres zarezerwowanego obszaru pamięci
  23.      push      dword PTR 10 ; max ilość znaków wczytyw. liczby
  24.      push      esi       ; adres obszaru pamięci
  25.      push      dword PTR 0; numer urządzenia (0 dla klawiatury)
  26.      call      __read    ; odczytywanie znaków z klawiatury
  27.                         ; (dwa znaki podkreślenia przed read)
  28.      add       esp, 12   ; usunięcie parametrów ze stosu
  29.      mov       eax, 0    ; dotychczas uzyskany wynik
  30. pocz_konw:
  31.      mov       dl, [esi] ; pobranie kolejnego bajtu
  32.      inc       esi       ; inkrementacja indeksu
  33.      cmp       dl, 10    ; sprawdzenie czy naciśnięto Enter
  34.      je        gotowe    ; skok do końca podprogramu
  35. ; sprawdzenie czy wprowadzony znak jest cyfrą 0, 1, 2 , ..., 9
  36.      cmp       dl, '0'
  37.      jb        pocz_konw ; inny znak jest ignorowany
  38.      cmp       dl, '9'
  39.      ja        sprawdzaj_dalej
  40.      sub       dl, '0'   ; zamiana kodu ASCII na wartość cyfry
  41. dopisz:
  42.      shl       eax, 4 ; przesunięcie logiczne w lewo o 4 bity
  43.      or        al, dl ; dopisanie utworzonego kodu 4-bitowego
  44.                      ; na 4 ostatnie bity rejestru EAX
  45.      jmp       pocz_konw ; skok na początek pętli konwersji
  46. ; sprawdzenie czy wprowadzony znak jest cyfrą A, B, ..., F
  47. sprawdzaj_dalej:
  48.      cmp       dl, 'A'
  49.      jb        pocz_konw      ; inny znak jest ignorowany
  50.      cmp       dl, 'F'
  51.      ja        sprawdzaj_dalej2
  52.      sub       dl, 'A' - 10   ; wyznaczenie kodu binarnego
  53.      jmp       dopisz
  54.  
  55.      ; sprawdzenie czy wprowadzony znak jest cyfrą a, b, ..., f
  56. sprawdzaj_dalej2:
  57.      cmp       dl, 'a'
  58.      jb        pocz_konw   ; inny znak jest ignorowany
  59.      cmp       dl, 'f'
  60.      ja        pocz_konw   ; inny znak jest ignorowany
  61.      sub       dl, 'a' - 10
  62.      jmp       dopisz
  63. gotowe:
  64. ; zwolnienie zarezerwowanego obszaru pamięci
  65.      add       esp, 12
  66.      pop       ebp
  67.      pop       edi
  68.      pop       esi
  69.      pop       edx
  70.      pop       ecx
  71.      pop       ebx
  72.      ret
  73. wczytaj_do_EAX_hex  ENDP
  74.  
  75.  
  76.  
  77.  
  78.  
  79. wyswietl_EAX   PROC
  80.                pusha
  81.  
  82.                mov esi, 10 ; indeks w tablicy znaki
  83.                mov ebx, 10 ; dzielnik rowny 10
  84.  
  85.         konwersja:
  86.                 mov edx, 0 ; zerowanie starszej części dzielnej
  87.                 div ebx    ; dzielenie przez 10, reszta w edx, iloraz w eax
  88.                 add dl, 30h  ; zamiana reszty na ASCII
  89.                 mov znaki [esi] , dl ; zapisanie cyfryw ASCII
  90.                 dec esi     ; zmniejszenie indeksu
  91.                 cmp eax, 0  ;sprawdzenie czy iloraz = 0
  92.                 jne konwersja  ; skok gdy iloraz niezerowy
  93.  
  94.         ; spacje i nowe linie
  95.         wypeln:
  96.                 or esi, esi
  97.                 jz wyswietl ; skok gdy esi  =  0
  98.                 mov byte PTR znaki [esi], 20h ; kod spacji
  99.                 dec esi ; zminiejszenie indeksu
  100.                 jmp wypeln
  101.  
  102.         wyswietl:
  103.                 mov byte PTR znaki [0], 0Ah ; kod new lajn
  104.                 mov byte PTR znaki [11], 0Ah
  105.  
  106.         ; na ekran
  107.                 push dword PTR 12
  108.                 push dword PTR OFFSET znaki
  109.                 push dword PTR 1
  110.                 call __write
  111.                 add esp, 12
  112.  
  113.  
  114.                popa
  115.                ret
  116. wyswietl_EAX   ENDP
  117.  
  118.  
  119.  
  120.  
  121. _main:
  122.  
  123.     call wczytaj_do_EAX_hex
  124.     call wyswietl_EAX
  125.  
  126.                push 0
  127.                call _ExitProcess@4
  128. END
Add Comment
Please, Sign In to add comment