我们正在开发一个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解析?
答案 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代码。
lw $ 2,addr => lui at,%hi(addr)
lw $ 2,%lo(addr)(at)
sw $ 2,addr($ 3)=> lui at,%hi(addr)
addu at,at,$ 3
sw $ 2,%lo(addr)(at)
la $ 2,addr => lui at,%hi(addr)
addiu $ 2,at,%lo(addr)
la $ 2,addr($ 3)=> lui at,%hi(addr)
addiu $ 2,at,%lo(addr)
addu $ 2,$ 2,$ 3
我们可以输入不包含“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位有符号整数,不能是其他任何东西(它不能是寄存器,标签等......)。