Advertisement
joker546645

3_5 ( DEC to HEX ) w/ ' '

Nov 9th, 2017
88
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. obszar              db   12 dup (?)
  9. dziesiec            dd   10 ; mnoznik    
  10. dekoder             db ' 123456789ABCDEF'
  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_hex   PROC
  53.  
  54.      pusha          ; przechowanie rejestrów
  55. ; rezerwacja 12 bajtów na stosie (poprzez zmniejszenie
  56. ; rejestru ESP) przeznaczonych na tymczasowe przechowanie
  57. ; cyfr szesnastkowych wyświetlanej liczby
  58.      sub       esp, 12
  59.      mov       edi, esp  ; adres zarezerwowanego obszaru
  60.                         ; pamięci
  61. ; przygotowanie konwersji            
  62.      mov       ecx, 8    ; liczba obiegów pętli konwersji
  63.      mov       esi, 1    ; indeks początkowy używany przy
  64.                               ; zapisie cyfr
  65. ; pętla konwersji
  66. ptl3hex:    
  67. ; przesunięcie cykliczne (obrót) rejestru EAX o 4 bity w lewo
  68. ; w szczególności, w pierwszym obiegu pętli bity nr 31 - 28
  69. ; rejestru EAX zostaną przesunięte na pozycje 3 - 0
  70.      rol       eax, 4              
  71. ; wyodrębnienie 4 najmłodszych bitów i odczytanie z tablicy
  72. ; 'dekoder' odpowiadającej im cyfry w zapisie szesnastkowym
  73.      mov       ebx, eax  ; kopiowanie EAX do EBX
  74.      and       ebx, 0000000FH ; zerowanie bitów 31 - 4  rej.EBX
  75.      mov       dl, dekoder[ebx] ; pobranie cyfry z tablicy
  76.      cmp       ebx, 0
  77.      je        kont
  78.      mov       dekoder[0], '0'
  79.  
  80. kont:
  81.      
  82. ; przesłanie cyfry do obszaru roboczego
  83.      mov       [edi][esi], dl  
  84.      inc       esi       ;inkrementacja modyfikatora
  85.      loop      ptl3hex   ; sterowanie pętlą
  86. ; wpisanie znaku nowego wiersza przed i po cyfrach
  87.      mov       byte PTR [edi][0], 10
  88.      mov       byte PTR [edi][9], 10
  89. ; wyświetlenie przygotowanych cyfr
  90.      push      10   ; 8 cyfr + 2 znaki nowego wiersza
  91.      push      edi  ; adres obszaru roboczego
  92.      push      1    ; nr urządzenia (tu: ekran)
  93.      call      __write   ; wyświetlenie
  94.      ; usunięcie ze stosu 24 bajtów, w tym 12 bajtów zapisanych
  95. ; przez 3 rozkazy push przed rozkazem call
  96. ; i 12 bajtów zarezerwowanych na początku podprogramu
  97.  
  98.  
  99.  
  100.      add       esp, 24              
  101.      popa      ; odtworzenie rejestrów
  102.      ret       ; powrót z podprogramu
  103.  
  104. wyswietl_EAX_hex   ENDP
  105.  
  106. _main:
  107.  
  108.     call wczytaj_EAX
  109.     call wyswietl_EAX_hex
  110.  
  111.                push 0
  112.                call _ExitProcess@4
  113. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement