ARMコードをシミュレートしたいと思います。たとえば、次のようなコードを実行したいと思います。
MOV R0, #5
ADD R0, R0, #1
//somehow output R0
そしてそれは私のUbuntuのいくつかのソフトウェアで6を出力するでしょう。出来ますか?
Keil MDKを使用して ARM コードをシミュレートできます。これは、ARM レジスタ セット、メモリ コンテンツなどをプローブするために使用できるシミュレート/デバッグパースペクティブを提供します。
MDK-Lite 評価版は、最大 32KB のコード サイズで無料で利用できます。
MDK の Linux バージョンは使用できません。しかし、Keil MDKは Ubuntuの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
ステップ 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を押してデバッグ パースペクティブから抜け出します。
実際の実行可能ファイルにビルドすると、QEMUの ARM エミュレーターを使用して実行できます。
この記事では、QEMU を使用してベアメタル ARM コードをシミュレートする方法を順を追って説明しています: http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/
もちろん、C の処理を行う必要はなく、アセンブリを直接 startup.s に配置できます。
エミュレーターであるQEMUを介してアームコードを実行できますが、QEMUもソフトウェアですが、共有メモリやファイルなどを使用できるため、別のソフトウェアに直接出力することはできないと思います(ファイルにはミューテックスが必要な場合があります) エミュレータからホスト ソフトウェアに結果を渡したり戻したりするには、処理が少し遅くなる可能性があります。
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ターミナルにが出力されます:)
私は常に小さな qemu ARM VM を使用して ARM プログラムをテストしています。
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 などを使用して) プログラムを記述し、そこでテストすることができます。
qemuをインストールし、arm用にクロスコンパイルしてから、
qemu-system-arm ./a.out
あなたの端末で
C で ARM エミュレータを作成する場合は、このリポジトリのコードを出発点として使用できます。 https://github.com/omufeed/ARMAssemblyEmulatorWithC サイズ 4 のパイプラインがあります。データ処理命令が実装され、オーバーフローとキャリー フラグを処理します。分岐と割り込みも実装されています。アセンブリ命令を入力として受け入れ、命令完了後の最終的なメモリ状態をシミュレートします。コード コメントとして追加された入力例がいくつかあります。詳細については、http://www.omidmufeed.com/arm-assemblyr-emulator-with-c/をご覧ください。