やまものブログ

メモ書きブログです (^_^;A

はじめの一歩 ~ インライン・アセンブラお試し

ARM認定エンジニア プログラム (AAE)
にチャレンジすることにしました

今月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 に割り当てられていたようです。
その他の命令がどうなっているのかはこれから勉強の題材にしたいと思います