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