Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- wypisz macro msg ;definiowanie makra do wypisu na ekran
- mov ah, 09h ;rozkaz wydruku stringa na wyjscie
- lea dx, msg ;przeniesienie do rejestru dx wskazanego ciagu znakow
- int 21h
- endm
- ;segment danych
- buf1 db "Wprowadz liczbe decymalnie : $" ;wiadomosc 1
- buf2 db 0ah, "Liczba nie jest z zakresu 0-9$" ;wiadomosc 2
- buf3 db 0ah, "Odpowiednik w zapisie hex: $" ;wiadomosc 3
- buf4 db 6 ;alokacja 6 jednostek pamieci
- db 0
- db 6 dup(0) ;wypelnienie w.w jednostek zerami
- buf5 db 0ah, 0dh
- mnoznik db 0ah
- hex db '0123456789ABCDEF';BLOB
- data ends
- code segment
- assume cs:code, ds:data ;zadeklarowanie nazw segmentow do ktorych bedziemy sie odwolywac
- start :
- mov ax, data ;do ax kopiujemy zawartosc segmentu z danycmi
- mov ds, ax ;kopiujemy zaw. ax do ds[data segment]
- mov es, ax ;kopiujemy zaw. ax do do es[extra segment]
- wypisz buf1 ;wywolanie makra z parametrem buf1.
- mov ah, 0ah ;do rejestru ah wprowadzamy dane z klawiatury, przy pomocy rozkazu dosowego
- lea dx, buf4 ;limitujemy liczbe znakow wprowadzonych przez uzytkownika o wczesniej zadeklarowana ilosc
- int 21h ;
- mov si, offset buf4 + 2 ;kopiujemy do wskaznika zrodla adres buf4 z przeniesieniem o 2
- mov cl, byte ptr [si-1] ;do mlodszego bajtu rejestru C kopiujemy zawartosc si, zmuszamy program zeby czytal to jako wskaznik, i przypominamy ze jest to operacja na 8 bitach
- mov ch, 00h ;zerujemy starszy bajt rejestru C
- sprawdzanie :
- mov al, byte ptr [si] ;przenosimy wartosc ciagu znakow do rejetru aL
- cmp al, 30h ;odejmujemy od pojedynczego znaku 30h(0 ascii) zeby sprawdzic czy jest cyfra 0-9
- jnb sprawdzanie2 ;jezeli jest mniejsza (C=1 ) to wyszlismy z zakresu
- wypisz buf2 ;komunikat bledu
- jmp stop ;skok do instrukcji przerwania programu
- sprawdzanie2 :
- cmp al, 3ah ;odejmujemy od pojedynczego znaku 3ah(; ascii ) zebyu sprawdzic czy jest cyfra 0-9
- jb sprawdzenie3 ;jezeli jest wieksza (C=0) to wyszlismy z zakresu
- wypisz buf2 ;komunikat bledu
- jmp stop ;skok do instrukcji przerwania programu
- sprawdzenie3 :
- sub al, 30h ;odejmujemy od al 0 ascii
- mov byte ptr [si], al ;zawartosc rejestru po wykonaniu operacji odjecia kopiujemy spowrotem do wskanzika
- inc si ;wskazujemy na kolejna komorke
- loop sprawdzanie ;dopoki nie skonczy sie nasz lancuch, powtarzaj sprawdzanie kazdego znaku
- mov si, offset buf4 + 2 ;do wskaznika poczatku kopiujemy adres lancucha z przeniesieniem o 2 w prawo, powrot na poczatek tablicy
- mov cl, byte ptr [si-1] ;do rejestru cL kopiujemy wskaznik poczatku z przesunieciem o 1 w lewo
- mov ch, 00h ;rejestr cH uzupelniamy zerami
- mov ax, 0000h ;wypelniamy akumulator zerami
- oblicz :
- mul mnoznik ;mnozy bez znaku akumulator przez wartosc zadeklarowana w mnoznik
- mov bl, byte ptr [si] ;do rejestru bL kopiujemy wskaznik poczatku
- mov bh, 00h ;wskaznik bH uzupelniamy zerami
- add ax, bx ;do rejestru akumulatorowego aX dodajemy rejestr bX
- inc si ;wskazujemy na kolejna komorke
- loop oblicz ;powtarzaj do konca lancucha
- mov si, offset buf4 + 2 ;do wskaznika poczatku kopiujemy adres lancucha z przeniesieniem o 2 w prawo
- mov bx, ax ;kopiujemy zawartosc akumulatora do rejestru B
- mov dx, 0000h ;uzupelniamy rejestr dX zerami
- mov ax, 1000h ;uzupelniamy rejestr aX wartoscia 1000
- konwersja :
- mov cx, 0000h ;uzupelniamy rejestr cX zerami
- konwersja1 :
- cmp bx, ax ;odejmujemy od rejestru bx rejestr ax, zeby sprawdzic ktory wiekszy
- jb konwersja2 ;jezeli bX wiekszy, skaczemy do konwersja2
- sub bx, ax ;odejmujemy od rejestru bx rejestr ax,
- inc cx ;zwiekszamy cX o 1
- jmp konwersja1 ;skok do konwersja1
- konwersja2 :
- cmp cx, 0ah ;porownujemy cX z wartoscia 0010, if cX<10,c=1
- jb konwersja3 ;jezeli C=1, to skok do konwersja3
- add cl, 37h ;dodajemy do cL wartosc 7ASCII
- jmp konwersja4 ;skok bezwarunkowy do cont 5
- konwersja3 :
- add cl, 30h ;dodaj do cL wartosc 0ASCII
- konwersja4 :
- mov byte ptr [si], cl ;skopiuj wartosc cL do wskaznika poczatku
- inc si ;si++
- mov cx, 0010h ;skopiuj do cX wartosc 0010
- div cx ;podziel bez znaku akumulator przez cX
- cmp ax, 0000h ;porownaj akumulator z wartoscia 0000, jezeli aX<0000, c=1
- jnz konwersja ;jezeli flaga z!=0, skocz do konwersja
- mov byte ptr [si], '$' ;przesun na koniec tablicy znak konca lini
- wypisz buf3 ;wyprowadz na ekran zawartosc buf3
- wypisz buf4+2 ;wyprowadz na ekran zawartosc przekonwertowanej tablicy z przesuniecie
- stop :
- mov ax, 4c00h ;przerwanie programu
- int 21h
- code ends
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement