我想从我的 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/