【问题标题】:How to use a library in a MIPS assembly program?如何在 MIPS 汇编程序中使用库?
【发布时间】:2014-05-11 09:53:04
【问题描述】:

如何在使用QtSpim(MIPS emulator) 编译的MIPS 汇编程序中使用库(用c/c++ 制作)?使用这个论坛,在一位非常有才华的人@rkhb 的帮助下,我能够使用英特尔汇编程序来做到这一点。这是他提供的解决方案:

how to use a library in masm or more specifcally a .lib file?

现在我想在MIPS 程序集中做同样的事情。现在,由于我使用的是 Intel 处理器并使用 QtSpim 运行 MIPS 汇编程序,我该如何在使用 QtSpim 时做到这一点?

【问题讨论】:

  • 据我所知,SPIM 及其变体只支持加载汇编语言源代码,不支持预编译的可执行文件或库。
  • @Michael 我也有同样的看法,但后来我看到了这个:stackoverflow.com/questions/16722657/… 这让我觉得在 SPIM 中也可以做到这一点
  • 该问题与 SPIM 无关。与其他平台相比,为 MIPS 链接以不同语言编写的目标文件和库应该没有什么不同。但这不是在源代码级别完成的,所以据我所知,SPIM 无法做到这一点。

标签: c++ c assembly mips qtspim


【解决方案1】:

要从汇编程序调用 C 编译函数(反之亦然),寄存器必须具有以下内容:

  • 寄存器 4-7 必须包含前 4 个参数
  • 使用较新的 C 编译器寄存器 8-11 包含更多的 4 个参数
  • 寄存器 29 必须是堆栈指针
  • 超过 4 或 8 个(取决于编译器)必须存储在堆栈中(据我所知,第 n 个参数位于地址 (n-1)*4+(register 29);第一个堆栈上的 4 或 8 个字可能会被调用的例程覆盖
  • 使用“JAL”或“JALR”简单地调用例程。一些使用“-PIC”开关编译的 GNU C 编译函数假定带有特定寄存器(28?)的“JALR”指令,因此该寄存器包含函数本身的地址。
  • 当从函数寄存器2返回时包含返回值;寄存器 3 用于 64 位结果的高 32 位

如果 SPIM 不支持加载可执行文件而只支持源代码,您可以创建静态链接的可执行文件并执行反汇编。

您可以将反汇编传递给 SPIM 模拟器。

请注意,“系统调用”指令(“syscall”或“syscall #n”)在不同的操作系统中具有不同的含义。如果库包含系统调用,则您不能使用 SPIM 中为 Linux 编写的库,反之亦然。

--- 编辑---

使用“-pic”开关编译的库函数必须使用“JALR $t9”调用,因此寄存器 25(“t9”)保存被调用函数的地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    相关资源
    最近更新 更多