PowerPCアセンブラのエッセンス

(「Interface」2006/02 特集記事)

あなたは 人目のお客様です.

この高級言語全盛の時代に,このような特集記事は「なぜいまさらアセンブラ?」 などと言われてしまうのかもしれないが,ぼくはぜんぜんそうは思わない. というのはハードウエアやCPUの勉強をする上でアセンブラは必須の知識だし, 避けては通れない道である.しかし最近は高級言語が主流で,アセンブラの資料は 手に入りづらくなっている.必須なわりには勉強しにくい分野になってしまって いるように感じる(こういう分野こそ,Interfaceで特集すべき分野だよね,とも思う. だって他にそういう雑誌って無いし). 実際の開発現場でも,アセンブラは敷居が高いと言うか, 「敷居が高いものと勝手に思ってしまっている」というか, 「ここから先は自分は知らなくていい領域」というように,完全に分けてしまっている 人は多い.

まあそんな思いもあって,執筆依頼があったときには喜んで引き受けさせて いただいた.いろいろ思うところというか,書きたいこともあったので.

というのは,ぼくはPowerPCのアセンブラはほぼ独学に近い(まあ他の分野も,大抵は 独学なのだけど)のだけど,それだけにわかるようになるまで,それなりにまあ たいへんだった.ほとんどのことはMotorolaの日本語マニュアルと, 実際のアセンブラソースから学んだ.てなわけで今回書きたかったのは, 「独学する初心者がどんなところでつまづくか」ということである.

例えばぼくがはじめてPowerPCのアセンブラを見たときに一番疑問だったことは 「4バイトの即値をなぜ2回に分けてレジスタに代入しているのか」ということで ある.まあ理由を考えてみればあたりまえのことだし,聞く人が聞けばバカな質問に 感じるのかもしれないが(理由については記事本文を見てください), ほぼアセンブラ初心者であったぼくは,非常に疑問に思ったものだ.

あとぼくがアセンブラを勉強する上で強く思っていることは, 「すべての命令を知る必要はまったく無い」ということだ. コンパイラが吐いたコードでも,人間が書いたコードでも, 利用される命令はほんの一部であることが多い.とくにコンパイラはそうだ. だからアセンブラを勉強するときに大切なのは,命令をひとつひとつ一生懸命 覚えることではなく,あることをしたいときに,どのように命令を組み合わせるのかと いうことだ. まあこれは RISC の特色なのかもしれないが,ひとつのことをするときでも, 複数命令を組み合わせるのが普通だ.だから大切なのは,命令の細かい意味よりも, 複数の命令をどのように組み合わせるかということだ.つまり書き方の「定石」を 覚えることが大切だ.

なので今回の記事では,自分が独学していた頃に非常に疑問に思ったことと, あと実際になにがしたくて命令をどのように組み合わせているかを説明することを 目標にした.アセンブラは「この命令の組合せで,要するに何がしたいのか?」 という観点から読めば,つまり目的を意識して読むならば,それほど難しいものでは ない.しかしアセンブラを勉強するときに,とりあえず命令セットを覚えて, アセンブラを1行1行読んでいく,という勉強のしかたをする人は多い (自分もそうだったので,そういう人の気持ちはよくわかる). こういう勉強のしかただと,アセンブラは非常に難しく感じるものだ. なぜなら,結局何がしたいのかがわかりにくいからである. 重要なのは命令を知ることではなく,目的を知ること(もしくは予想・推測すること) なのだ.

で,最終的になんでぼくがアセンブラを勉強するのかと言うと, それはCPUの勉強になるとか高速化のためには必須だとかいうことではなく, 実は単に「面白いから」だ.だってCPUの命令を直接いじって,CPUに直接命令を 出せるのだから,これはどう考えても面白いだろう. あとは,かっこいいというのもある.だってアセンブラできるって, なんかかっこいいよね? いやべつに高級言語できる人がかっこわるいとかは 思わない(コンピュータの勉強をするならば,高級言語はそれはそれで勉強しなければ ならない)けど,ぼく的にはアセンブラみたいな低レベルのことがわかるほうが, いざとなったら何でもできるしかっこいいと感じるので,他人はともかく自分は そうなりたいということだ.車好きの人が,エンジンをいじりたくなるような, そんな感じかしら.かっこいいから勉強するのです.面白いからとかかっこいいから とか,まあ技術者がなにかを一生懸命に勉強するときの理由なんて, 実際はそんなもんだ.


メールは kozos(アットマーク)kozos.jp まで