Advertisement
myshya

common divisors of numbers

Feb 21st, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. org 100h    
  2.  
  3. section .data
  4.  
  5. linia0: db     "--------------------------------------------------------$"
  6. komunikat0: db "Program liczy wspolne dzielniki dwoch liczb naturalnych.$"
  7. komunikat1: db 10,"Zakres do 9 999. Aby wyjsc nacisnij litere >>>q<<<$"
  8. komunikat2: db 10,13,"Wpisz pierwsza liczbe: $"
  9. komunikat3: db 13,"Wpisz druga liczbe: $"
  10. komunikat4: db 10,13,"Wyniki: $  "
  11. komunikat5: db 10,10,13,"Program obsluguje tylko liczby naturalne!!!$"
  12. komunikat6: db 10,10,13,"Poza zakresem!!!$"
  13. enter1: db 10,"$";
  14.  
  15. ;zmienne pomocnicze
  16. zm1 dw 0
  17. zm2 dw 0
  18. temp dw 0
  19. temp2 dw 0
  20.  
  21. porownanie dw 0
  22.  
  23. section .text
  24.  
  25. start:
  26.     call nowa_linia
  27.     mov ah, 9h
  28.     mov dx,linia0   ;wyswietlenie komunikatu0
  29.     int 21h
  30.  
  31.  
  32.     call nowa_linia    
  33.  
  34.     mov ah, 9h
  35.     mov dx,komunikat0   ;wyswietlenie komunikatu0
  36.     int 21h
  37.  
  38.     mov ah, 9h
  39.     mov dx,komunikat1   ;wyswietlenie komunikatu1
  40.     int 21h
  41.  
  42.     call nowa_linia    
  43.  
  44.     mov ah, 9h
  45.     mov dx,komunikat2   ;wyswietlenie komunikatu2 "Wpisz pierwsza liczbe: "
  46.     int 21h
  47.  
  48.     call    wejscie      ; zapisz wprowadzona wartosc w rejestrze bx
  49.     mov [zm1], bx
  50.  
  51.     mov ah, 9h
  52.     mov dx,komunikat3    ;wyswietlenie komunikatu3 "Wpisz druga liczbe: "
  53.     int 21h
  54.  
  55.     call    wejscie      ; zapisz wprowadzona wartosc w rejestrze bx
  56.     mov [zm2], bx
  57.  
  58.     mov ah, 9h
  59.     mov dx,komunikat4 ;wyswietlenie komunikatu4 "Wyniki:  "
  60.     int 21h
  61.  
  62.     call nowa_linia    
  63.  
  64. sprawdz_czy_zamiana:
  65.     mov   ax, [zm1]   ; procedrua ma na celu sprawdzenie czy
  66.     mov   bx, [zm2]   ; liczba w zm1 jest wieksza od zm2
  67.     cmp   ax, bx      
  68.     jl    zamiana     ;jeśli nie to zamiana miejscami
  69.     jnl   dzielniki    
  70. zamiana:                    ;zamiana miejscami liczba wieszka wedruje do zmiennej zm1
  71.     mov   ax, [zm1]      
  72.     mov   bx, [zm2]      
  73.  
  74.     mov   cx, [zm2]      
  75.                             ; zm2 = zm1
  76.                             ; zm1 = temp
  77.     mov   bx, ax      
  78.     mov   ax, cx      
  79.     mov   [zm1], ax      
  80.     mov   [zm2], bx
  81.     jmp dzielniki    
  82.          
  83.          
  84. dzielniki:
  85.     xor bp, bp  ; "licznik"(dzielna)
  86.     xor cx, cx  ; petla
  87.     xor si, si  ; tutaj bedzie wpisana nasza liczba
  88.  
  89.     mov si,[zm1] ;do si wstawiam wieksza liczbe
  90.  
  91.     mov cx,si
  92.    
  93.     mov bp ,1  ; zaczynamy od 1
  94.  
  95. petla1:    
  96.    
  97.     cmp bp, [zm2]  ; sprawdzamy czy bx >= zm2
  98.     ja  petla2   ; jezeli bp > si petla2
  99.     mov ax, [zm2]   ; zm2 do ax
  100.     xor dx, dx  ; zerujemy dx, bo w dx bedzie reszta z dzielenia
  101.     div bp  ; dx = ax % bp
  102.     or  dx, dx  ; czy w dx jest 0?
  103.     jz  zapisz ; zapisz jesli jest 0!
  104.     jnz petla2 ; skok do petli 2 jesli dx jest rózne od 0!
  105.  
  106. zapisz:
  107.     mov [temp],ax   ; przenosimy wynik do temp
  108.     jmp petla2
  109.  
  110. petla2:
  111.    
  112.     cmp bp, si      ; sprawdzamy czy bx >= zm1
  113.     je near start   ; jezeli bx > zm1 koncz dodane near
  114.     mov ax, [zm1]   ; zm1 do ax
  115.     xor dx, dx      ; zerujemy dx, bo w dx bedzie reszta z dzielenia
  116.     div bp          ; dx = ax % bp
  117.     or  dx, dx      ; czy edx jest zerem(?)
  118.     jz  zapisz2     ; wypisz jesli dx jest 0
  119.  
  120. here:
  121.     inc bp
  122.  
  123.     sub cx, 1   ; zmniejszamy rejestr 1 z każdym przebiegiem pętli
  124.     jnz petla1  ; skacz do petla1 jesli nie zero
  125. zapisz2:
  126.    
  127.      mov [temp2],ax; przenosimy wynik do temp2
  128.      jmp prownaj
  129.  
  130. prownaj:
  131.     mov ax,[temp2]  
  132.     mov bx,[temp]
  133.  
  134.     div bx  ;dzielimy dzielniki aby sprawdzic czy są sobie równe
  135.  
  136.     or dx,dx
  137.     jz wpisuj_dzielnik
  138.     jnz here
  139.  
  140. wpisuj_dzielnik:
  141.    
  142.     mov ax,[temp]  
  143.     xor bx, bx  ;czysci bx
  144.     mov bx,ax   ; wypisuje dzielnik
  145.     call wyjscie
  146.    
  147.     call nowa_linia
  148.  
  149.     jmp here
  150.  
  151. wyjscie:                ; zapisz rejestry których używamy
  152.     push    ax            
  153.     push    bx
  154.     push    cx
  155.     push    dx
  156.  
  157.     xor cx,cx       ; czyścimy licznik
  158. rept:
  159.     mov ax,bx       ; wartość do wypisania wędruje z bx do ax
  160.     xor dx,dx      
  161.     mov bx,10       ; dzielnik bedzie w bx
  162.     div bx      ; iloraz w ax, reszta w dx
  163.     push    dx      ; dodaj reszte do stosu
  164.     inc cx      ; wygenerowano kolejną cyfre, licznik zwieksza sie o 1
  165.     mov bx,ax       ; iloraz z powrotem do bx
  166.     cmp ax,0        ; sprawdza czy iloraz jest równy zero
  167.     jne rept        ; jeśli nie, generuje kolejną CYFRE
  168.     mov ah,2        ; funkcja wyswietla znak
  169. czytaj:               ; pętla powtarza sie cx-razy
  170.     pop dx      ; umieść cyfre na stosie aby wyswietlic
  171.     or  dl,30h      ; przekonwertuj cyfre aby wyswietlic kod ASCII
  172.     int 21h     ; wyswietl znak
  173.     loop    czytaj        ;powtarzaj do momentu aż wszystki znaki z łańcucha zostana przekonwertowane
  174.  
  175.                 ;czysci rejestry
  176.     pop dx
  177.     pop cx
  178.     pop bx
  179.     pop ax
  180.     ret
  181. wejscie:
  182.     ; zapisz rejestry
  183.     push    ax
  184.     push    dx
  185.  
  186.     xor bx,bx       ; czyszczenie bx, tutaj bedzie sie znajdował input
  187.     mov ah,1        ; funkcja czytająca znak
  188.     int 21h     ; wykonaj
  189.    
  190.     cmp al,113
  191.     je koniec
  192.  
  193.     cmp al,57
  194.     ja nie_cyfra
  195.     cmp al,48
  196.     jb nie_cyfra
  197.    
  198.     mov si,1
  199. while1:    
  200.     cmp al,32       ; wyjdz z programu po wpisaniu >>> q
  201.     je koniec
  202.  
  203.     cmp si,5        ; anuluj wczytywanie jeżeli wpisano wiecej jak 6 znaków
  204.     ja poza_zakrese
  205.  
  206.     cmp al,0Dh      ; znak = CR?
  207.     je  koniec_wejscia       ; wyjdź jeżeli wczytano wszystkie znaki
  208.     push    ax      ; zapisz odczytany znak
  209.     mov ax,10       ; przygotowywanie ax do mnożenia
  210.     mul bx          ;dx:ax <- bx * 10
  211.     mov bx,ax       ; umieść 16-bitowy wynik z powrotem w bx
  212.     pop ax          ; zdejmij wczytany znak
  213.     and ax,000Fh    ; konwertuj znak '0'-'9' do wartości 0-9
  214.     add bx,ax       ; dodaj wartosc do zapisanego wejscia
  215.    
  216.     mov ah,1        
  217.     int 21h     ; zapisz kolejny znak w al
  218.     inc si      ; zwieksz si o 1
  219.  
  220.     cmp al,57      
  221.     ja nie_cyfra    ; sprwadza czy znak jest wiekszy od 57 w ASCII
  222.  
  223.     jmp while1      ; petla dopóki nie skonczy
  224. koniec_wejscia:  
  225.     ; wyczyść rejestry
  226.     pop dx
  227.     pop ax
  228.     ret
  229.  
  230. nowa_linia:
  231.     mov ah, 9h
  232.     mov dx,enter1 ;przejscie do następnej linii
  233.     int 21h
  234.     ret
  235. ;komunikaty błędu
  236. nie_cyfra:
  237.     mov ah, 9h
  238.     mov dx,komunikat5
  239.     int 21h
  240.     jmp start    
  241. poza_zakrese:
  242.     mov ah, 9h
  243.     mov dx,komunikat6
  244.     int 21h    
  245.     jmp start
  246.  
  247. koniec:
  248.  
  249.     mov ax, 4c00h
  250.     int 21h
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement