1

我们正在开发一个 C 到 MIPS 交叉编译器,为此我们需要将我们的 MIPS 代码与其他 C 到 MIPS 交叉编译器(如 LLVM 或 CodeSourcery 等)生成的代码进行比较。我们正在使用 SPIM 来运行我们的 MIPS 代码。

现在我们正在使用 CodeSourcery 交叉编译器为给定的 C 程序生成相应的 MIPS 代码。它会生成像 lui $2,%hi($LC0) , lw $3,%lo($LC0)($2) 这样的语句,其中 LCO 是一个标签,但同时在 SPIM 中加载该文件。它显示解析器错误,如

(parser) Unknown character on line 30 of file test1.s
  lui   $2,%hi($LC0)

我不知道这种语句的等效MIPS代码是什么,以便可以被SPIM解析?

4

4 回答 4

2

Gnu 汇编器使用%hi(addr)and%lo(addr)语法,它的工作方式如上面的代码所示。SPIM 不支持此语法,因为它旨在作为简单的教学工具(请参阅问题)。

如果您正在开发真正的 MIPS 交叉编译工具,您应该使用完整的 MIPS 模拟器(如免费的OVP MIPS 模拟器)对其进行测试。OVP 经测试与真正的 MIPS 处理器兼容。

于 2012-02-02T19:29:54.813 回答
1

在 Morgan Kaufmann 的“See MIPS Run 2nd Edition”一书中,有使用“hi”和“lo”寄存器的指令的等效 MIPS 代码,例如

  1. lw $2, addr => lui at, %hi(addr)
                           lw $2, %lo(addr)(at)

  2. sw $2, addr($3) => lui at, %hi(addr)
                                   addu at, at, $3
                                   sw $2, %lo(addr)(at)

  3. la $2, addr => lui at, %hi(addr)
                           addiu $2, at, %lo(addr)

  4. la $2, addr($3) => lui at, %hi(addr)
                                 addiu $2, at, %lo(addr)
                                 addu $2, $2, $3

我们可以放入不包含“hi”和“lo”寄存器的等效代码,让SPIM成功运行我们的程序。

于 2012-02-02T10:34:08.637 回答
1

在处理符号地址(即 %hi 和 %lo)时,您可以使用 GCC 标志-mno-explicit-relocs来避免汇编程序重定位运算符。

例如:

mips-elf-gcc -S kernel.c -ffreestanding -mips32 -mno-explicit-relocs -Wall

您可以在https://gcc.gnu.org/onlinedocs/gcc-3.4.4/gcc/MIPS-Options.html中查看 GCC MIPS 选项

于 2014-08-23T06:15:19.233 回答
0

这不是 MIPS 程序集的合法语法。

MIPS 中的内存访问通常写成

offset(register_pointer)

例如:

lw $t0, 0($sp)

AFAIK偏移量是一个立即的 16 位有符号整数,不能是其他任何东西(它不能是寄存器、标签等......)。

于 2012-02-02T09:48:18.610 回答