SPIM (симулятор MIPS) не может проанализировать следующую инструкцию lui $2,%hi($LC0)

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

Прямо сейчас мы используем кросс-компилятор CodeSourcery для генерации соответствующего кода MIPS для данной программы C. Он генерирует такие операторы, как 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?


person Vikash Joshi    schedule 01.02.2012    source источник


Ответы (4)


Синтаксис %hi(addr) и %lo(addr) используется ассемблером Gnu и работает так, как показано в приведенном выше коде. SPIM не поддерживает этот синтаксис, поскольку он предназначен для использования в качестве простого обучающего инструмента (см. in-mips-asm-on-mars/7264857#7264857">этот вопрос).

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

person markgz    schedule 02.02.2012
comment
Спасибо за предложение полного симулятора MIPS. - person Vikash Joshi; 03.02.2012

В книге Моргана Кауфмана «See 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 успешно запустить нашу программу.

person Vikash Joshi    schedule 02.02.2012

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

Например:

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

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

person gibiluka    schedule 23.08.2014

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

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

offset(register_pointer)

Например:

lw $t0, 0($sp)

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

person m0skit0    schedule 02.02.2012
comment
Это допустимый синтаксис для ассемблера Gnu gas MIPS. SPIM — это ограниченный инструмент, предназначенный только для обучения, и он не поддерживает этот синтаксис. - person markgz; 02.02.2012
comment
Хорошо, я не знал, ты, но я имел в виду, что это не стандартный синтаксис MIPS ABI. В конечном итоге вам придется преобразовать в смещение (форма регистрации). - person m0skit0; 03.02.2012