加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 06:50:39 所属栏目:百科 来源:网络整理
导读:很久的问题,提前抱歉.好吧,所以我正在处理一些不寻常的限制因素,这就是为什么到目前为止我还没有在网上找到太多帮助.主要的限制是我不能使用模拟器,因此我不能使用系统调用.我需要用MIPS和C做一些事情,并且不太了解如何执行这些程序以了解如何让它们以我需要
很久的问题,提前抱歉.好吧,所以我正在处理一些不寻常的限制因素,这就是为什么到目前为止我还没有在网上找到太多帮助.主要的限制是我不能使用模拟器,因此我不能使用系统调用.我需要用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,c);
    return 0;
}

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

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

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

解决方法

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

1:如何在没有main的情况下运行我的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,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.

所以你有它.感谢您的帮助互联网.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读