Почему мой принт не работает в основной функции? - PullRequest
0 голосов
/ 09 апреля 2019

Я кодировал программу, чтобы найти GCD двух значений.Итак, я встроил петли для распечатки шагов (что необходимо).Проблема в том, что я не распечатываю конечный результат, я думаю, это потому, что мои циклы не возвращают что-то, даже если в нем есть операторы return.Может кто-нибудь заметить мою проблему, или мне нужно добавить больше операторов return, чтобы «вырваться» из gcd-метода, чтобы вернуться к main-методу?(он не предназначен для редактирования основного метода или функции печати - только 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 
...