在X86机器上生成MIPS架构汇编代码

在X86机器上生成MIPS架构汇编代码

我需要生成米普斯当我运行 C 程序时,我的机器上的特定代码。当我只是跑步时,

gcc -O2 -S -c hello.c

在我的系统上,我得到的hello.s似乎生成了一些汇编代码,但它似乎不是米普斯具体代码。文件内容hello.s如下。

    .file   "hello.c"
    .section    .rodata.str1.1,"aMS",@progbits,1
.LC0:
    .string "Hello world"
    .text
    .p2align 4,,15
.globl main
    .type   main, @function
main:
.LFB11:
    .cfi_startproc
    movl    $.LC0, %edi
    xorl    %eax, %eax
    jmp printf
    .cfi_endproc
.LFE11:
    .size   main, .-main
    .ident  "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-4)"
    .section    .note.GNU-stack,"",@progbits

我怎样才能生成米普斯我的机器上的具体代码?

我的机器详细信息如下。

arch
x86_64

答案1


了解基础知识


来自维基百科MIPS架构的入口,它被描述为,

MIPS(最初是没有互锁流水线阶段的微处理器的缩写)是由 MIPS Technologies(以前称为 MIPS Computer Systems, Inc.)开发的精简指令集计算机(RISC)指令集(ISA)。

来自维基百科x86-64 的条目,它被描述为,

x86-64(也称为 x64、x86_64 和 AMD64)是 x86 指令集的 64 位版本。

因此,根据arch问题的输出,很明显我有一个x86_64机器,我尝试生产米普斯运行编译器后的体系结构特定代码gcc

这类似于尝试并在汽油发动机上运行柴油车。无论我们多么努力,如果不调整燃气发动机,我们就无法在汽油发动机上运行柴油车。

用技术的方式来描述它gcc可以为大量架构生成汇编代码,包括米普斯。但是给定gcc实例的目标架构是在gcc编译时决定的。 Ubuntu 系统中的预编译二进制文件了解以下内容x86(可能同时是 32 位和 64 位模式)但不是米普斯


如何将C程序编译为MIPS汇编代码


再次引用来自相同的答案gcc使用不同于gcc其本身将运行的体系结构的目标体系结构进行编译称为准备交叉编译工具链。或者通俗地说,这个交叉编译工具链类似于调整汽油发动机来运行柴油车

然而,设置交叉编译工具链是一项相当繁重的工作,因此我将描述如何将本机 MIPS 编译器安装到 MIPS 虚拟机中,而不是描述如何设置它。这涉及为虚拟机设置模拟器并将操作系统安装到该环境中的额外步骤,但将允许您使用预构建的本机编译器而不是编译交叉编译器。

我们将首先安装qemu以使我们的系统运行一些虚拟化操作系统。同样,有几种方法,例如安装一些交叉编译的工具链在这里讨论使用构建根正如我之前链接的答案中所建议的。

  • 下载 tar 包盖姆从这里。
  • 下载 tar 球后,运行以下命令。

     bzip2 -d qe*
     tar -xvf qe*
     ./configure
     make
     make install
    
  • qemu现在,在机器上 安装后,我按照建议尝试了 debian 操作系统的几种网络启动方法这里这里。但不幸的是,我无法使用网络启动执行 debian 操作系统安装,因为没有正确的镜像。

我得到了一个针对 MIPS 架构的 Debian 镜像 这里我从上面的链接下载了图像并执行了以下步骤kernelqemu

  • 我开始qemu如下。

    qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda 
    debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0"
    
  • debian系统启动后,我安装了gcc如下编译器。

    apt-get update && apt-get upgrade
    apt-get install build-essential
    

现在,我gcc在 qemu 上的 MIPS debian 虚拟机中拥有一个完美运行的本机编译器,它将我的 C 程序编译为米普斯具体的汇编代码。


测试


在我的 debian 机器中,我刚刚放入了一个示例 C hello world 程序并将其保存如下hello.c

#include<stdio.h>
int main()
{
    printf("Hello World");
}

为了为我的 hello.c 程序生成 MIPS 架构代码,我使用gcc编译器运行 C 程序,如下所示:

gcc -O2 -S -c hello.c

上面的命令生成了一个hello.s文件,该文件生成了我的米普斯架构代码。

    .file   1 "hello.c"
    .section .mdebug.abi32
    .previous
    .gnu_attribute 4, 1
    .abicalls
    .section    .rodata.str1.4,"aMS",@progbits,1
    .align  2
$LC0:
    .ascii  "Hello World\000"
    .text
    .align  2
    .globl  main
    .set    nomips16
    .ent    main
    .type   main, @function
main:
    .frame  $sp,0,$31       # vars= 0, regs= 0/0, args= 0, gp= 0
    .mask   0x00000000,0
    .fmask  0x00000000,0
    .set    noreorder
    .set    nomacro

    lui $28,%hi(__gnu_local_gp)
    addiu   $28,$28,%lo(__gnu_local_gp)
    lui $4,%hi($LC0)
    lw  $25,%call16(printf)($28)
    nop
    jr  $25
    addiu   $4,$4,%lo($LC0)

    .set    macro
    .set    reorder
    .end    main
    .size   main, .-main
    .ident  "GCC: (Debian 4.4.5-8) 4.4.5"

但是我怎么知道上面生成的代码是否是米普斯汇编代码?

arch命令的输出将告诉您机器的架构。在我的 debian 机器中,它生成的输出为,mips并且我也没有binutils在机器中安装任何交叉编译器工具链。

所以,生成的汇编代码是米普斯具体的。

答案2

您需要一个交叉工具链,gcc (+binutils),它在 x86_64 上运行,但输出 mips 二进制文件。

您可以尝试从头开始自己构建它(例如谷歌:构建交叉工具链)或下载预构建的工具链(例如从代码源

或者您可以借助某些工具(例如交叉工具-ng

还有像这样的系统构建根目录构建(或下载)他们自己的交叉工具链(我猜也是 OpenWRT)。

答案3

恩德比安项目已经做了一些工作交叉工具链

由于这些软件包严重受到位腐烂的影响,我会通过邮件列表或 IRC 询问 emdebian 项目的当前状态。

相关内容