2013-07-10 7 views
5

Da die DateiLLVM/Clang MIPS outputing, aber nicht in SPIM arbeiten ....

#include <stdio.h> 

int main() { 
     printf("hello world\n"); 
     return 0; 
} 

kann ich die Befehle verwenden

clang -emit-llvm hello.c -c -o hello.bc 
llc hello.bc -march=mipsel -relocation-model=static -o hello.s 

ein schönes Stück zu produzieren, was aussieht MIPS-Code, (unten platziert, um den Text nicht zu zerbrechen) Leider finde ich, wenn ich es in meinem treuen SPIM-Simulator für MIPS ausprobiere und finde, dass SPIM Objekte in fast jeder Zeile davon anspricht. Nicht nur die '.Section .mdebug.abi32' Zeilen, sondern auch jede Zeile der Form '.cfi *' - und noch verwirrender (weil es wie MIPS für mich aussieht ...) die Zeile 'lui $ 2,% hi (__gnu_local_gp)“wird widersprochen.

Suche nach Informationen über die verschiedene Aromen von MIPS dass SPIM und LLVM bewältigen, oder jemand ein Beispiel für einen MIPS-Simulator geben kann ich ausführen, dass nimmt der MIPS Code dass LLVM produziert.

.Section .mdebug.abi32 
    .previous 
    .file "hello.bc" 
    .text 
    .globl main 
    .align 2 
    .type main,@function 
    .set nomips16    # @main 
    .ent main 
main: 
    .cfi_startproc 
    .frame $sp,32,$ra 
    .mask 0x80000000,-4 
    .fmask 0x00000000,0 
    .set noreorder 
    .set nomacro 
# BB#0:         # %entry 
    addiu $sp, $sp, -32 
$tmp2: 
    .cfi_def_cfa_offset 32 
    sw $ra, 28($sp)   # 4-byte Folded Spill 
$tmp3: 
    .cfi_offset 31, -4 
    lui $2, %hi(__gnu_local_gp) 
    addiu $2, $2, %lo(__gnu_local_gp) 
    sw $2, 16($sp) 
    sw $zero, 24($sp) 
    lui $2, %hi($.str) 
    addiu $4, $2, %lo($.str) 
    jal printf 
    nop 
    addiu $2, $zero, 0 
    lw $ra, 28($sp)   # 4-byte Folded Reload 
    addiu $sp, $sp, 32 
    jr $ra 
    nop 
    .set macro 
    .set reorder 
    .end main 
$tmp4: 
    .size main, ($tmp4)-main 
    .cfi_endproc 

    .type $.str,@object   # @.str 
    .section .rodata.str1.1,"aMS",@progbits,1 
$.str: 
    .asciz "hello world\n" 
    .size $.str, 13 

Antwort

0

der Mips Montag Drucker in LLVM emittiert im GAS-Format (vom GNU-Assembler und kompatible Tool für den Verzehr geeignet) Montag. Es gibt eine sehr gute Chance, SPI M kann das nicht lesen. Wenn SPIM jedoch Mips-Binärdateien lesen könnte, könnten Sie versuchen, eine Objektdatei von LLVM zu senden und SPIM damit umgehen zu lassen.

Binärdateien sind "universeller", da sie von der CPU selbst verstanden werden müssen. Leider hat jeder Assembler normalerweise seine eigene spezifische Syntax, die er nur versteht, und Assembler sind nicht dazu tendiert, miteinander kompatibel zu sein und widersprechen grundlegenden Dingen wie Operatorenordnung, Interpunktionssemantik, Direktiven und so weiter.

1

Spim ist ein einfaches Lernprogramm, das gnu assembler nicht unterstützt. Sie könnten versuchen, OVPsim verwenden, die vollständige Modelle von verschiedenen echten MIPS-Prozessoren hat. Sie können Linux auf OVPsim ausführen, und Sie sollten in der Lage sein, eine MIPS-Linux-ausführbare Datei auszuführen, die auf diesem simulierten Linux erzeugt wurde.

+0

Eine andere Route, wenn Sie Linux ausführen, wäre die Verwendung des QEMU Linux User Mode Emulators für Mips. Das ist es, was ich für meine CLAR basierte ELLCC Werkzeugkette benutze. (http://ellcc.org) –