ARMアセンブラ(3)

昨日作ったバイナリはQEMUで実行できるらしい。

qemu-system-armは仮想ボードをサポートしている。raspi2とかxilinx-zynq-a9とか。多くがCortex-Aで、Cortex-Mはほとんどない。

https://wiki.qemu.org/Documentation/Platforms/ARM#Supported_in_qemu-system-arm

細かいことが気になるが、まずは動かしてみよう。

参考にしたウェブサイトはconnexボード(ARM7TDMIファミリ?)を使っているのでこれに倣う。 4096Bのファイルを生成し、その先頭にhello.binを書き込んだ。

$ dd if=/dev/zero of=flash.bin bs=4096 count=4096
$ dd if=hello.bin of=flash.bin bs=4096 conv=notrunc

ddコマンドの解説はまた今度。このコマンドも奥が深いのだ。

$ .\qemu-system-arm.exe  -M connex -pflash flash.bin -nographic -monitor stdio
-M
開発ボード
-pflash
FlashROMのファイル指定
-nographic
画像出力しない
-monitor
QEMUモニタの出力先。今回はqemuを起動したコンソールに繋ぐ

プログラムをロードして実行した。上手く動いていれば、プログラムはstopで無限ループしているはずである。

(qemu) info registers
R00=00000005 R01=00000004 R02=00000009 R03=00000000
R04=00000000 R05=00000000 R06=00000000 R07=00000000
R08=00000000 R09=00000000 R10=00000000 R11=00000000
R12=00000000 R13=00000000 R14=00000000 R15=0000000c
PSR=400001d3 -Z-- A svc32
FPSCR: 00000000

R15(PC)が現在の実行アドレスで、0x0000_000Cだ。また、R2=R1+R0になっていて、アセンブラによる計算ができたことがわかる。

(qemu) xp /4iw 0x0
0x00000000:  e3a00005  mov      r0, #5
0x00000004:  e3a01004  mov      r1, #4
0x00000008:  e0812000  add      r2, r1, r0
0x0000000c:  eafffffe  b        #0xc

逆アセンブルもできる。

qemuをきちんと動かすことに非常に苦労した(現在進行形)。qemu-system-armとWindows向けらしいqemu-system-armwがあり、後者はWindows環境らしいのだが正常に動かなかった。

QEMUの公式サイトには

QEMU for Windows is experimental software and might contain even serious bugs, so use the binaries at your own risk.

と書いてあるので、そういうことなのかもしれない。やはり開発マシンはLinuxがいいな。

QEMUをPowershellから呼び出すとQEMU Monitorからの出力が文字化けしたため(入力はされているっぽい)これまた謎。VSCodeのコンソールから使うと使えた。

QEMUのバージョンを上げてみる。3.1.5 -> 4.1.0に。頻繁にバージョンアップするようだったのでchoco install qemuした。特に効果なし。安定して動かしたかったらVMのLinux上でQEMUを動かした方がいい気がする。ただしファイル編集はローカルでしたいので、WSLまたはネットワークドライブをマウントしたLinuxVMを用意すること。組込開発用途だが、そもそもエミュレーションが目的なので実機は不要だ。