2014-10-27 3 views
0

В этом текущем примере, выше которого я написал, я использовал 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 
+0

Вы тот же человек, который задал этот вопрос без кода MIPS, а затем удалили вопрос, как только получили ответ? Или у вас есть несколько человек, которые берут класс, который все застрял на том же, что профессор не смог объяснить? – abarnert

+1

В любом случае, ответ, который я дал там, тот же: выберите [конвенция о вызове] (http://en.wikipedia.org/wiki/Calling_convention), которая разрешает повторное использование, используя стек как [стек вызовов] (http://en.wikipedia.org/wiki/Call_stack). Тогда вызов себя рекурсивно - это точно так же, как вызов любой другой функции (как и в Python). Вот и все. – abarnert

+0

@abarnert эта программа выполняется более 100 учениками моего университета. Однако вы могли бы привести еще один пример? –

ответ

0

Compile питон С, а затем использовать компилятор C вашего выбора, чтобы получить его до сборки.

Смежные вопросы