В этом текущем примере, выше которого я написал, я использовал 80 как n. Мой вывод равен n = 91, а count = 42. Это также известно как McCarthy 91. Однако теперь я хотел бы использовать этот код в языке ассемблера (MIPS). Есть ли у кого-нибудь советы о том, как это можно сделать? Я никогда не занимался созданием программы типа рекурсии в MIPS. Ниже я предоставил свой рабочий код python и мой код сборки с комментариями, которые находятся в процессе написания ниже кода python. Любые советы/помощь, безусловно, будут оценены с помощью кода сборки.Перевод кода Python на сборку
Python код:
def mcc91(n):
global count
count +=1
if n > 100:
return n -10
else:
return mcc91 (mcc91(n + 11))
def main():
print mcc91(80)
print count
main()
MIPS ПРОГРАММА
.data
p1:
.asciiz "What is integer n? "
ans1:
.asciiz "\nn is "
ans2:
.asciiz "\nCount is "
.text
.globl main
main:
li $v0, 4 # system call code for print_str
la $a0, p1 # address of string to print
syscall # print the first prompt
li $v0, 5 # system call code for read_int
syscall # read the first integer
move $t1, $v0 # and store it 'till later
li $t9, 0 #tracks count
loop1:
bgt $t1, 100, target1
add $t1, $t1, 11 #adds 11 when under 100
add $t9, $t9, 1 #add 1 to count
Loop1(loop1 #cluless how to do this
target1:
sub $t1, $t1, 10 #subtracts 10 when over 100
add $t9, $t9, 1 #add 1 to count
#j done #cluless here also(how many stacks in is it? If 0, jump to done)
done:
#THIS PRINTS N
li $v0, 4 # system call code for print_str
la $a0, ans1 #address of string to print
syscall # print the answer identifying string
li $v0, 1 # system call code for print_int
move $a0, xxxxx # integer to print (sum)
syscall # print it
#THIS PRINTS Count
li $v0, 4 # system call code for print_str
la $a0, ans2 # address of string to print
syscall # print the answer identifying string
li $v0, 1 # system call code for print_int
move $a0, xxxxx # integer to print (difference)
syscall # print it
jr $ra # return from this program to the system
Вы тот же человек, который задал этот вопрос без кода MIPS, а затем удалили вопрос, как только получили ответ? Или у вас есть несколько человек, которые берут класс, который все застрял на том же, что профессор не смог объяснить? – abarnert
В любом случае, ответ, который я дал там, тот же: выберите [конвенция о вызове] (http://en.wikipedia.org/wiki/Calling_convention), которая разрешает повторное использование, используя стек как [стек вызовов] (http://en.wikipedia.org/wiki/Call_stack). Тогда вызов себя рекурсивно - это точно так же, как вызов любой другой функции (как и в Python). Вот и все. – abarnert
@abarnert эта программа выполняется более 100 учениками моего университета. Однако вы могли бы привести еще один пример? –