第3回 コンパイラ実装会でざっくりとx86アセンブリのトランスレータについて説明しました。資料は特に用意せずに即席で説明したため、いくつか不備な点がありました。
- 64bit
- シンボル名のプレフィックス
- 記法
具体的なコードについて取り上げる前に、これらについて簡単に触れておきます。
64bit
私自身は以下の理由により、マシン語の勉強はi386(32bit x86)から始める方が良いと考えていました。
- 64bit(x86_64)は32bit(i386)の拡張なので、32bit時代の事情を知らないと理解できない仕様がある。
- 同じことは32bitについても言えるが、16bitはセグメントを意識するなど32bitより難しい点があるため、最初に16bitをやるべきかは微妙。
- Alphaのように最初から64bitとして設計されたISAなら問題ないと思うが、Alphaはもう製造されていない。
- 64bit OSでは32bitコードも動くものがあるため、テストのためにOSを入れ替えることは少ないかも。
- 32bitを理解していれば独力で(わざわざ説明しなくても)64bit化できるのではないか。
あまりこれを強調すると押し付けになってしまうため、暗黙の了解として敢えて触れないようにしていました。しかし大半の方が64bitで開発されていたため、32bitの説明がそのままでは適用できないケースが続出して、混乱が生じました。
そもそも上記は一般論で、Brainf*ckのトランスレータを作成するのに歴史的背景の理解が本当に必要なのか?と考え直しました。ISAが何であれ、アセンブリ言語に慣れることが何よりも大事なはずです。
シンボル名のプレフィックス
システムコールを直接呼ぶと完全にOSに依存してしまうため、libcを呼び出す方法で説明しました。Win32を念頭に説明したためC関数のシンボル名にプレフィックスのアンダースコアを付けていましたが(例: _purchar)、プレフィックスが不要なELF環境では動かないため混乱が生じました。
勉強会でのMac率を考えると64bit ELFを前提にするのも躊躇するため、プレフィックスについては環境ごとに説明しようと思います。