X86マシンでMIPSアーキテクチャアセンブリコードを生成する

X86マシンでMIPSアーキテクチャアセンブリコードを生成する

作成する必要がありますMeapsCプログラムを実行すると、私のコンピュータに特定のコードがあります。走っているとき、

gcc -O2 -S -c hello.c

私のシステムでは、hello.sいくつかのアセンブリコードを生成しているようですが、そうではありません。Meaps特定のコード。ファイルの内容は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

どのように生成できますか?Meaps私のコンピュータに特定のコードがありますか?

私のコンピュータの詳細は次のとおりです。

arch
x86_64

答え1


基本を学ぶ


~からウィキペディアMIPSアーキテクチャのエントリポイントは次のとおりです。

MIPS(もともとはInterlocked Pipeline Stagesのないマイクロプロセッサ)は、MIPS Technologies(旧MIPS Computer Systems, Inc.)が開発したRISC(Reduced Instruction Set Computer)ISA(コマンドセット)です。

~からウィキペディアx86-64のエントリは次のように記述されます。

x86-64(x64、x86_64、およびAMD64とも呼ばれます)は、x86命令セットの64ビットバージョンです。

したがって、arch質問の結果に基づいて、x86_64私が作ろうとしているマシンMeapsコンパイラを実行した後のアーキテクチャ固有のコードですgcc

これは次のようになります。ガソリンエンジンでディーゼル車を運転してみてください。。いくら努力してもガスエンジンをチューニングしないとガスエンジンでディーゼル車を運行することはできません。

技術的な用語で説明するgcc次のような幅広いアーキテクチャのアセンブリコードを生成できます。Meaps。ただし、特定のインスタンスgccのターゲットアーキテクチャはgccコンパイル時に決定されます。 Ubuntuシステムのプリコンパイル済みバイナリについては、こちらをご覧ください。x86(おそらく32ビットモードと64ビットモードの両方)しかしそうではありませんMeaps


CプログラムをMIPSアセンブリコードにコンパイルする方法


再引用同じ答え、基本的に実行されるアーキテクチャgccとは異なるターゲットgccアーキテクチャにコンパイルすることをクロスコンパイルツールチェーンの準備といいます。それとも平信徒の言葉で、このクロスコンパイルツールチェーンは、ディーゼル車を操作するためにガソリンエンジンを調整するのと似ています。

しかし、クロスコンパイルツールチェーンを設定するのはかなり面倒な作業なので、設定方法ではなく、デフォルトのMIPSコンパイラをMIPS仮想マシンにインストールする方法について説明します。これには、仮想マシン用のエミュレータを設定し、オペレーティングシステムをその環境にインストールする追加の手順が含まれますが、クロスコンパイラをコンパイルする代わりに、事前に構築されたネイティブコンパイラを使用できます。

qemuまず、システムで仮想化されたオペレーティングシステムを実行するようにインストールします。繰り返しますが、クロスコンパイルされたツールチェーンをインストールするなど、いくつかの方法があります。ここで議論してくださいそしてビルドルートの使用以前にリンクした回答で提案したとおり。

  • tar パッケージのダウンロードゲームここから。
  • tar ballをダウンロードしたら、次のコマンドを実行します。

     bzip2 -d qe*
     tar -xvf qe*
     ./configure
     make
     make install
    
  • qemuこれで、コンピュータにインストールした後、提案されているようにDebian OS用の複数のネットワーク起動方法を試しました。ここそして ここ。ただし、残念ながら正しいイメージがないため、ネットワークブートを使用してDebian OSをインストールすることはできません。

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プログラムを次のようにコンパイルするデフォルトのコンパイラがあります。Meaps特定のアセンブリコード。


テスト


私の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私のファイルを生成するファイルを生成しました。Meapsスキーマコード。

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

しかし、上記で生成されたコードが次のようになるかどうかはどうすればわかりますか?Meaps組み立てコード?

このarchコマンドの出力はマシンのアーキテクチャを伝えます。私のDebianコンピュータで生成される出力は次のようになり、コンピュータにクロスコンパイラツールチェーンがインストールされていませ mipsん。binutils

したがって、生成されたアセンブリコードは次のようになります。Meaps特定の。

答え2

x86_64 で実行されますが、mips バイナリを出力するクロスツールチェーン gcc(+binutils) が必要です。

最初から自分で構築したり(たとえば、google:Build cross toolchain)、事前に構築されたツールチェーンをダウンロードできます(例:コードソース)

または、次のツールを使用できます。クロスツール-ng

このようなシステムもあります。ルートディレクトリの構築独自のクロスツールチェーンを構築(またはダウンロード)します(OpenWRTも私の考えではそうです)。

答え3

これエンデビアンプロジェクトでいくつかの作業が完了しました。クロスツールチェーン

これらのパッケージはbitrotの影響を受けやすいので、メーリングリストやIRCを介してemdebianプロジェクトに現状を問い合わせるようにします。

関連情報