5

ファイルが与えられた場合

#include <stdio.h>

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

コマンドを使用できます

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

残念ながら、MIPS コードのように見える素敵な部分を生成するために (テキストを分割しないように下に配置)、残念ながら、MIPS 用の信頼できる SPIM シミュレーターで実行しようとすると、ほぼすべての行に SPIM オブジェクトが含まれていることがわかります。'.Section .mdebug.abi32' 行だけでなく、'.cfi*' 形式の任意の行 - さらに紛らわしいことに (私には MIPS のように見えるため...) 'lui $2, %hi( __gnu_local_gp)" に異議を唱えています。

SPIM と LLVM が対応する MIPS のさまざまなフレーバーに関する情報、またはLLVM が生成している MIPS コードを受け入れる、私が実行できる MIPS シミュレーターの例を挙げてくれる人を探しています。

    .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
4

2 に答える 2

1

Spim は gnu アセンブラに対応していない簡易ティーチングツールです。さまざまな実際の MIPS プロセッサの完全なモデルが含まれているOVPsimを使用してみてください。OVPsim で Linux を実行でき、そのシミュレートされた Linux で clang によって生成された MIPS Linux 実行可能ファイルを実行できるはずです。

于 2013-07-11T03:09:19.050 に答える
0

LLVM の Mips アセンブリ プリンターは、アセンブリを GAS 形式で出力します (GNU アセンブラーおよび互換ツールによる使用に適しています)。SPIM が読み取れない可能性が非常に高いです。ただし、SPIM が Mips バイナリを読み取ることができる場合は、LLVM からオブジェクト ファイルを発行して、SPIM に処理させることができます。

バイナリは、CPU 自体が理解する必要があるため、より「ユニバーサル」です。悲しいかな、各アセンブラは通常、それが理解できる独自の特定の構文を持っており、アセンブラは相互に互換性がなく、演算子の順序付け、句読点のセマンティクス、ディレクティブなどの基本的な事項について意見が一致しない傾向があります。

于 2013-07-10T13:42:26.317 に答える