SPIM(MIPS模拟器)无法解析以下语句lui $ 2,%hi($ LC0)

时间:2012-02-01 14:08:31

标签: c mips cross-compiling spim

我们正在开发一个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 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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

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

答案 2 :(得分: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选项

答案 3 :(得分:0)

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

MIPS中的内存访问通常类似于

offset(register_pointer)

例如:

lw $t0, 0($sp)

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