Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .686
- .model flat
- extern _ExitProcess@4 : PROC
- extern __write : PROC
- extern __read : PROC
- public _main
- .data
- dekoder db'0123456789ABCDEF'
- znaki db 12 dup(?)
- obszar db 12 dup(?)
- dziesiec dd 10 ; mnoznik
- .code
- wyswietl_EAX_hex PROC
- ; wy?wietlanie zawarto?ci rejestru EAX
- ; w postaci liczby szesnastkowej
- pusha ; przechowanie rejestrów
- ; rezerwacja 12 bajtów na stosie (poprzez zmniejszenie
- ; rejestru ESP) przeznaczonych na tymczasowe przechowanie
- ; cyfr szesnastkowych wy?wietlanej liczby
- sub esp, 12
- mov edi, esp ; adres zarezerwowanego obszaru
- ; pami?ci
- ; przygotowanie konwersji
- mov ecx, 8 ; liczba obiegów p?tli konwersji
- mov esi, 1 ; indeks pocz?tkowy u?ywany przy
- ; zapisie cyfr
- ; p?tla konwersji
- ptl3hex:
- ; przesuni?cie cykliczne (obrót) rejestru EAX o 4 bity w lewo
- ; w szczególno?ci, w pierwszym obiegu p?tli bity nr 31 - 28
- ; rejestru EAX zostan? przesuni?te na pozycje 3 - 0
- rol eax, 4
- ; wyodr?bnienie 4 najm?odszych bitów i odczytanie z tablicy
- ; 'dekoder' odpowiadaj?cej im cyfry w zapisie szesnastkowym
- mov ebx, eax ; kopiowanie EAX do EBX
- and ebx, 0000000FH ; zerowanie bitów 31 - 4 rej.EBX
- mov dl, dekoder[ebx] ; pobranie cyfry z tablicy
- ; przes?anie cyfry do obszaru roboczego
- mov [edi][esi], dl
- inc esi ;inkrementacja modyfikatora
- loop ptl3hex ; sterowanie p?tl?
- ; wpisanie znaku nowego wiersza przed i po cyfrach
- mov byte PTR [edi][0], 10
- mov byte PTR [edi][9], 10
- ; wy?wietlenie przygotowanych cyfr
- mov esi, 8
- popraw_zera:
- mov al, 30H
- cmp [edi][esi], al
- je zamien_na_spacje
- wroc:
- dec esi
- cmp esi, 0
- je dalej
- jmp popraw_zera
- zamien_na_spacje:
- mov al, 20H
- mov [edi][esi], al
- jmp wroc
- dalej:
- push 10 ; 8 cyfr + 2 znaki nowego wiersza
- push edi ; adres obszaru roboczego
- push 1 ; nr urz?dzenia (tu: ekran)
- call __write ; wy?wietlenie
- ; usuni?cie ze stosu 24 bajtów, w tym 12 bajtów zapisanych
- ; przez 3 rozkazy push przed rozkazem call
- ; i 12 bajtów zarezerwowanych na pocz?tku podprogramu
- add esp, 24
- popa ; odtworzenie rejestrów
- ret ; powrót z podprogramu
- wyswietl_EAX_hex ENDP
- wyswietl_EAX PROC
- mov esi, 10
- mov ebx, 10
- konwersja:
- mov edx, 0
- div ebx
- add dl, 30H
- mov znaki [esi], dl
- dec esi
- cmp eax, 0
- jne konwersja
- wypeln:
- or esi, esi
- jz wyswietl
- mov byte PTR znaki [esi], 20H
- dec esi
- jmp wypeln
- wyswietl:
- mov byte PTR znaki [0], 0AH
- mov byte PTR znaki [11], 0AH
- push dword PTR 12
- push dword PTR OFFSET znaki
- push dword PTR 1
- call __write
- add esp, 12
- ret
- wyswietl_EAX ENDP
- _wczytaj_do_eax PROC
- push ebx
- push ecx
- push edx
- push dword PTR 12
- push dword PTR OFFSET obszar ; adres obszaru pami?ci
- push dword PTR 0; numer urz?dzenia (0 dla klawiatury)
- call __read ; odczytywanie znaków z klawiatury
- add esp, 12 ; usuni?cie parametrów ze stosu
- ; bie??ca warto?? przekszta?canej liczby przechowywana jest
- ; w rejestrze EAX; przyjmujemy 0 jako warto?? pocz?tkow?
- mov eax, 0
- mov ebx, OFFSET obszar ; adres obszaru ze znakami
- pobieraj_znaki:
- mov cl, [ebx] ; pobranie kolejnej cyfry w kodzie
- ; ASCII
- inc ebx ; zwi?kszenie indeksu
- cmp cl,10 ; sprawdzenie czy naci?ni?to Enter
- je byl_enter ; skok, gdy naci?ni?to Enter
- sub cl, 30H ; zamiana kodu ASCII na warto?? cyfry
- movzx ecx, cl ; przechowanie warto?ci cyfry w
- ; rejestrze ECX
- ; mno?enie wcze?niej obliczonej warto?ci razy 10
- mul dword PTR dziesiec
- add eax, ecx ; dodanie ostatnio odczytanej cyfry
- jmp pobieraj_znaki ; skok na pocz?tek p?tli
- byl_enter:
- NOP
- pop ebx
- pop ecx
- pop edx
- ret
- _wczytaj_do_eax ENDP
- _main PROC
- call _wczytaj_do_eax
- call wyswietl_EAX_hex
- push dword ptr 0
- call _ExitProcess@4
- _main ENDP
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement