Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .model tiny
- .stack 80h
- .data
- zero db ' ### $', ' # # $', '# #$', '# #$', '# #$', ' # # $', ' ### $'
- one db ' # $', ' ## $', ' # # $', ' # $', ' # $', ' # $', ' ##### $'
- erroor db 'Wprowadzono niepoprawna liczbe $'
- new_line db 13,10, '$'
- .code
- start:
- ;przeniesienie segmentu danych do ds
- mov ax, seg zero
- mov ds,ax
- ;wczytanie z klawiatury cyfry w hex
- mov ah,8
- int 21h
- ;oszacowanie z jakiego przedziału jest wprowadzona liczba,
- ;poprzez porownanie granicznych wartości kodu ASCII
- cmp al, '0'
- jl errooor ;jesli mniejsza od 0 to skacze do etykiety errooor
- cmp al, '9'
- jle convert_number ;jesli z zakresu 0-9 skacze do convert_number
- ;duze litery w kodzie ASCII sa przed malymi, wiec trzeba je najpierw sprawdzic
- cmp al, 'F'
- jle convert_capital_letter ;jesli jest z przedziału 10-15 to skacze do convert_capital_letter
- cmp al, 'a' ;jesli liczba z przedzialu G-... to blad
- jl errooor
- cmp al, 'f'
- jle convert_lower_case_letter ;jesli jest z przedziału 10-15 to skacze do convert_lower_case_letter
- jmp errooor ; jesli nie sa z przedzialu 0-15 to skacze do errooor
- errooor:
- ;wypisanie bledu na ekran
- lea dx, erroor
- mov ah,9
- int 21h
- jmp the_end
- convert_number:
- ;zamiana liczby z kodu ascii na jej wartość
- sub al, '0'
- jmp continue
- convert_lower_case_letter:
- ;zamiana małej litery
- sub al, 'a'
- add al, 10 ;A=11, jak odejmiemy al=al-kod ascii a to otrzymamy wynik z przedzialu 0-5, a szukamy 10-15
- jmp continue
- convert_capital_letter:
- ;zamiana dużej litery
- sub al, 'A'
- add al, 10 ;a=11, jak odejmiemy al=al-kod ascii a to otrzymamy wynik z przedzialu 0-5, a szukamy 10-15
- continue:
- mov cx,7 ;licznik petli zewnetrznej, petla loop inkrementuje
- mov bx,0 ;rejestr odpowiedzialny za wypisanie kolejnych wierszy
- write_banner:
- push cx
- push ax ; tworzymy kopie naszej liczby (al), odstawiajac ją na stos
- mov cl,3 ;licznik potrzebny do przesuniecia bitowego w prawo
- ;sprawdza na kolejnych bitach czy znajduje sie 0,czy 1
- check3rdbit:
- and ax,0000000000001000b ;maska dla 3 bitu
- shr al,cl ;przesuwam al o 3 bity w prawo
- cmp al,1
- je write_one ;jesli 1 to wypisuje 1
- jl write_zero ;w przeciwnym razie wypisuje 0
- check2ndbit:
- and ax,0000000000000100b ;maska dla 2 bitu
- shr al,cl ;przesuwam al o 2 bity w prawo
- cmp al,1
- je write_one
- jl write_zero
- check1stbit:
- and ax,0000000000000010b ;maska dla 1 bitu
- shr al,cl ;przesuwam al o 1 bit w prawo
- cmp al,1
- je write_one ;jesli 1 to wypisuje 1
- jl write_zero
- check0bit:
- and ax,0000000000000001b ;maska dla 0 bitu
- cmp al,1
- je write_one1 ;jesli 1 to wypisuje 1
- lea dx,zero
- add dx,bx
- mov ah,9
- int 21h
- continue1:
- lea dx, new_line ;przeskakuje do wypisywania nowej lini w banerze
- mov ah,9
- int 21h
- add bx,8
- pop ax
- pop cx
- loop write_banner ;powtarza 7 razy, dla kazdej linijki
- jmp the_end
- write_one:
- lea dx, one
- add dx,bx
- mov ah,9
- int 21h
- pop ax
- push ax
- dec cl
- cmp cl,1
- jg check2ndbit
- je check1stbit
- jl check0bit
- write_one1:
- lea dx, one
- add dx,bx
- mov ah,9
- int 21h
- jmp continue1
- write_zero:
- lea dx,zero
- add dx,bx ;odpowiedzialny za przeskoczenie do nastepnego fragmentu tekstu, zaraz po $
- mov ah,9
- int 21h
- pop ax
- push ax
- dec cl
- cmp cl,1
- jg check2ndbit
- je check1stbit
- jl check0bit
- the_end:
- mov ah,4ch
- int 21h
- end start
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement