9

ARMコードをシミュレートしたいと思います。たとえば、次のようなコードを実行したいと思います。

MOV    R0, #5
ADD    R0, R0, #1
//somehow output R0

そしてそれは私のUbuntuのいくつかのソフトウェアで6を出力するでしょう。出来ますか?

4

10 に答える 10

11

Keil MDKを使用して ARM コードをシミュレートできます。これは、ARM レジスタ セット、メモリ コンテンツなどをプローブするために使用できるシミュレート/デバッグパースペクティブを提供します。

MDK-Lite 評価版は、最大 32KB のコード サイズで無料で利用できます。

MDK の Linux バージョンは使用できません。しかし、Keil MDKは UbuntuのWINE上で完全に動作します。


Keil uVision MDK の WINE へのインストール:

ステップ 1: Ubuntu にワインをインストールする

ターミナルを開き、次のように入力します。

sudo apt-get install wine

ステップ 2: Keil MDKをダウンロードします。

ステップ 3: MDK をインストールする

MDK実行可能ファイルを右クリックし、[ Wine Windows プログラム ローダーで開く] オプションを選択します。

ステップ 4: Ubuntu で Keil uVision MDK を呼び出す

ターミナルを開き、次のように入力します。

wine ~/.wine/drive_c/Keil/UV4/Uv4.exe

ステップ 5: Flash Magic をインストールする (オプション)

Flash Magic は、Keil ボード用のソフトウェアをダウンロードするために使用されるツールです。Flash Magic ソフトウェアをダウンロードし、wine にインストールします (前の手順を参照)。

シリアル ポートへの COM1 リンクを作成します。ターミナルを開き、次のように入力します。

ln -s /dev/ttyS0 ~/.wine/dosdevices/COM1

Keil uVision MDK プロジェクトの作成とデバッグ:

ステップ 1: ARM7 ターゲット用の Keil UVision プロジェクトを作成します。

Keil UVision ツールバーでProject --> New Projectを選択します。

このプロジェクトを作成する場所に移動します。

プロジェクト名を入力し、 [保存] をクリックします。

Target のデバイスとしてARM --> ARM7(Little Endian)を選択します。[OK] をクリックします。

手順 2: ターゲットのアセンブリ ソース ファイルを作成する

Keil UVision ツールバーでFile --> Newを選択します。新しく作成されたファイルに次のコードを追加します。

    AREA text, code, readonly
    ENTRY

    MOV    R0, #5
    ADD    R0, R0, #1

    END

上記のように、各アセンブリ ステートメントの前にタブ スペースを指定します。「.s」拡張子を付けてファイルを保存します。

ステップ 3: ソース ファイルをプロジェクトに追加する

プロジェクト ウィンドウ (UVision の左側) で、ソース グループ 1 を右クリックし、[グループソース グループ 1 にファイルを追加] オプションを選択します。

test.sを選択し、[追加] をクリックします。( ASMソースファイルとしてファイルタイプを選択)

ここに画像の説明を入力

ステップ 4: ソース ファイルをビルドする

Keil UVision ツールバーで、[ Project] --> [Build target ] を選択するか、 F7キーを押してソース ファイルをコンパイルします。

ステップ 5: アプリケーションのシミュレーションとデバッグ

Keil UVision ツールバーで、 [ Debug] --> [Start/Stop Debug Session] を選択するか、 Ctrl + F5を押します。

デバッグ パースペクティブが開き、左側にレジスタ ビュー、中央にコード ビュー、右下にメモリ ビューなどがあります。

ここに画像の説明を入力

デバッグ キーを使用してコードを実行します。

ここに画像の説明を入力

プログラム実行の最後にレジスタ ビューを観察します。

ここに画像の説明を入力

Keil UVision ツールバーで、[デバッグ] --> [デバッグ セッションの開始/停止] を選択するか、 Ctrl + F5を押してデバッグ パースペクティブから抜け出します。

于 2013-01-27T17:28:53.470 に答える
10

実際の実行可能ファイルにビルドすると、QEMUの ARM エミュレーターを使用して実行できます。

于 2013-01-26T17:58:10.523 に答える
3

この記事では、QEMU を使用してベアメタル ARM コードをシミュレートする方法を順を追って説明しています: http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/

もちろん、C の処理を​​行う必要はなく、アセンブリを直接 startup.s に配置できます。

于 2013-01-29T06:38:53.293 に答える
3

エミュレーターであるQEMUを介してアームコードを実行できますが、QEMUもソフトウェアですが、共有メモリやファイルなどを使用できるため、別のソフトウェアに直接出力することはできないと思います(ファイルにはミューテックスが必要な場合があります) エミュレータからホスト ソフトウェアに結果を渡したり戻したりするには、処理が少し遅くなる可能性があります。

于 2013-01-26T18:06:27.973 に答える
2

printfあなたが求めているのは、CプログラムからARMアセンブリ関数によって返される値への道だと思います。これは、 arm-elf-gccarm-elf-runツールチェーンで使用可能なコマンドラインシミュレータを使用して実行できます。ツールチェーンはhttp://www.gnuarm.com/bu-2.16.1_gcc-4.0.2-c-c++_nl-1.14.0_gi-6.4_x86-64.tar.bz2からダウンロードできます。(アーカイブをいくつかのフォルダーに解凍し、オプションでシステムの変数に追加するだけです)<path>/gunarm-4.0.2/bin/PATH

まず、ARMコードをアセンブリ(.s)ファイル内のアセンブリ関数に配置する必要がありますmyasm.s。次に、Cでテストコードを記述して(test.cたとえば)、アセンブリ関数を呼び出し、使い慣れたを使用して戻り値をprintfする必要がありますprintf()。以下のソースコードを見つけることができます:

myasm.s:

                .align
                .global myasmfunc       @ Required, so that this func can be 
                                        @ accessed from main() in test.c

                                        @ A sample asm function that 
                                        @ returns the value 6
myasmfunc:      MOV     R0, #5
                ADD     R0, R0, #1      @ Now R0 contains 6.
                                        @ By the default ARM calling convention, 
                                        @ R0 will be used to pass return values
                                        @ to the calling function

                MOV     PC, LR          @ Return from myasmfunc()

test.c:

#include <stdio.h>

int myasmfunc(void);

int main()
{
    int retval = myasmfunc();           // The value that was in R0 now 
                                        // gets copied into retval

    printf("retval = %d\n", retval);    // And print it..

    return 0;
}

2つのファイルの準備ができたら、次を使用してそれらをARMバイナリにビルドできます。arm-elf-gcc

arm-elf-gcc -Wall test.c myasm.s -o test.out

そして、を使用してバイナリを実行しますarm-elf-run

arm-elf-run ./test.out

これretval = 6により、Ubuntuターミナルにが出力されます:)

于 2013-02-04T11:57:56.873 に答える
1

私は常に小さな qemu ARM VM を使用して ARM プログラムをテストしています。

debianからダウンロードして実行できます: (詳細)

qemu-system-arm  -localtime -m 256 -M versatilepb -kernel vmlinuz-2.6.32-5-versatile -initrd initrd.img-2.6.32-5-versatile -hda debian_squeeze_armel_standard.qcow2 -append "root=/dev/sda1" $@

完全な arm システムをシミュレートするため、(vim + gcc などを使用して) プログラムを記述し、そこでテストすることができます。

于 2013-02-04T16:03:27.503 に答える
0

qemuをインストールし、arm用にクロスコンパイルしてから、

qemu-system-arm ./a.out

あなたの端末で

于 2013-01-29T06:55:20.290 に答える
0

C で ARM エミュレータを作成する場合は、このリポジトリのコードを出発点として使用できます。 https://github.com/omufeed/ARMAssemblyEmulatorWithC サイズ 4 のパイプラインがあります。データ処理命令が実装され、オーバーフローとキャリー フラグを処理します。分岐と割り込みも実装されています。アセンブリ命令を入力として受け入れ、命令完了後の最終的なメモリ状態をシミュレートします。コード コメントとして追加された入力例がいくつかあります。詳細については、http://www.omidmufeed.com/arm-assemblyr-emulator-with-c/をご覧ください。

于 2014-09-22T23:09:54.037 に答える