;
; Ez a program ket szam legnagyobb kozos osztojat keresi meg.
;
; Kiss Endre Farkas
; ELTE IK, matematika-informatika tanar
;
; Programozasi nyelvek 2

.model tiny
.data
szoveg1 db 'Ket szam legnagyobb kozos osztojanak a meghatarozasa',0ah,0dh
      db 'Kiss Endre Farkas (KIELAAT.elte)', '$'
szoveg2 db 'Az LNKO-ja a(z) $'
szoveg3 db ' es $'
szoveg4 db ' szamoknak ennyi: $'
szoveg5 db 0ah,0dh,'$'
szoveg6 db 'Kerem A-t:$'
szoveg7 db 'Kerem B-t :$'
szoveg8 db 'Szeretned folytatni?(I/N):$'
.stack 64
.code
START:   MOV AX,@DATA
         MOV DS,AX
         MOV DX,OFFSET SZOVEG1    ; Megmutatjuk a bekoszono uzenetet
         CALL SZOVEGMUTAT

FOLYTATAS:CALL UJSOR
         CALL UJSOR               ;UJ SOR
         MOV DX, OFFSET SZOVEG6   ;A parancssori bekerese
         CALL SZOVEGMUTAT
         CALL BEDECIMALIS         ;B bekerese
         CALL UJSOR               ;UJ SOR
         MOV BX,AX                ;A elraktarozasa BX-be
         MOV DX, OFFSET SZOVEG7   ;B parancssori bekerese
         CALL SZOVEGMUTAT
         CALL BEDECIMALIS         ;B bekerese
         CALL UJSOR               ;UJ SOR
         CALL OSZTOMUTAT          ;Megjelenitjuk kettejuk legnagyobb kozos osztojat
         MOV DX, OFFSET SZOVEG8   ;FOLYTATAS?
         CALL SZOVEGMUTAT
KERDES:   MOV AH,8
         INT 21H
         CMP AL,'i'
         JE FOLYTATAS             ;Ha i, akkor FOLYTATAS
         CMP AL,'I'
         JE FOLYTATAS             ;Ha I, akkor FOLYTATAS
         CMP AL,0DH               ;Ha ENTER-t utunk, akkor FOLYTATAS 
         JE FOLYTATAS  
         CMP AL,'n'               ;Ha n, akkor kilepes
         JE VEGE
         CMP AL,'N'               ;Ha N, akkor kilepes
         JE VEGE
         JMP KERDES               ;Ugras a KERDES-hez.

VEGE:     MOV AX,4C00H            ;kilepes
         INT 21H
;
;
;FUGGVENY UJSOR
;Bejovo adatok:SEMMI
;Visszaadott ertek:SEMMI
;Eredmeny:A kurzort uj sorba mozgatjuk
UJSOR PROC
         PUSH AX
         PUSH DX
         MOV DX, OFFSET SZOVEG5
         MOV AH,9     ;Megjelenitjuk az uzenetet a kepernyon
         INT 21H
         POP DX
         POP AX
         RET
         ENDP
;
;
;FUGGVENY BEDECIMALIS
;Bejovo adatok:SEMMI
;VISSZAADOTT ERTEK AX: Decimalis szam, pont pl. 345
;           ENTER-rel lehet kilepni a fuggvenybol
BEDECIMALIS  PROC
        PUSH BX
        PUSH CX
        PUSH DX            ; Regiszterek megtartasa
BEDECIMALIS0:MOV BX,0      ; BX-nek 0 erteket adunk
        MOV CX,10          ; CX-nek 10 erteket adunk
        MOV AH,8
        INT 21H            ; Bekerjuk az elso karaktert
        CMP AL,'+'         ; Ha ez nem + karakter
        JNE H001
        MOV DL,AL          ; Ha ez + karakter, jelenitsuk meg a kerepnyon
        MOV AH,2
        INT 21H
        JMP BEDECIMALIS1; majd bekerjuk a szamot
H001:   CMP AL,'-'
        JNE G002           ; Ha ez nem -, akkor JMP (ugras) G002-re
        MOV DL,AL          ; kulonben jelenitsuk meg a kepernyon
        MOV AH,2
        INT 21H
        JMP BEDECIMALIS1
G002:   CMP AL,'0'         ; Ha nem 0 es 9 kozott van, akkor ujra bekerjuk
        JL  BEDECIMALIS0
        CMP AL,'9'
        JG BEDECIMALIS0
        JMP BEDECIMALIS4   ; Ha ez egy szamjegy, elfogadjuk a bevitelt.
BEDECIMALIS1:MOV AH,8      ; Bekerunk egy 0 es 9 kozotti szamot karakter-visszakuldes nelkul
        INT 21H
