2017-02-23 13 views
-1

Нужна помощь в преобразовании этого кода C в сборку LEGv8. (Домашнее задание)Перевести рекурсивную программу C на сборку LEGv8

unsigned long long f(unsigned long long a[], int n) { 
    if (n == 0) return a[n]; 
    return a[n] + f(a, n - 1); 
} 

Я смутно знакомы с написанием основных функций в сборке LEGv8, но рекурсия аспект бросает меня.

Заранее спасибо.

+1

Пожалуйста, взгляните на [Как я могу задать и ответить на домашние вопросы?] (Http://meta.stackoverflow.com/questions/334822/how-do-i-ask-and-answer-homework-questions) – yeputons

ответ

0

Как ваша задача - сделать то, что делают компиляторы (перевести C в сборку), вам не нужно знать, что это рекурсивно. Компилятор C тоже не знал.

Чтобы решить, использует ли источник рекурсию, проблема IMHO NP-complete, так же как решить, содержит ли код бесконечный цикл и другие NP-полные задачи, поэтому компиляторы даже не утруждают себя попыткой оценить такое свойство , и они, безусловно, могут скомпилировать подобный код без этой информации.

Хотя в таком простом случае они бы, вероятно, заметили, и, возможно, оптимизировать что разворачивая несколько звонков или оценить вещь в постоянная для достаточно малых входов, это один хороший кандидат для перевода в for цикла подведения n элементов массива a, но это опять не ваше дело в этой задаче.

Так что, если только рекурсия отбрасывает вас, то забудьте, что это рекурсия, и просто скомпилируйте ее на языке ассемблера, как есть, по строкам, инструкции по инструкции.

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