【问题标题】:MIPS Assembly assignment HELP!MIPS 组装作业 帮助!
【发布时间】:2009-12-02 08:42:37
【问题描述】:

我最亲密的朋友正在学习 EE 课程(我是他最后的希望:/),我大约 7 年前就了解 Java,但他的 (outline) latest EE programming assignment is to use the MIPS Assembly to do the following:

编写一个程序,接受两个正整数(m 和 n)并计算:

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

这两个整数都应该大于零。 我不允许使用任何 R 类型的算术指令(add、mult、sub)。相反,我要使用其他指令为其功能编写代码???? “您的程序应在每次计算后继续获取 m 和 n 的新值,直到用户输入零,这将是您的程序的结束。”

我无权访问他以前的任何作业,并且尝试在不使用 (add, mult, sub) 的情况下首先进入汇编语言对我来说效果不佳。

ece.ucdavis.edu/~vojin/CLASSES/EEC70/W2001/pr4.pdf 教授似乎在使用他在加州大学戴维斯分校任教时的 ols 作业。

//编辑 这是问题的 c++ 版本,它没有涵盖所有赋值的基础,但它是一个起点:

#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;
}

输入.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 

【问题讨论】:

  • 我喜欢你在这里问作为你朋友的最后希望......而不是你的朋友直接在这里问......
  • 谢谢mrduclaw。我的朋友不知道这样的网站,他无法控制的情况迫使他向我寻求帮助。事实证明,这项任务超出了我的能力范围,因此我向这个社区寻求帮助。复习 C++ ......但我不知道如何将我写的内容转换为 MIPS 机器语言。我无法理解如何将变量传递给远程函数并从远程函数接收数据,更不用说如何在不使用它们的 R 类型的情况下执行基本的 add() sub() mult() 了。在用户输入零之前也无法创建循环:/
  • 为什么阶乘返回双精度?
  • 给 C++ 版本扩展的返回大小。 In 进入 int(希望用户的数字更小)和 out 出现双倍(以防万一)

标签: assembly mips


【解决方案1】:

不幸的是,如果那是 C 代码,那么 MIPS 代码将至少比这长 4 倍,并且考虑到限制,更长。这段代码可能需要一段时间,但我可以给出一个伪演练:

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

首先让我们注意,就像在任何其他编程语言中一样,我们应该将我们的任务划分为尽可能多的方法。在 MIPS 中,我们希望将任务划分为尽可能多的“过程”(标签)。我们已经可以看到,我们需要一个指数、阶乘等过程。我们从 m^n 开始。我们不能使用mult,因为它是R-type,但我们可以使用multi,它是I-type。我们可以使用所有的直接 I 类型来代替这个赋值。所以我们可以这样做: multi m,m 例如在一个 for 循环中并执行 n 次,给出 m^n (在每次迭代中,我们将使用指令 mfhi 和 mflo 将结果从乘法寄存器 Hi 和 Lo 中移出,用于计算,因此它们不会被覆盖)。这将是我们的第一个程序。

现在我们看看 1+2+3+...+n。这还不算太糟糕,我们只是继续使用 addi(类型 I 的 add 指令,将“立即”常量添加到寄存器),例如 addi $s1,$s1,b,其中 a 为 1,在 a 中递增循环并添加到结果 n 次,从而得到 1+2+3+...+n。

最后,我们需要另一个过程来将它乘以 min(m,n)!。阶乘是递归的,所以我们需要一个递归过程来调用自身并充分利用内存堆栈和寄存器溢出(IE 首先将过程参数和返回地址保存到堆栈上,进入主体,再次调用自身)。我认为这足以让你开始。不知道作业什么时候到期,但祝你好运!

【讨论】:

  • 不错的死灵答案。但我真的怀疑这是否值得努力:-(无论如何我投票给你是为了表达我的同情,因为你想要那个代表那么努力;-)
  • 谢谢!我意识到提交的内容很老了,但是这个答案可能对将来可能有同样问题的其他人有用,因为像这样的项目很受欢迎 =)
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
相关资源
最近更新 更多