« 実行時のインライン+ループ展開による高速化例 | メイン | Xbyakで始めるx86(IA-32)入門(2-1) »

Xbyakで始めるx86(IA-32)入門

ここでは何回かに分けてx86(IA-32),いわゆる普通のPentiumパソコンで使われている機械語の説明をする予定です.
アセンブラ,アセンブリ言語としては拙作のXbyakを使うことにしました.
理由は,

  • 普通のgasやNASMによる解説はありふれていること
  • Windows,Linux,Intel Macで同じソースが使え,C++だけで閉じているためアセンブラの設定に悩まなくてすむこと
  • JITなどの特殊な最適化ができること

などがあります(半分は自己満足ですね).

内容は基本的なところから始めますが,場合によってはマニアックネタに走るかもしれません.最初のうちはx86アセンブリ言語入門と重複することも多いと思います.

以下は単なる私の価値観ですが,機械語を絶対に知っておくべきものであるとは思いません.けれども何事もかじってみるのは悪くないと思います.
必要だから勉強する,不要だから勉強しないという合理的な判断は好きではありません.知りたい,興味があるから勉強してみるという素朴な動機が大事だと思います.

閑話休題

まずXbyakをインストールしましょう.XbyakはIntel,AMDなどのPentium互換CPUが搭載されたWindows Xp,Vista,Linux,Macの32bit OSで動作し,開発にはC++コンパイラを使います.Visual C++ 6 + STLport(必須),Visual Studio 2005 Professional/Expression, Linux gcc 4.x, Intel Macなどで動作確認をしています(もしかしたらsecure OSではセキュリティレベルを下げないと動かないかもしれません).
zipファイルを上記ページからダウンロードしてきて展開します.

VC系の場合はxbyak.dswを開いてtest0をコンパイル,Linux,Macの場合はmakeでサンプルプログラムができます.

>./test0
xbyak version=1.06
0 + ... + 0 = 0
0 + ... + 1 = 1
0 + ... + 2 = 3
0 + ... + 3 = 6
0 + ... + 4 = 10
0 + ... + 5 = 15
0 + ... + 6 = 21
0 + ... + 7 = 28
0 + ... + 8 = 36
0 + ... + 9 = 45
0 + ... + 10 = 55
0 + 0 = 0
1 + 1 = 2
2 + 2 = 4
3 + 3 = 6
4 + 4 = 8
5 + 5 = 10
6 + 6 = 12
7 + 7 = 14
8 + 8 = 16
9 + 9 = 18
call atoi("123") = 123
jmp atoi("456") = 456
OK

の様に表示されればOKです.もし,ビルドエラーになる,動かないなどがあれば環境とエラー内容を教えていただけるとありがたいです.

インストールするにはLinux,Macの場合はrootになって

make install

とすると/usr/local/include/xbyakにインストールされます.

WindowsのVisual Studio 6の場合は[オプション]→[ディレクトリ],Visual Studio 2005 Expressionなどの場合は[ツール]→[オプション]→[プロジェクトおよびソリューション]→[VC++ディレクトリ]→[インクルードファイル]でincludeディレクトリに展開したxbyakディレクトリを追加してください.

サンプルプログラムについて

test0
1から10までの和や,足し算,atoi()の呼び出しテストです.
quantize
JPEGやMPEGで使われる量子化のサンプルです.起動して1~100の数値を入力してください.最初にC版,次にxbyakによる演算時間が表示されます.
calc
簡単な関数計算デモです.引数に"x*(x+1)"などを与えて実行してください.このデモのコンパイルにはboostのインストールが必要です.
bf
BrainfuckJIT環境です../bf hello.bfとしてください.

今回はXbyakのインストール方法について説明しました.次回はサンプルプログラムの説明などをする予定です.

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)