Fix ggt and write tests
This commit is contained in:
@@ -1,22 +1,26 @@
|
||||
// Quellkode: ggt(a,b) { if (b==0) then a else ggt(b, a mod b) }
|
||||
// Annahmen: Die Argumente a und b werden durch Kellerzellen 0 und 1 repräsentiert,
|
||||
// sowie PP=0, FP=0 und TOP=-1
|
||||
INVOKE 2 LGGT 0
|
||||
POP
|
||||
INVOKE 2 GGT 0
|
||||
HALT
|
||||
|
||||
LGGT:
|
||||
// b
|
||||
GGT: LOAD 1 0
|
||||
IFZERO RET
|
||||
LOAD 1 0
|
||||
// if b != 0 -> 1
|
||||
IFZERO 1
|
||||
// return a
|
||||
LOAD 0 0
|
||||
RETURN
|
||||
L1:
|
||||
LOAD 1 0 // b
|
||||
LOAD 0 0
|
||||
LOAD 1 0
|
||||
MOD // a mod b
|
||||
INVOKE 2 LGGT 0 // ggt(b, a mod b)
|
||||
INVOKE 2 MOD 1
|
||||
INVOKE 2 GGT 0
|
||||
RETURN
|
||||
|
||||
RET: LOAD 0 0
|
||||
RETURN
|
||||
|
||||
MOD: LOAD 0 0
|
||||
LOAD 1 0
|
||||
LOAD 0 0
|
||||
LOAD 1 0
|
||||
DIV
|
||||
MUL
|
||||
SUB
|
||||
RETURN
|
||||
@@ -3,10 +3,11 @@
|
||||
INVOKE 2 MOD 0
|
||||
HALT
|
||||
|
||||
MOD: LOAD 1 0
|
||||
MOD: LOAD 0 0
|
||||
LOAD 1 0
|
||||
LOAD 0 0
|
||||
LOAD 1 0
|
||||
DIV
|
||||
LOAD 2 0
|
||||
MUL
|
||||
SUB
|
||||
RETURN
|
||||
|
||||
Reference in New Issue
Block a user