c++ - 如何在MIPS汇编程序中使用库?

标签 c++ c assembly mips qtspim

如何在使用QtSpim(MIPS模拟器)编译的MIPS汇编程序中使用库(用c/c++编写)?通过这个论坛,在一位非常有才华的人 @rkhb 的帮助下,我能够使用英特尔汇编程序来完成此操作。这是他提供的解决方案:

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

现在我想在 MIPS 汇编中做同样的事情。现在,由于我使用 Intel 处理器并使用 QtSpim 运行 MIPS 汇编程序,如何在使用 QtSpim 时执行此操作?

最佳答案

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

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

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

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

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

--- 编辑 ---

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

关于c++ - 如何在MIPS汇编程序中使用库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23591154/

相关文章:

c++ - 为什么与 C 相比,链接器在 C++ 中的任务更艰巨?

c - 请教关于数组中char的问题

assembly - mov eax, dword ptr [eax] 有什么作用?

assembly - 使用 lisp 进行元编程/代码生成?

c++ - 为什么相同的 gcc 编译选项在不同的计算机体系结构上会有不同的表现?

c++ - 如何使用 C++11 标准库生成随机数

c++ - 为什么我获得未分配内存的读写权限?

assembly - Nasm 中需要 while 循环的示例

c++ - "undefined reference to ` QString::fromAscii_helper(char const*, int) '"

c++ - find_last_of 用于字符串末尾的双引号