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 SPIM 模拟器中运行它时,我发现 SPIM 几乎与它的每一行都对应,以生成一些看起来像 MIPS 代码的漂亮代码(放置在下面,以避免破坏文本)。不仅是 '.Section .mdebug.abi32' 行,还有任何形式为 '.cfi*' 的行 - 甚至更令人困惑(因为它看起来像 MIPS 对我来说......)行 'lui $2, %hi( __gnu_local_gp)" 被反对。

我正在寻找一些关于 SPIM 和 LLVM 处理的不同风格的 MIPS 的信息,或者有人提供一个我可以运行的 MIPS 模拟器的示例,该模拟器接受 LLVM 生成的 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 汇编程序。您可以尝试使用OVPsim,它具有各种真实 MIPS 处理器的完整模型。您可以在 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 回答