Почему мой принт не работает в основной функции?
Я кодировал программу, чтобы найти GCD двух значений. Итак, я встроил петли для распечатки шагов (что необходимо). Проблема в том, что я не распечатываю конечный результат, я думаю, это потому, что мои циклы не возвращают что-то, даже если в нем есть операторы return. Может кто-нибудь заметить мою проблему, или мне нужно добавить больше операторов return, чтобы "вырваться" из gcd-метода, чтобы вернуться к main-методу? (он не предназначен для редактирования метода main или функции print - только метод gcd)
Код:
; main-Method
BIPUSH 0 // OBJREF
INVOKEVIRTUAL main
HALT
; main-Method
main 1 2 // Arguments 0 = OBJREF, loc. variables 1 = a, 2 = b
BIPUSH 15 // a
ISTORE 1
BIPUSH 50 // b
ISTORE 2
BIPUSH 0
ILOAD 1
ILOAD 2
INVOKEVIRTUAL gcd
; print
ILOAD 2
ILOAD 1
SPRINT "Result: gcd("
IPRINT
SPRINT ","
IPRINT
SPRINT ") = "
IPRINT
SPRINT "\n"
IRETURN
; gcd(a, b)
; 2 Arguments (#1=a, #2=b), no local variables
gcd 3 0
;;;
# Call of the method;
SPRINT "Call gcd("
ILOAD 1
IPRINT
SPRINT ","
ILOAD 2
IPRINT
SPRINT ")\n"
# if(a == b);
:IF1
POP
POP
POP
ILOAD 1
ILOAD 2
IF_ICMPEQ END1
GOTO IF2
# if(a > b);
:IF2
ILOAD 1
ILOAD 2
ISUB
IFLT END3
GOTO IF3
# if(a < b);
:IF3
ILOAD 2
ILOAD 1
ISUB
IFLT END2
# return a;
:END1
BIPUSH 0
ISTORE 0
ILOAD 1
ISTORE 0
POP
POP
POP
POP
GOTO RECURSIVEPRINT
# return gcd(a-b, b);
:END2
ILOAD 1
ILOAD 2
ISUB
ISTORE 1
ILOAD 1
ILOAD 2
GOTO METHOD
# return gcd(b-a, a);
:END3
ILOAD 2
ILOAD 1
ISUB
ISTORE 2
SWAP
ILOAD 1
ILOAD 2
GOTO METHOD
:METHOD
INVOKEVIRTUAL gcd
ISTORE 0
GOTO OUT
:OUT
IRETURN
:END
ILOAD 0
IRETURN
:RECURSIVEPRINT
ILOAD 1
IFEQ DELETESTACK
ILOAD 2
IFEQ DELETESTACK
SPRINT "Recursive gcd("
ILOAD 1
IPRINT
SPRINT ","
ILOAD 2
IPRINT
SPRINT ") = "
ILOAD 0
IPRINT
SPRINT "\n"
ISTORE 2
ISTORE 1
GOTO RECURSIVEPRINT
:DELETESTACK
POP
POP
ISTORE 2
ISTORE 1
GOTO LASTRECURSIVE
:LASTRECURSIVE
SPRINT "Recursive gcd("
ILOAD 1
IPRINT
SPRINT ","
ILOAD 2
IPRINT
SPRINT ") = "
ILOAD 0
IPRINT
SPRINT "\n"
IRETURN
GOTO END
Ожидаемые результаты:
Call gcd(15,50)
Call gcd(35,15)
Call gcd(20,15)
Call gcd(5,15)
Call gcd(10,5)
Call gcd(5,5)
Recursive gcd(5,5) = 5
Recursive gcd(10,5) = 5
Recursive gcd(5,15) = 5
Recursive gcd(20,15) = 5
Recursive gcd(35,15) = 5
Recursive gcd(15,50) = 5
Result: gcd(15,50) = 5
Фактические результаты:
Call gcd(15,50)
Call gcd(35,15)
Call gcd(20,15)
Call gcd(5,15)
Call gcd(10,5)
Call gcd(5,5)
Recursive gcd(5,5) = 5
Recursive gcd(10,5) = 5
Recursive gcd(5,15) = 5
Recursive gcd(20,15) = 5
Recursive gcd(35,15) = 5
Recursive gcd(15,50) = 5