/ / SPIM (MIPS Simulator) nedokáže analyzovať nasledujúci príkaz lui $ 2,% hi ($ LC0) - c, mips, cross-compiling, spim

SPIM (Simulátor MIPS) nedokáže analyzovať nasledujúce vyhlásenie: $ 2,% hi ($ LC0) - c, mips, cross-compiling, spim

Vyvíjame krížový kompilátor C na MIPS ana to potrebujeme porovnať náš kód MIPS s kódom vygenerovaným iným kompilátorom C až MIPS, ako je LLVM alebo CodeSourcery, atď. Na spustenie nášho kódu MIPS používame SPIM.

Práve teraz používame krížik CodeSourcerykompilátor na vygenerovanie zodpovedajúceho MIPS kódu pre daný program C. Generuje príkazy ako lui $ 2,% hi ($ LC0), lw $ 3,% lo ($ LC0) ($ 2), kde LCO je menovka, ale pri načítaní tohto súboru v SPIM. Zobrazuje chybu analyzátora ako

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

Neviem, aký je ekvivalentný kód MIPS pre tento druh príkazu, aby ho mohol analyzovať SPIM?

odpovede:

2 pre odpoveď č. 1

Na %hi(addr) a %lo(addr) Syntax je používaná assemblerom Gnu a funguje tak, ako je to zobrazené v predchádzajúcom kóde. SPIM nepodporuje túto syntax, pretože je určený ako jednoduchý výukový nástroj (pozri toto otázka).

Ak vyvíjate skutočný nástroj krížovej kompilácie MIPS, mali by ste ho otestovať pomocou úplného simulátora MIPS, ako je napríklad bezplatný OVP Simulátor MIPS. Testuje sa, že OVP je kompatibilný so skutočnými procesormi MIPS.


1 pre odpoveď č. 2

V knihe „Pozri MIPS Run 2nd Edition“ od Morgana Kaufmanna sú ekvivalentné kódy MIPS pre inštrukcie, ktoré používajú registre „hi“ a „lo“, napr.

  1. lw $ 2, addr => lui,% hi (addr)
    lw $ 2,% lo (addr) (at)

  2. sw $ 2, addr ($ 3) => lui o,% hi (addr)
    uviesť na $ 3
    sw $ 2,% lo (addr) (at)

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

  4. la $ 2, addr ($ 3) => lui at,% hi (addr)
    addiu $ 2, o,% lo (addr)
    pridajte 2, 2 a 3 doláre

Môžeme vložiť ekvivalentný kód, ktorý neobsahuje registre "hi" a "lo" a prinútiť SPIM, aby náš program úspešne spustil.


1 pre odpoveď č. 3

Môžete použiť príznak GCC -mno-explicitné-relocs aby sa predišlo operáciám premiestnenia montéra pri manipulácii so symbolickými adresami (t. j.% hi a% lo).

Napríklad:

mips-elf-gcc -S kernel.c - neodborný -mips32 -mno-explicitné-relocs -Wall

Môžete skontrolovať možnosti GCC MIPS v systéme Windows https://gcc.gnu.org/onlinedocs/gcc-3.4.4/gcc/MIPS-Options.html


0 pre odpoveď č. 4

Toto nie je legálna syntax pre zostavenie MIPS.

Prístup k pamäti v MIPS sa zvyčajne píše ako

offset(register_pointer)

Napríklad:

lw $t0, 0($sp)

Pokiaľ viem ofset je okamžité celé 16-bitové číslo so znamienkom a nemôže to byť nič iné (nemôže to byť register, štítok atď.).