Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- org 100h
- section .data
- linia0: db "--------------------------------------------------------$"
- komunikat0: db "Program liczy wspolne dzielniki dwoch liczb naturalnych.$"
- komunikat1: db 10,"Zakres do 9 999. Aby wyjsc nacisnij litere >>>q<<<$"
- komunikat2: db 10,13,"Wpisz pierwsza liczbe: $"
- komunikat3: db 13,"Wpisz druga liczbe: $"
- komunikat4: db 10,13,"Wyniki: $ "
- komunikat5: db 10,10,13,"Program obsluguje tylko liczby naturalne!!!$"
- komunikat6: db 10,10,13,"Poza zakresem!!!$"
- enter1: db 10,"$";
- ;zmienne pomocnicze
- zm1 dw 0
- zm2 dw 0
- temp dw 0
- temp2 dw 0
- porownanie dw 0
- section .text
- start:
- call nowa_linia
- mov ah, 9h
- mov dx,linia0 ;wyswietlenie komunikatu0
- int 21h
- call nowa_linia
- mov ah, 9h
- mov dx,komunikat0 ;wyswietlenie komunikatu0
- int 21h
- mov ah, 9h
- mov dx,komunikat1 ;wyswietlenie komunikatu1
- int 21h
- call nowa_linia
- mov ah, 9h
- mov dx,komunikat2 ;wyswietlenie komunikatu2 "Wpisz pierwsza liczbe: "
- int 21h
- call wejscie ; zapisz wprowadzona wartosc w rejestrze bx
- mov [zm1], bx
- mov ah, 9h
- mov dx,komunikat3 ;wyswietlenie komunikatu3 "Wpisz druga liczbe: "
- int 21h
- call wejscie ; zapisz wprowadzona wartosc w rejestrze bx
- mov [zm2], bx
- mov ah, 9h
- mov dx,komunikat4 ;wyswietlenie komunikatu4 "Wyniki: "
- int 21h
- call nowa_linia
- sprawdz_czy_zamiana:
- mov ax, [zm1] ; procedrua ma na celu sprawdzenie czy
- mov bx, [zm2] ; liczba w zm1 jest wieksza od zm2
- cmp ax, bx
- jl zamiana ;jeśli nie to zamiana miejscami
- jnl dzielniki
- zamiana: ;zamiana miejscami liczba wieszka wedruje do zmiennej zm1
- mov ax, [zm1]
- mov bx, [zm2]
- mov cx, [zm2]
- ; zm2 = zm1
- ; zm1 = temp
- mov bx, ax
- mov ax, cx
- mov [zm1], ax
- mov [zm2], bx
- jmp dzielniki
- dzielniki:
- xor bp, bp ; "licznik"(dzielna)
- xor cx, cx ; petla
- xor si, si ; tutaj bedzie wpisana nasza liczba
- mov si,[zm1] ;do si wstawiam wieksza liczbe
- mov cx,si
- mov bp ,1 ; zaczynamy od 1
- petla1:
- cmp bp, [zm2] ; sprawdzamy czy bx >= zm2
- ja petla2 ; jezeli bp > si petla2
- mov ax, [zm2] ; zm2 do ax
- xor dx, dx ; zerujemy dx, bo w dx bedzie reszta z dzielenia
- div bp ; dx = ax % bp
- or dx, dx ; czy w dx jest 0?
- jz zapisz ; zapisz jesli jest 0!
- jnz petla2 ; skok do petli 2 jesli dx jest rózne od 0!
- zapisz:
- mov [temp],ax ; przenosimy wynik do temp
- jmp petla2
- petla2:
- cmp bp, si ; sprawdzamy czy bx >= zm1
- je near start ; jezeli bx > zm1 koncz dodane near
- mov ax, [zm1] ; zm1 do ax
- xor dx, dx ; zerujemy dx, bo w dx bedzie reszta z dzielenia
- div bp ; dx = ax % bp
- or dx, dx ; czy edx jest zerem(?)
- jz zapisz2 ; wypisz jesli dx jest 0
- here:
- inc bp
- sub cx, 1 ; zmniejszamy rejestr 1 z każdym przebiegiem pętli
- jnz petla1 ; skacz do petla1 jesli nie zero
- zapisz2:
- mov [temp2],ax; przenosimy wynik do temp2
- jmp prownaj
- prownaj:
- mov ax,[temp2]
- mov bx,[temp]
- div bx ;dzielimy dzielniki aby sprawdzic czy są sobie równe
- or dx,dx
- jz wpisuj_dzielnik
- jnz here
- wpisuj_dzielnik:
- mov ax,[temp]
- xor bx, bx ;czysci bx
- mov bx,ax ; wypisuje dzielnik
- call wyjscie
- call nowa_linia
- jmp here
- wyjscie: ; zapisz rejestry których używamy
- push ax
- push bx
- push cx
- push dx
- xor cx,cx ; czyścimy licznik
- rept:
- mov ax,bx ; wartość do wypisania wędruje z bx do ax
- xor dx,dx
- mov bx,10 ; dzielnik bedzie w bx
- div bx ; iloraz w ax, reszta w dx
- push dx ; dodaj reszte do stosu
- inc cx ; wygenerowano kolejną cyfre, licznik zwieksza sie o 1
- mov bx,ax ; iloraz z powrotem do bx
- cmp ax,0 ; sprawdza czy iloraz jest równy zero
- jne rept ; jeśli nie, generuje kolejną CYFRE
- mov ah,2 ; funkcja wyswietla znak
- czytaj: ; pętla powtarza sie cx-razy
- pop dx ; umieść cyfre na stosie aby wyswietlic
- or dl,30h ; przekonwertuj cyfre aby wyswietlic kod ASCII
- int 21h ; wyswietl znak
- loop czytaj ;powtarzaj do momentu aż wszystki znaki z łańcucha zostana przekonwertowane
- ;czysci rejestry
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- wejscie:
- ; zapisz rejestry
- push ax
- push dx
- xor bx,bx ; czyszczenie bx, tutaj bedzie sie znajdował input
- mov ah,1 ; funkcja czytająca znak
- int 21h ; wykonaj
- cmp al,113
- je koniec
- cmp al,57
- ja nie_cyfra
- cmp al,48
- jb nie_cyfra
- mov si,1
- while1:
- cmp al,32 ; wyjdz z programu po wpisaniu >>> q
- je koniec
- cmp si,5 ; anuluj wczytywanie jeżeli wpisano wiecej jak 6 znaków
- ja poza_zakrese
- cmp al,0Dh ; znak = CR?
- je koniec_wejscia ; wyjdź jeżeli wczytano wszystkie znaki
- push ax ; zapisz odczytany znak
- mov ax,10 ; przygotowywanie ax do mnożenia
- mul bx ;dx:ax <- bx * 10
- mov bx,ax ; umieść 16-bitowy wynik z powrotem w bx
- pop ax ; zdejmij wczytany znak
- and ax,000Fh ; konwertuj znak '0'-'9' do wartości 0-9
- add bx,ax ; dodaj wartosc do zapisanego wejscia
- mov ah,1
- int 21h ; zapisz kolejny znak w al
- inc si ; zwieksz si o 1
- cmp al,57
- ja nie_cyfra ; sprwadza czy znak jest wiekszy od 57 w ASCII
- jmp while1 ; petla dopóki nie skonczy
- koniec_wejscia:
- ; wyczyść rejestry
- pop dx
- pop ax
- ret
- nowa_linia:
- mov ah, 9h
- mov dx,enter1 ;przejscie do następnej linii
- int 21h
- ret
- ;komunikaty błędu
- nie_cyfra:
- mov ah, 9h
- mov dx,komunikat5
- int 21h
- jmp start
- poza_zakrese:
- mov ah, 9h
- mov dx,komunikat6
- int 21h
- jmp start
- koniec:
- mov ax, 4c00h
- int 21h
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement