Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .686
- .model flat
- extern _ExitProcess@4 : PROC
- extern _MessageBoxA@16 : PROC
- extern _MessageBoxW@16 : PROC
- extern __write : PROC ; (int handle, char * text, int length)
- extern __read : PROC ; (int handle, char * text, int lengthLimit)
- public _main
- .data
- tytul dw 'd','d',0
- magazyn dw 180 dup (?)
- obszar db 12 dup (?)
- dziesiec db 10 ; mnożnik
- dekoder dw 0031h,0032h,0033h,0034h,0035h,0036h,0037h,0038h,0039h,218ah,218bh
- .code
- wczytaj_do_EAX PROC
- push ebx
- push ecx
- push edx
- push esi
- push edi
- ; max ilość znaków wczytywanej liczby
- 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
- ; (dwa znaki podkreślenia przed read)
- 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:
- ; wartość binarna wprowadzonej liczby znajduje się teraz w rejestrze EAX
- ; Zapisujemy wynik do EAX
- pop edi
- pop esi
- pop edx
- pop ecx
- pop ebx
- ret
- wczytaj_do_EAX ENDP
- wyswietl_EAX_12 PROC
- pusha ; przechowanie rejestrów
- ; rezerwacja 12 bajtów na stosie (poprzez zmniejszenie
- ; rejestru ESP) przeznaczonych na tymczasowe przechowanie
- ; cyfr dwunastkowych 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 dx, dekoder[2*ebx-2] ; pobranie cyfry z tablicy
- ; przesłanie cyfry do obszaru roboczego
- mov [edi][esi], dx
- mov magazyn[2*esi-2],dx
- inc esi ;inkrementacja modyfikatora
- loop ptl3hex ; sterowanie pętlą
- wyswietl:
- ; wpisanie znaku nowego wiersza przed i po cyfrach
- mov byte PTR [edi][0], 10
- mov byte PTR [edi][9], 10
- mov dh,0
- mov al, 30H ;tu trzymamy zero do porownan
- mov dl, 20H ;spacja
- mov ecx,8
- mov ebx,1
- ptl:
- cmp [edi][ebx], al
- jne skok
- mov byte PTR[edi][ebx], dl
- inc ebx
- loop ptl
- skok: ; wyświetlenie przygotowanych cyfr
- 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_12 ENDP
- _main:
- call wczytaj_do_EAX
- call wyswietl_EAX_12
- push 0
- push OFFSET tytul
- push OFFSET magazyn
- push 0
- call _MessageBoxW@16
- push 0
- call _ExitProcess@4
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement