SPIM (MIPS Simulator) no puede analizar la siguiente declaración lui $ 2,% hi ($ LC0)

Estamos desarrollando un compilador cruzado de C a MIPS, y para eso necesitamos comparar nuestro código MIPS con el código generado por otro compilador cruzado de C a MIPS como LLVM, CodeSourcery, etc. Estamos usando SPIM para ejecutar nuestro código MIPS.

En este momento estamos usando el compilador cruzado CodeSourcery para generar el código MIPS correspondiente para un programa C dado. Genera declaraciones como lui $ 2,% hi ($ LC0), lw $ 3,% lo ($ LC0) ($ 2), donde LCO es una etiqueta, pero mientras carga ese archivo en SPIM. Muestra un error del analizador como

(parser) Unknown character on line 30 of file test1.s
  lui   $2,%hi($LC0)

No sé cuál es el código MIPS equivalente para este tipo de declaración, de modo que SPIM pueda analizarlo.

preguntado el 01 de febrero de 12 a las 14:02

4 Respuestas

El %hi(addr) y la %lo(addr) La sintaxis es utilizada por el ensamblador Gnu y funciona como se muestra en el código anterior. SPIM no admite esta sintaxis, ya que está pensada como una simple herramienta de enseñanza (consulte este pregunta).

Si está desarrollando una herramienta de compilación cruzada MIPS real, debe probarla con un simulador MIPS completo como el gratuito OVP Simulador de MIPS. OVP ha sido probado para ser compatible con procesadores MIPS reales.

contestado el 23 de mayo de 17 a las 12:05

Gracias por sugerir un simulador MIPS completo. Vikash Joshi

En el libro "Ver MIPS Run 2nd Edition" de Morgan Kaufmann hay códigos MIPS equivalentes para las instrucciones que usan registros "hi" y "lo" para, por ejemplo,

  1. lw $ 2, addr => lui en,% hi (addr)
                           lw $ 2,% lo (dirección) (en)

  2. sw $ 2, addr ($ 3) => lui en,% hi (addr)
                                   adu en, en, $ 3
                                   sw $ 2,% lo (dirección) (en)

  3. la $ 2, addr => lui en,% hi (addr)
                           addiu $ 2, en,% lo (addr)

  4. la $ 2, addr ($ 3) => lui at,% hi (addr)
                                 addiu $ 2, en,% lo (addr)
                                 addu $ 2, $ 2, $ 3

Podemos poner el código equivalente que no contenga registros "hi" y "lo" y hacer que SPIM ejecute nuestro programa con éxito.

Respondido 02 Feb 12, 14:02

Puedes usar la bandera GCC -mno-explícita-relocs para evitar operadores de reubicación de ensambladores cuando se trata de direcciones simbólicas (es decir,% hi y% lo).

Por ejemplo:

mips-elf-gcc -S kernel.c -ffreestanding -mips32 -mno-explícita-relocs -Pared

Puede comprobar las opciones de GCC MIPS en https://gcc.gnu.org/onlinedocs/gcc-3.4.4/gcc/MIPS-Options.html

Respondido 23 ago 14, 10:08

Esa no es una sintaxis legal para el ensamblaje de MIPS.

El acceso a la memoria en MIPS generalmente se escribe como

offset(register_pointer)

Por ejemplo:

lw $t0, 0($sp)

Que yo sepa compensar es un entero inmediato de 16 bits con signo y no puede ser otra cosa (no puede ser un registro, una etiqueta, etc ...).

Respondido 02 Feb 12, 13:02

Esta es la sintaxis legal para Gnu gas Ensamblador MIPS. SPIM es una herramienta limitada para la enseñanza con un solo propósito y no admite esta sintaxis. - Markgz

Ok, no lo sabía, ty, pero quise decir que no es la sintaxis ABI estándar de MIPS. Eventualmente tendrá que convertir a offset (formulario de registro). - m0skit0

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.