2009-12-02 1 views
1

Мой самый близкий друг переживает Е.Е. курс (я его последняя надежда: /), у меня есть знание Java от около 7 лет назад, но его (outline) latest EE programming assignment is to use the MIPS Assembly to do the following:MIPS Назначение Ассамблеи ПОМОЩЬ!

Напишите программу, которая принимает два положительных целых чисел (т и n) и вычисляет:

x= (m^n) - (1+2+3+…+n) * min(m,n)! 

Оба целых числа должны быть больше нуля. Мне не разрешено использовать любые арифметические инструкции R-типа (add, mult, sub). Вместо этого я должен написать код для своих функций, используя другие инструкции ???? «Ваша программа должна продолжать получать новые значения для m и n после каждого вычисления до тех пор, пока пользователь не войдет в нуль, который будет конечным для вашей программы».

У меня нет доступа к каким-либо из его предыдущих заданий и попытка погружения головы 1 на язык ассемблера БЕЗ использования (добавить, мульти, суб) не работает для меня слишком хорошо.

ece.ucdavis.edu/~vojin/CLASSES/EEC70/W2001/pr4.pdf Профессор, по-видимому, использовал назначение ols, когда преподавал в UC Davis.

// редактировать Вот с ++ версия этой проблемы, она не охватывает все базы уступки, но это отправная точка:

#include <iostream.h> 

//x = (m^n) - (1+2+3+...+n) * ((min(m,n))!) 
int m; //User Input 
int n; //User Input 
double answer; //Answer yo. 

int findMin(int, int); //Takes 2 int inputs and outputs the smallest int. 
int minFound; //Function output 

double factorial(int); //Do eet. 
double factOutput; //Function output 

double sumN(int); //1+2+3+...+n 
double sumFound; //Function output 

double expMtoN(int, int); //m^n, float for number size, 
double expFound; //Function output, float for number size, 

int main(void) 
{ 
    cout << "Please enter a positive integer (m): "; 
    cin >> m; 

    //Escape if zero. 
    if (m == 0) 
    { 
     cout << "User input for \"m\" is equal to zero; escape on zero." << endl; 
     return 0; 
    } 

    cout << "Please enter a positive integer (n): "; 
    cin >> n; 

    //Escape if zero. 
    if (n == 0) 
    { 
     cout << "User input for \"n\" is equal to zero; escape on zero." << endl; 
     return 0; 
    } 

    expFound = expMtoN(m, n);  //m^n 
    sumFound = sumN(n);    //1+2+3+...+n 
    minFound = findMin(m, n);  //Takes 2 int inputs and outputs the smallest int. 
    factOutput = factorial(minFound); //Factorial math for minFound (z!) 

    answer = expFound - sumFound * factOutput; //x = (m^n) - (1+2+3+...+n) * ((min(m,n))!) 

    cout << endl; 
    cout << m << " raised to the power of " << n << " is: " << expFound << endl; 
    cout << "Sum of " << n << " is: " << sumFound << endl; 
    cout << "Lowest number out of " << m << " and " << n << " is: " << minFound << endl; 
    cout << minFound << " factorial is: " << factOutput << endl; 

    cout << endl << "x = (m^n) - (1+2+3+...+n) * ((min(m,n))!)" << endl; 
    cout << "x = " << answer << endl; 
} 

//all temp variables below are confined to their respective functions. 
//return functions output temp into variable from main. 

double expMtoN(int userBase, int userExp) 
{ 
    double temp = 1; //Must establish 1 so you are not multiplying by zero. 

    for (int i = 1; i <= userExp; i++) 
     temp *= userBase; 

    return temp; 
} 

double sumN(int userN) 
{ 
    double temp = 0; 

    for (int i = 1; i <= userN; i++) 
     temp = temp + i; 

    return temp; 
} 

int findMin(int userM, int userN) 
{ 
    if(userM <= userN) 
     return userM; 
    else 
     return userN; 
} 

double factorial(int minFound) 
{ 
    double temp; 

    if (minFound <= 1) 
     return 1; 

    temp = minFound * factorial(minFound - 1); 

    return temp; 
} 

Input.s


;----------------------------------------------------------------------------- 
;Subprogram call by symbol "InputUnsigned" 
;expect the address of a zero-terminated prompt string in R1 
;returns the read value in R1 
;changes the contents of registers R1,R13,R14 
;----------------------------------------------------------------------------- 

    .data 

    ;*** Data for Read-Trap 
ReadBuffer: .space 80 
ReadPar: .word 0,ReadBuffer,80 

    ;*** Data for Printf-Trap 
PrintfPar: .space 4 

