Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .686
- .model flat
- extern __write : PROC
- extern __read : PROC
- extern _ExitProcess@4 : PROC
- public _main
- .data
- znaki db 12 dup (?)
- .code
- wczytaj_do_EAX_hex PROC
- push ebx
- push ecx
- push edx
- push esi
- push edi
- push ebp
- ; rezerwacja 12 bajtów na stosie przeznaczonych na tymczasowe
- ; przechowanie cyfr szesnastkowych wyświetlanej liczby
- sub esp, 12 ; rezerwacja poprzez zmniejszenie ESP
- mov esi, esp ; adres zarezerwowanego obszaru pamięci
- push dword PTR 10 ; max ilość znaków wczytyw. liczby
- push esi ; adres obszaru pamięci
- push dword PTR 0; numer urządzenia (0 dla klawiatury)
- call __read ; odczytywanie znaków z klawiatury
- ; (dwa znaki podkreślenia przed read)
- add esp, 12 ; usunięcie parametrów ze stosu
- mov eax, 0 ; dotychczas uzyskany wynik
- pocz_konw:
- mov dl, [esi] ; pobranie kolejnego bajtu
- inc esi ; inkrementacja indeksu
- cmp dl, 10 ; sprawdzenie czy naciśnięto Enter
- je gotowe ; skok do końca podprogramu
- ; sprawdzenie czy wprowadzony znak jest cyfrą 0, 1, 2 , ..., 9
- cmp dl, '0'
- jb pocz_konw ; inny znak jest ignorowany
- cmp dl, '9'
- ja sprawdzaj_dalej
- sub dl, '0' ; zamiana kodu ASCII na wartość cyfry
- dopisz:
- shl eax, 4 ; przesunięcie logiczne w lewo o 4 bity
- or al, dl ; dopisanie utworzonego kodu 4-bitowego
- ; na 4 ostatnie bity rejestru EAX
- jmp pocz_konw ; skok na początek pętli konwersji
- ; sprawdzenie czy wprowadzony znak jest cyfrą A, B, ..., F
- sprawdzaj_dalej:
- cmp dl, 'A'
- jb pocz_konw ; inny znak jest ignorowany
- cmp dl, 'F'
- ja sprawdzaj_dalej2
- sub dl, 'A' - 10 ; wyznaczenie kodu binarnego
- jmp dopisz
- ; sprawdzenie czy wprowadzony znak jest cyfrą a, b, ..., f
- sprawdzaj_dalej2:
- cmp dl, 'a'
- jb pocz_konw ; inny znak jest ignorowany
- cmp dl, 'f'
- ja pocz_konw ; inny znak jest ignorowany
- sub dl, 'a' - 10
- jmp dopisz
- gotowe:
- ; zwolnienie zarezerwowanego obszaru pamięci
- add esp, 12
- pop ebp
- pop edi
- pop esi
- pop edx
- pop ecx
- pop ebx
- ret
- wczytaj_do_EAX_hex ENDP
- wyswietl_EAX PROC
- pusha
- mov esi, 10 ; indeks w tablicy znaki
- mov ebx, 10 ; dzielnik rowny 10
- konwersja:
- mov edx, 0 ; zerowanie starszej części dzielnej
- div ebx ; dzielenie przez 10, reszta w edx, iloraz w eax
- add dl, 30h ; zamiana reszty na ASCII
- mov znaki [esi] , dl ; zapisanie cyfryw ASCII
- dec esi ; zmniejszenie indeksu
- cmp eax, 0 ;sprawdzenie czy iloraz = 0
- jne konwersja ; skok gdy iloraz niezerowy
- ; spacje i nowe linie
- wypeln:
- or esi, esi
- jz wyswietl ; skok gdy esi = 0
- mov byte PTR znaki [esi], 20h ; kod spacji
- dec esi ; zminiejszenie indeksu
- jmp wypeln
- wyswietl:
- mov byte PTR znaki [0], 0Ah ; kod new lajn
- mov byte PTR znaki [11], 0Ah
- ; na ekran
- push dword PTR 12
- push dword PTR OFFSET znaki
- push dword PTR 1
- call __write
- add esp, 12
- popa
- ret
- wyswietl_EAX ENDP
- _main:
- call wczytaj_do_EAX_hex
- call wyswietl_EAX
- push 0
- call _ExitProcess@4
- END
Add Comment
Please, Sign In to add comment