SPIM (MIPS Simulator) не может проанализировать следующее утверждение lui $ 2,% hi ($ LC0) - PullRequest
1 голос
/ 01 февраля 2012

Мы разрабатываем кросс-компилятор C-MIPS, и для этого нам нужно сравнить наш код MIPS с кодом, сгенерированным другим кросс-компилятором C-MIPS, таким как LLVM или CodeSourcery, и т. Д. Мы используем SPIM для запуска нашего MIPScode.

Сейчас мы используем кросс-компилятор CodeSourcery для генерации соответствующего кода 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 ]

2 голосов
/ 02 февраля 2012

Синтаксис %hi(addr) и %lo(addr) используется ассемблером Gnu и работает так, как показано в коде выше. SPIM не поддерживает этот синтаксис, поскольку он задуман как простой инструмент обучения (см. этот вопрос).

Если вы разрабатываете настоящий инструмент кросс-компиляции MIPS, вы должны протестировать его с помощью полноценного симулятора MIPS, такого как бесплатный OVP Симулятор MIPS. OVP протестирован на совместимость с реальными процессорами MIPS.

1 голос
/ 23 августа 2014

Вы можете использовать флаг GCC -mno-явный-relocs , чтобы избежать операторов перемещения ассемблера при работе с символическими адресами (т.е.% hi и% lo).

Например:

mips-elf-gcc -S kernel.c -ffreestanding -mips32 -mno-явное-перемещение -Wall

Вы можете проверить параметры GCC MIPS в https://gcc.gnu.org/onlinedocs/gcc-3.4.4/gcc/MIPS-Options.html

1 голос
/ 02 февраля 2012

В книге Моргана Кауфмана "См. MIPS Run 2nd Edition" есть эквиваленты кода MIPS для инструкций, которые используют регистры "hi" и "lo", например,

  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 успешно запустить нашу программу.

0 голосов
/ 02 февраля 2012

Это недопустимый синтаксис для сборки MIPS.

Доступ к памяти в MIPS обычно записывается как

offset(register_pointer)

Например:

lw $t0, 0($sp)

AFAIK смещение является непосредственным 16-разрядным целым числом со знаком и не может быть чем-либо еще (это не может быть регистр, метка и т. Д.).

...