GGT-Berechnung


; Programm zur Berechnung des GGTs zweier Zahlen
; Clemens Adolphs, Immanuel-Kant-Gymnasium Heiligenhaus, Mai 2003
; nicht-rekursive Version

JMP Anfang

TRUE:  DEF 1             ; globale Variablen
FALSE: DEF -1
X:     DEF 0
Y:     DEF 0
R:     DEF 0
NULL:  DEF 0

isTeiler:
  PSH                     ;Platz fuer lokale Variable
  zwischen EQUAL 1
  dividend EQUAL 4
  divisor  EQUAL 3
  RUECK    EQUAL 5
  LDAS dividend
  STAS zwischen           ;Dividend zwischenspeichern, damit das
                          ;Original nicht veranedert wird
  schleife1:
    LDAS zwischen
    SUBS divisor
    STAS zwischen
    JZE Teiler
    JMS keinTeiler
    JMP schleife1

  Teiler:
    LDA TRUE
    STAS RUECK
    JMP EndIf

  keinTeiler:
    LDA FALSE
    STAS RUECK

  EndIf:
  POP
RTN

ggt:
  PSHM NULL   ;Ergebnis 1
  PSHM NULL   ;Ergebnis 2
  PSHM NULL   ;Zaehler
  Zaehler EQUAL 3
  R1      EQUAL 2
  R2      EQUAL 1
  Z1      EQUAL 6
  Z2      EQUAL 5
  gT      EQUAL 7   ;gT = Rueckgabewert von ggT
  LDAS Z1
  STAS Zaehler      ;wir fangen bei der ersten Zahl an

  schleife2:
  SPBP   ;wichtig: da fuer Funktionen Platz reserviert wird, aendert sich
         ;der SP. Deshalb muss fuer lokale Variablen der BP verwendet werden
    PSH  ;Platz fuer Rueckgabewert
    LDAB Z1
    PSH  ;Parameter
    LDAB Zaehler
    PSH  ;Parameter
    JSR isTeiler
    POP
    POP
    POP
    STAB R1 ;Rueckgabewert in lok. Variable speichern

    PSH     ;Platz fuer Rueckgabewert
    LDAB Z2
    PSH     ;Parameter
    LDAB Zaehler
    PSH     ;Parameter
    JSR isTeiler
    POP
    POP
    POP
    STAB R2 ;Rueckgabewert in lok.Variabe speichern
    LDAB R1 ;Die Rueckgabewerte addieren. NUR wenn BEIDE wahr sind (=1)
    ADDB R2 ;ist das Ergebnis positiv.
    JPL gefunden

    LDAB Zaehler  ;mit der naechstkleineren Zahl weitermachen
    DEC
    STAB Zaehler
    JMP schleife2

  gefunden:
    LDAB Zaehler
    STAB gT     ;Rueckgabewert speichern
    POP         ;lok. Variablen toeten
    POP
    POP
RTN


Anfang:
INM X   ;Zahlen einlesen
INM Y
PSH     ;Platz fr Rueckgabewert
PSHM X  ;Parameter auf den Stack packen
PSHM Y
JSR ggT
POP
POP
POP
STA R   ;Rueckgabewert auslesen und ausgeben
OUT R
END