2008.12.04
アセンブラって書いたこと、ある?
アセンブラでプログラミングしよう!
と聞くと最初から全ての処理をアセンブラで記述することを想像するかもしれない、が、さすがにそんなことはあまりない。
私が組込開発でよくやっていたパターンは、まずは C言語(C++)でプログラムを実装し、処理速度は二の次で、正常動作するアプリケーションを作成。
そして、この C で書かれたプログラムをアセンブラで置き換えていく。
どの部分をアセンブラ化していくかというと、負荷がかかっていて単純な処理を繰り返しているところなど、アセンブラ化することで効果が見込まれる所から着手してゆく。
大抵は満足行く処理速度に達したら、そこで終了だ。
つまり…C言語とアセンブラが混在しているプログラムが出来上がるわけである。
このように別の言語(C言語)にアセンブラを埋め込むワザ(?)は「インラインアセンブラ」と呼ばれる。
アセンブラは、gccでコンパイル可能だ。
gccってなに?という人は、乱暴に言ってしまうとgccとは「Linux環境などで一般に広く普及しているコンパイラ」である。
もちろん、リンカとしても働くが詳細は省く。
まず最初に、フルアセンブラの「Hello World」のコードを紹介しよう。
なお 64bit版 CentOS-5 で動作確認している。
.text _start: .globl _start mov $15, %edx mov $label, %ecx mov $1, %ebx mov $4, %eax int $0x80 xor %ebx, %ebx mov $1, %eax int $0x80 label: .ascii "Hello s-cubism\n"
このアセンブラを例えば「hello.s」といったファイル名で保存してコンパイル、ではなくアセンブルする。アセンブルは次のコマンドでOKだ。
>gcc hello.s -nostdlib
出力ファイル名を省略すると「a.out」というファイルが生成される。
なお -nostdlib オプションを付け忘れると、リンカが他のライブラリと結合しようとして、_startポイントが2カ所あるといったエラーが表示されてしまうので注意。
実行は
>./a.out
である。画面に 「Hello…」 と出力されれば成功だ。
Hello を表示するだけでも、これだけの 暗号 を記述することになるのだが、見慣れてしまうと抵抗がなくなってくるから不思議。
ここでは$で始まる値は「数値」で、%で始まっている値が「レジスタ」と思ってよい。
アセンブラ(すなわちCPUが処理するプログラム)というのはこうして、全てレジスタの値を足したりコピーしたりの繰り返しだ。
例えば、「$4, %eax」というのはシステムコール eax に write を意味する 4 を代入し、次の行の「int $0×80」で ソフトウェアの割り込み を発生させる、といった感じである。
eax に 4 ではなく、1 を入れると _exit のシステムコールとなる。
なお説明が遅れたが、レジスタというのは…プロセッサ内部にあるメモリ、というよりも値を保持しておく記憶装置のことだ。一般的に言われる「メモリ」とは違う。容量は極めて小さいがプロセッサの内部にあるので処理速度は超高速だ。
ふ~、アセンブラの面白さをお伝えしようと思ったのだが、序論だけでもこのボリュームになってしまった。
近日「インラインアセンブラ」を取り上げる予定。
Trackback URL
Comment & Trackback
Comment feed
Comment