1

C から MIPS へのクロス コンパイラを開発しています。そのためには、MIPS コードを、LLVM や CodeSourcery などの他の C から MIPS へのクロス コンパイラによって生成されたコードと比較する必要があります。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)

SPIM で解析できるように、この種のステートメントに相当する MIPS コードは何かわかりません。

4

4 に答える 4

2

%hi(addr)and%lo(addr)構文は Gnu アセンブラで使用され、上記のコードに示すように機能します。SPIM は、単純な教育ツールとして意図されているため、この構文をサポートしていません (この質問を参照)。

実際の MIPS クロス コンパイル ツールを開発している場合は、無料のOVP MIPS シミュレーターのような完全な 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

GCC フラグ-mno-explicit-relocsを使用して、シンボリック アドレス (つまり、%hi と %lo) を処理するときにアセンブラーの再配置演算子を回避できます。

例えば:

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)

私の知る限り、オフセットは即時の16ビット符号付き整数であり、他のものにすることはできません(レジスタ、ラベルなどにすることはできません...)。

于 2012-02-02T09:48:18.610 に答える