BEDECIMALIS3:
        CMP AL,0DH ; Ha ENTER-t utunk akkor vege
        JE BEDECIMALIS2

        CMP AL,'0'         ;Ha kisebb, mint 0, ujra bekerjuk
        JL BEDECIMALIS1
        CMP AL,'9'         ;Ha nagyobb, mint '9', ujra bekerjuk
        JG BEDECIMALIS1
BEDECIMALIS4: MOV DL,AL    ;Megjelenitjuk a kepernyon, mit irunk eppen be.
        MOV AH,2
        INT 21H
        MOV DH,0  ;DH kitorlese
        SUB DL,30H         ;Megkapjuk a 0-9 közötti bináris számunkat
        MOV AX,BX          ;BX,A belső bináris szám, amit megadtunk
        PUSH DX            ;DX elraktarozasa a verembe
        MOV DX,0           ;DX kitorlese
        IMUL CX
        POP DX             ;DX visszaallitasa
        ADD AX,DX          ;Hosszaadjuk DL-t AX-hez
        MOV BX,AX          ;Az osszeg eltarolasa BX-ben
        JMP BEDECIMALIS1   ;ismetles
BEDECIMALIS2:
        MOV AX,BX          ;megkapjuk az bemeneti szamot BX-bol
        CMP AX,0           ;Ha ez 0, akkor ujra be kell kerni
        JE BEDECIMALIS0
        POP DX             ;regiszter visszaallitasa
        POP CX
        POP BX
        RET
        ENDP

;
;
;FUGGVENY OSZTOMUTAT
;bemeneti parameter
;      AX:Y
;      BX:X
;Kimenet:Megmutatja X és Y LNKO-jat a kepernyon

OSZTOMUTAT PROC
           PUSH DX
           MOV DX,OFFSET SZOVEG2
           CALL SZOVEGMUTAT
           CALL SzamMutat
           MOV DX,OFFSET SZOVEG3
           CALL SZOVEGMUTAT
           PUSH AX
           MOV AX,BX
           CALL SzamMutat
           POP AX
           CALL LNKO
           MOV DX,OFFSET SZOVEG4
           CALL SZOVEGMUTAT
           CALL SzamMutat
           MOV DX,OFFSET SZOVEG5
           CALL SZOVEGMUTAT
           POP DX
           RET
           ENDP
;
;
;fuggveny LNKO
;bemeneti parameter:
;      BX: A pozitiv szamkent
;      AX: B pozitiv szamkent
;kimeneti eredmeny
;       AX:A es y LNKO-ja

LNKO        proc
           push cx
           push dx
           call ABSZOLUT0    ;ABS(b)
           push ax           ;push(b)
           mov ax,bx         ;AX<-a
           call ABSZOLUT0    ;AX<-ABS(a)
           pop bx            ;BX<-b
CIKLUS:     mov dx,0h
           idiv bx           ;(DX:AX)/BX=a/b akkor,
                             ;AX=Hanyados,DX=maradek
           mov ax,bx         ;y mozgatasa a-hoz
           mov bx,dx         ;maradek leptetese b-hez
           mov dx,0
           cmp bx,0
           jg  CIKLUS
           pop dx
           pop cx
           ret
           endp
;
;
;fuggveny ABSZOLUT0
;bemeneti parameter:
;      AX: a erteke, mint egesz szam
;kimeneti eredmeny:
;      AX: a abszolut erteke.
ABSZOLUT0 PROC
          cmp ax,0
          jge ABSZOLUT1
          not ax   ;ha ax<0 akkor ax = ax -1
          inc ax
ABSZOLUT1:
          ret
          endp
;
;
;Fuggveny:SzamMutat
;bemeneti parameter:
;      AX:a szam, ami megjelenik a kepernyon
;Kimenet:Semmi, csak megjeleniti a DECIMALISis szamot a kepernyon
SzamMutat PROC
           PUSH DX
           PUSH CX
           PUSH BX
           PUSH AX
           MOV CX,0
           MOV DX,0
           MOV BX,10
DISP1:     IDIV BX
           PUSH DX     ;a maradekot a veremben taroljuk
           MOV  DX,0
           INC CX      ;megnoveljuk cx-et 1-gyel
           CMP AX,0
           JNE DISP1
DISP2:     CMP CX,0
           JE DISP3
           POP DX      ;kiszedjuk a szamot a verembol
           DEC CX      ;csokkentjuk cx-et 1-gyel
           ADD DL,'0'  ;ASCII kod-ba alakitjuk
           MOV AH,02   ;kiirjuk a kepernyore
           INT 21H
           JMP DISP2
DISP3:     POP AX
           POP BX
           POP CX
           POP DX
           RET
           ENDP
;
;
;Fuggveny:SzovegMutat
;bemeneti parameter:
;      DX:a szoveg eltolasa
;Kimenet:Semmi, csak megjeleniti a szoveget a kepernyon
SZOVEGMUTAT PROC
          PUSH AX
          MOV  AH,9
          INT 21H
          POP AX
          RET
          ENDP
          END START



