はじめの一歩 ~ インライン・アセンブラお試し
ARM認定エンジニア プログラム (AAE)
にチャレンジすることにしました
今月30日の試験をすでに申し込んでいます
試験時間は80分で、結果は終了時にすぐ分かるとのことです。サンプルテストは4択でしたので、4択をひたすら解いて回答をPCに入力するものと思われます。申し込み&試験の実施はプロメトリックというサービスを使っています。
シラバスは以下の通りです。
試験は Cortex-A/R が対象で、今のところ ARMv7 が対象のようです。
なお、Cortex-M については AAME という別の試験があります。
「このテストは簡単だ」という意見もありました。しかし、それはARM プロセッサを使ったシステムを実際に開発している人にとっては簡単という意味だと思います。つまり、AAE を持っているということは、ARMシステム開発者と意思疎通できる下地がありますよという意味合いになるものと勝手に理解しています(あくまで個人的な意見です)。
受講者に求められる要件には ARM のアセンブラ・プログラミングのスキルもあります。私はアセンブラの経験が皆無なので、これから試験当日までに QEMU環境で簡単なアセンブラを弄って感触をつかんでおくつもりです。
さっそく、インラインアセンブラを試してみました。
---------- ここから ----------
#include <stdio.h>
int main(int argc, char *argv[])
{
register unsigned int i0;
asm volatile("MOV %0, #123" : "=r"(i0));
printf("%d\n", i0);
return 0;
}
---------- ここまで ----------
変数 i0 をレジスタとして扱うように指定しています。
"asm volatile" のカッコの中がアセンブラです。
この中で i0 を MOV 命令のデスティネーションに指定しています。
この簡単なサンプルをクロスコンパイラで実行形式(a.out)にします。
$ arm-xilinx-linux-gnueabi-gcc <ソースファイル名>
QEMU 環境に FTPで転送して実行するとこんなかんじです
root@zynq:/var/ftp# chmod +x ./a.out
root@zynq:/var/ftp# ./a.out
123
ニーモニックを確認すると下記のようになっていました。
$ arm-xilinx-linux-gnueabi-objdump -S a.out | less
8518: e92d4810 push {r4, fp, lr}
851c: e28db008 add fp, sp, #8
8520: e24dd00c sub sp, sp, #12
8524: e50b0010 str r0, [fp, #-16]
8528: e50b1014 str r1, [fp, #-20] ; 0xffffffec
852c: e3a0407b mov r4, #123 ; 0x7b
8530: e30805c4 movw r0, #34244 ; 0x85c4
8534: e3400000 movt r0, #0
8538: e1a01004 mov r1, r4
853c: ebffff9c bl 83b4 <_init+0x20>
8540: e3a03000 mov r3, #0
8544: e1a00003 mov r0, r3
8548: e24bd008 sub sp, fp, #8
854c: e8bd8810 pop {r4, fp, pc}
変数 i0 は r4 に割り当てられていたようです。
その他の命令がどうなっているのかはこれから勉強の題材にしたいと思います
にチャレンジすることにしました
今月30日の試験をすでに申し込んでいます
試験時間は80分で、結果は終了時にすぐ分かるとのことです。サンプルテストは4択でしたので、4択をひたすら解いて回答をPCに入力するものと思われます。申し込み&試験の実施はプロメトリックというサービスを使っています。
シラバスは以下の通りです。
- ARMアーキテクチャ(30%)
- ソフトウェア開発(30%)
- ソフトウェア最適化(15%)
- システム(10%)
- ソフトウェアのデバッグ(8%)
- 実装(7%)
試験は Cortex-A/R が対象で、今のところ ARMv7 が対象のようです。
なお、Cortex-M については AAME という別の試験があります。
「このテストは簡単だ」という意見もありました。しかし、それはARM プロセッサを使ったシステムを実際に開発している人にとっては簡単という意味だと思います。つまり、AAE を持っているということは、ARMシステム開発者と意思疎通できる下地がありますよという意味合いになるものと勝手に理解しています(あくまで個人的な意見です)。
受講者に求められる要件には ARM のアセンブラ・プログラミングのスキルもあります。私はアセンブラの経験が皆無なので、これから試験当日までに QEMU環境で簡単なアセンブラを弄って感触をつかんでおくつもりです。
さっそく、インラインアセンブラを試してみました。
---------- ここから ----------
#include <stdio.h>
int main(int argc, char *argv[])
{
register unsigned int i0;
asm volatile("MOV %0, #123" : "=r"(i0));
printf("%d\n", i0);
return 0;
}
---------- ここまで ----------
変数 i0 をレジスタとして扱うように指定しています。
"asm volatile" のカッコの中がアセンブラです。
この中で i0 を MOV 命令のデスティネーションに指定しています。
この簡単なサンプルをクロスコンパイラで実行形式(a.out)にします。
$ arm-xilinx-linux-gnueabi-gcc <ソースファイル名>
QEMU 環境に FTPで転送して実行するとこんなかんじです
root@zynq:/var/ftp# chmod +x ./a.out
root@zynq:/var/ftp# ./a.out
123
ニーモニックを確認すると下記のようになっていました。
$ arm-xilinx-linux-gnueabi-objdump -S a.out | less
:中略
00008518 <main>:8518: e92d4810 push {r4, fp, lr}
851c: e28db008 add fp, sp, #8
8520: e24dd00c sub sp, sp, #12
8524: e50b0010 str r0, [fp, #-16]
8528: e50b1014 str r1, [fp, #-20] ; 0xffffffec
852c: e3a0407b mov r4, #123 ; 0x7b
8530: e30805c4 movw r0, #34244 ; 0x85c4
8534: e3400000 movt r0, #0
8538: e1a01004 mov r1, r4
853c: ebffff9c bl 83b4 <_init+0x20>
8540: e3a03000 mov r3, #0
8544: e1a00003 mov r0, r3
8548: e24bd008 sub sp, fp, #8
854c: e8bd8810 pop {r4, fp, pc}
:以下、省略
変数 i0 は r4 に割り当てられていたようです。
その他の命令がどうなっているのかはこれから勉強の題材にしたいと思います