SaveR2: .space 4 
SaveR3: .space 4 
SaveR4: .space 4 
SaveR5: .space 4 


    .text 

    .global InputUnsigned 
InputUnsigned: 
    ;*** save register contents 
    sw SaveR2,r2 
    sw SaveR3,r3 
    sw SaveR4,r4 
    sw SaveR5,r5 

    ;*** Prompt 
    sw PrintfPar,r1 
    addi r14,r0,PrintfPar 
    trap 5 

    ;*** call Trap-3 to read line 
    addi r14,r0,ReadPar 
    trap 3 

    ;*** determine value 
    addi r2,r0,ReadBuffer 
    addi r1,r0,0 
    addi r4,r0,10 ;Decimal system 

Loop: ;*** reads digits to end of line 
    lbu r3,0(r2) 
    seqi r5,r3,10 ;LF -> Exit 
    bnez r5,Finish 
    subi r3,r3,48 ;´0´ 
    multu r1,r1,r4 ;Shift decimal 
    add r1,r1,r3 
    addi r2,r2,1 ;increment pointer 
    j Loop 

Finish: ;*** restore old register contents 
    lw r2,SaveR2 
    lw r3,SaveR3 
    lw r4,SaveR4 
    lw r5,SaveR5 
    jr r31 ; Return
+5

Мне нравится, что вы спрашиваете здесь, как последняя надежда вашего друга ... вместо вашего друга, спрашивающего здесь прямо ... – mrduclaw

+1

Спасибо, mrduclaw.Мой друг не знает о таких сайтах, и обстоятельства из-под его контроля заставили его попросить меня о помощи. Задача, которая оказалась больше, чем я могу справиться, поэтому я обращаюсь к этому сообществу за помощью. Смажьте на C++ ... но у меня нет земной идеи, как конвертировать то, что я написал на машинный язык MIPS. Я не могу обернуть голову тем, как передавать переменные и получать обратно данные из удаленных функций, не говоря уже о том, как сделать базовый add() sub() mult() без использования их R-типов. Также не удается создать цикл до тех пор, пока пользователь не войдет в ноль:/ – 2009-12-02 13:25:02

+1

Почему факториал возвращает двойной? – Tom

ответ

2

К сожалению, если это код C, то код MIPS будет как минимум на 4 раза длиннее этого и намного дольше с учетом ограничений. Этот код может занять некоторое время, но я могу дать псевдопроход:

x = (m^n) - (1 + 2 + 3 + ... + n) * min (m, n)!

Прежде всего, как и на любом другом языке программирования, мы должны разделить нашу задачу на максимально возможное количество методов. В MIPS мы хотим разделить задачу на как можно больше «процедур» (меток). Мы уже можем видеть, что нам понадобится процедура для экспоненциальных, факториалов и т. Д. Начнем с m^n. Мы не можем использовать mult, так как это R-тип, но мы можем использовать multi, который является I-типом. Мы можем использовать все непосредственные I-типы в качестве замены этого задания. Таким образом, мы могли бы сделать: multi m, m, например, в цикле for и делать это n раз, давая m^n (на каждой итерации мы бы перенесли результаты из множителей регистров Hi и Lo, используя инструкции mfhi и mflo, для расчета, чтобы они не перезаписывались). Это будет наша первая процедура.

Теперь мы рассмотрим 1 + 2 + 3 + ... + n. Это не так уж плохо, мы просто продолжаем использовать addi (команду add типа I, которая добавляет «постоянные» константы в регистр), такие как addi $ s1, $ s1, b, где a равно 1, которое увеличивается в и добавляется к результату n раз, получая таким образом 1 + 2 + 3 + ... + n.

Наконец, нам нужна другая процедура, чтобы умножить это на min (m, n) !. Factorial является рекурсивным, поэтому нам понадобится рекурсивная процедура, которая вызывает себя и хорошо использует стек памяти и регистрирует разлив (IE сначала сохраняет аргументы процедуры и возвращает адрес в стек, снова вводит тело, сам вызов). Я думаю, этого достаточно, чтобы вы начали. Не уверен, когда это задание, но удачи!

+1

Хороший ответ necro. Но я действительно сомневаюсь, что это стоило усилий :((В любом случае, я проголосую за вас, чтобы показать свое сочувствие, и потому, что вы хотите, чтобы репутация была такой трудной ;-) – hirschhornsalz

+1

Спасибо! Я понял, что представление было очень старым, но этот ответ может быть полезным для других, которые могут иметь тот же вопрос в будущем, поскольку такие проекты популярны =) – quicksort

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

  • Нет связанных вопросов^_^