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
- hexBin macro wart ; binary (0/1) output of wart to screen
- local lup ; local symbol
- mov ax,0000h
- mov cx,0000h
- mov dx,0000h
- push ax ; save our regs (flag reg should also be saved)
- push cx ;
- push dx ;
- mov bl, wart ; move wart into bl reg
- mov cx, 8 ; Loop counter, a byte has 8 bits
- mov ah, 2h ; DOS function to output one char from dl
- ; the gist of the matter is the four-line lup
- lup: rcl bl, 1 ; left-rotating bl through carry CF
- mov dl, 30h ; make an ASCII out of it, ascii = number + '0'
- adc dl, 0 ; Add with carry, that is ascii=30h+0 or 30h+1
- int 21h ; jump to DOS and execute 2h there
- loop lup ; dec cx and repeat until cx = 0
- pop dx ; revive our regs
- pop cx ;
- pop ax ;
- endm hexBin
- stosik segment STACK 'STACK'
- dw 100h dup(?)
- stosik ends
- data segment ;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 ;BLOB
- data ends
- code segment
- assume cs:code, ds:data, ss:stosik ;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 cont2 ;jezeli jest wieksza (C=0) to wyszlismy z zakresu
- wypisz buf2 ;komunikat bledu
- jmp stop ;skok do instrukcji przerwania programu
- cont2 :
- 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
- calc :
- 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 calc ;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
- convert :
- mov cx, 0000h ;uzupelniamy rejestr cX zerami
- conv :
- cmp bx, ax ;odejmujemy od rejestru bx rejestr ax, zeby sprawdzic ktory wiekszy
- jb cont3 ;jezeli bX wiekszy, skaczemy do cont3
- sub bx, ax ;odejmujemy od rejestru bx rejestr ax,
- inc cx ;zwiekszamy cX o 1
- jmp conv ;skok do conv
- cont3 :
- cmp cx, 0ah ;porownujemy cX z wartoscia 0010, if cX<10,c=1
- jb cont4 ;jezeli C=1, to skok do cont4
- add cl, 37h ;dodajemy do cL wartosc 7ASCII
- jmp cont5 ;skok bezwarunkowy do cont 5
- cont4 :
- add cl, 30h ;dodaj do cL wartosc 0ASCII
- cont5 :
- 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 convert ;jezeli flaga z!=0, skocz do convert
- 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 przesunieciem o 2
- MOV dl, 10
- MOV ah, 02h
- INT 21h
- MOV dl, 13
- MOV ah, 02h
- INT 21h
- mov si, offset buf4 + 2
- hexBin 15h
- stop :
- mov ax, 4c00h ;przerwanie programu
- int 21h
- code ends
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement