从 C 调用 Mips

标签 c assembly mips

我想从我的 C 程序中调用汇编(特别是 MIPS)代码,然后从汇编中调用 C 代码
我决定使用 GNU GCC 作为我的编译器,(我也猜我需要一个模拟器?)
我在 x86 Win 7 机器上。 有些事情我不太清楚这可以/应该如何解决。

  • 如果 MIPS 将使用具有 32 个寄存器的加载存储架构,而 C 将继续使用寄存器内存架构,因为我在 x86 上?
  • 既然我想调用 mips 程序集而不是 x86 程序集,我还能/是否仍然使用 asm() ?
  • 如果 MIPS 使用的寄存器多于 C,我能否从我的 C 代码访问这些寄存器?

谁能帮我解决这个问题,也许可以指出我可以在哪里学习这种魔法?

谢谢

免责声明:我正在为学校学分验证自修改代码项目,此代码将用作示例,但我不会因为此代码而获得任何学分。

最佳答案

描述了最常见的 MIPS 调用约定 here .编写 C 可调用的汇编例程的最简单方法是用 C 编写例程的框架,然后将编译器输出的汇编代码复制到汇编源代码中(使用 gcc 的 -S 选项) .假设您要调用在 C 中定义为 int foo(int a, int b) 的汇编程序函数。您可以用 C 编写该函数的简单版本。例如,将以下内容放入 foo.c:

int foo(int a, int b) {
    return a+b;  // some simple code to access all arguments and the return value
}

然后您将使用 MIPS 交叉编译器(见下文)使用 gcc 的 -S-O0 选项编译该函数,这将生成一个文本输出文件foo.S 为您提供 MIPS 汇编程序源代码以访问函数 foo 的参数,并向您展示返回值的放置位置。只需将该源文件复制到您自己的汇编源代码中,然后添加计算 foo 所需的汇编计算。

一旦你想通了另一个方向的调用,从汇编调用 C 就很简单了。

您可以下载免费的 MIPS gcc cross compiler来自 Mentor Graphics 的工具链(以前称为 Codesourcery)。

您可以从 here 下载一个免费的、功能齐全的(它启动并运行 Linux)MIPS 模拟器。 .不要使用 SPIM 或 MARS,因为它们不能完全模拟 MIPS 架构。

关于从 C 调用 Mips,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12472264/

相关文章:

c - 我应该怎么做才能删除最后一个词后的逗号?

c - 函数调用和汇编

performance - 为什么数据转发和停顿周期在处理负载使用风险方面比 NOP 更有效?

assembly - 程序计数器?

c - 这是什么疯狂?

c - 以编程方式处理 ctrl +d?

在 __GI____strdup() 中因 SIGSEGV 崩溃

assembly - 内存屏障是CPU执行的指令,还是只是一个标记?

assembly - 为什么我不能在 MARS 中使用 li.s?

ubuntu - 编译Nachos源代码时出现 “gnu/stubs-32.h: No such file or directory”错误