如何在没有main的情况下运行MIPS程序并从C程序中调用MIPS程序

时间:2015-11-22 08:36:01

标签: c mips mips32

很长的问题,对不起提前。好吧,所以我正在处理一些不寻常的限制因素,这就是为什么到目前为止我还没有在网上找到太多帮助。主要的限制是我不能使用模拟器,因此我不能使用系统调用。我需要用MIPS和C做一些事情,并且不太了解如何执行这些程序以了解如何让它们以我需要的方式工作。 首先,根据我教授的指示,我需要创建一个名为“rng.s”的文件。他还指出它应该以下面的代码开头:

.abicalls
.option pic0
.globl rng, seed
.set nomips16

据我了解,这意味着我正在创建两个函数“rng”和“seed”,我不需要创建一个main函数。在为早期作业提供的模板中,有一些代码如下所示:

.ent main
.type main, @function

我不确定我是否需要在这里使用我的函数rng和seed做类似的事情。此外,当我不包括main时,汇编程序会返回错误。稍后在作业中,我应该编写一个调用函数rng()的C程序(与我的MIPS程序中编写的相同)并传递一些值。我不太明白如何从我的C程序内部调用rng()。起初我尝试过这样:

#include<stdio.h>

int main(int argc, char* argv[])
{
    //int a, b, c are input from command line using atoi(argv)
    //i've tested it and that part works fine, so it's not important
    rng(a, b, c);
    return 0;
}

我的教授包含一个Makefile,它应该将两个程序编译成一个可执行文件,但如果我尝试使用它,我会收到一个错误,因为有多个main声明。

所以最大的问题是如何让我的MIPS程序在没有main的情况下运行? 然后如何在我的C程序中调用MIPS程序中的函数?

我已经在这上花了两天时间而且我已经无处可去了,所以任何帮助都会非常感激。谢谢。

1 个答案:

答案 0 :(得分:0)

好的,所以我花了一段时间,但我终于得到了答案。我知道很多这可能很简单,但我只是为了那些和我一样困惑的可怜的灵魂而把它放在那里。所以这就是我在两个问题中找到的:

1:如何在没有主

的情况下运行我的MIPS程序

程序组装完成后,需要有一个主程序。单独组装时,程序需要在标题中声明main。像这样:

.abicalls
.option pic0
.globl main
.set nomips16
.ent main
.type main, @function

这告诉你的程序main是一个函数,你在main处输入它。

但是如果你使用像Makefile这样的东西来将不同的程序合并到一个成品中,那么就有可能不在你的MIPS程序中声明main,而是在另一个程序中声明main,它将在以下编译同一时间。在这种情况下,您只需要执行与main相同的操作,但是使用您将从中开始的函数(您希望在执行程序时首先运行的函数),如下所示:

.abicalls
.option pic0
.globl rng, seed
.set nomips16
.ent rng
.type rng, @function

注意我是如何使用.globl rng,seed的。据我了解,这允许您从编译到成品的其他程序中调用两个函数(rng和seed)。

2:如何从我的C程序调用我的MIPS程序中编写的函数

问题中发布的C示例将起到作用。事实证明,MIPS程序将采用这些参数(a,b,c)并将它们放入寄存器$ a0- $ a2。然后你只需要格式化程序就可以将返回值放入$ v0,然后可以将其反馈到C程序中。举个例子:

// C Program
//=========================
#include<stdio.h>
int main()
{
    printf("%d", rng(0));
    return 0;
}
//=========================

// MIPS program
//=========================
rng:
    addi $v0, $a0, 1
    jr   $ra
//=========================

运行C程序只输出1,因为它调用rng(),它将输入加1(在$ a0中找到,C程序设置为0)并在退出前将其放入$ v0。然后printf打印返回的rng,即1。

所以你有它。感谢您的帮助。