アセンブラ

ビットが並ぶような話だとか低レベルなことを調べ始めたら、ちょっと懐かしくてうれしくなった。一方で、ぼくの頭の中ではやっぱり数値はすべて8ビット。charのポインタでループして何が悪いかに気づいていなかった。今は最低でも4バイト単位で処理するのが最適なのだった。GDBの出力でeaxの値とか見ると、一体そんなに長々と何を詰め込むのだろうかと思ってしまうけど、、、世の中32ビット、いやもう64ビットはそこまで来てるか。

今どきのアセンブラってどうなってるのかが気になってきて、インテルのマニュアルを読み始めた。8088/8086からCore i7にいたるまでのマイクロアーキテクチャの進化にそって説明されていておもしろい。勉強記録のブログなので、気づいたことを書き留めておく。

  • 基本的なアイデアはぼくが知るZ80/8086時代と何も変わってない
  • レジスタが妙に長くなっていたりMMX/SSEのSIMD系で増えている
  • アキュムレータとかカウンタとかを思い出した
  • 命令がすごく豊富になっていて、特に条件付きのmovとかビビった
  • movではなくmovlとあったのはインテルとは何の関係もなくてAT&T記法を採用したGNU Assemblerのせい
  • movlのような「l」は操作対象のデータのバイト数。b、l、w、qなどと付けられる
  • オペランドの並び順がインテルとAT&T記法で逆! まじか!
  • push/pop/callとC言語の関数呼び出しのスタックフレームの話でイメージがつながった

Z80アセンブラをハンドアセンブルしたのは中学1年のころだったと思う。当時、アセンブラは数万円する高級品で、まったく手が出せるようなソフトウェアではなかった。それが、今や純正マニュアルもアセンブラもエディタも揃っている。すごいことだ。

LinuxもCもアセンブラも、すっかり複雑で専門的になり、ぼくのような門外漢にはもはや関係のない世界と思っていたけど、あれこれいじれば実はそれなりに分かるようになるんじゃなかという気がしてきた。Linuxシステムコールがeaxやebxに値をセットしてint80で呼べるということに、「なんだ今でもそんなことだったのか!」という驚きを感じたりしつつ。