「フィーリングで読むアセンブラ入門」執筆中です!
2012/02/26時点での最新の環境を配布します.
おそらくこれが書籍版になると思います.
(2012/10/18追記:なりませんでした(^^;).とくに理由がなければ,
書籍用の最新版のほうを利用してください)
上記アーカイブファイルは,環境構築用スクリプトとパッチ類,サンプルプログラム, またサンプルプログラムをビルドしてアセンブラを出力した状態でアーカイブして あります.このため解凍すれば,とりあえずは(環境構築無しでも)アセンブラを 見てみることができます.
FreeBSD, Ubuntu, WindowsXP+Cygwinの環境で構築し,出力された逆アセンブラファイル が一致することを確認してあります.
ツール類には binutils-2.21.1, gcc-3.4.6, gdb-7.3.1 を利用します. GNUのサイトからダウンロードできますが (そしてこのページの下の方でも配布していますが), いちおうオリジナルを以下で改めて配布します.
以下,環境構築の手順です.環境構築の方法は下のほうの2011/09/09の記事でも説明 してありますが,最新版ではいくつか変更が加わっています.こちらを参考にして 環境構築してください.
(注1:全てのアーキテクチャ用のクロスコンパイラをビルドしようとすると,
ビルドディレクトリに7GB程度,インストール先(/usr/local/cross)に
2.5GB程度が必要になります.また時間もけっこうかかります)
(注2:cygwinだと必要なHDD容量は2〜3割増し,時間も長めにかかります)
% cd gnu % tar xvzf binutils-2.21.1.tar.bz2 (うまく解凍できない場合は「xvjf」で) % tar xvzf gcc-3.4.6.tar.gz % tar xvzf gdb-7.3.1.tar.gz
% cd binutils-2.21.1 % patch -p0 < ../../patch/patch-binutils-2.21.1-alpha.txt % patch -p0 < ../../patch/patch-binutils-2.21.1-sed-am.txt % patch -p0 < ../../patch/patch-binutils-2.21.1-sed-in.txt % cd ../gcc-3.4.6 % patch -p0 < ../../patch/patch-gcc-3.4.6-alpha.txt % patch -p0 < ../../patch/patch-gcc-3.4.6-gcc4.txt % patch -p0 < ../../patch/patch-gcc-3.4.6-ia64.txt % patch -p0 < ../../patch/patch-gcc-3.4.6-vax.txt % cd ../gdb-7.3.1 % patch -p0 < ../../patch/patch-gdb-7.3.1-centos.txt
# rm -fR /usr/local/cross/<ターゲット名>* # rm -fR /usr/local/cross/*/<ターゲット名>* # rm -fR /usr/local/cross/*/*/<ターゲット名>* # rm -fR /usr/local/cross/*/*/*/<ターゲット名>* # rm -fR /usr/local/cross/*/*/*/*/<ターゲット名>* # rm -fR /usr/local/cross/*/*/*/*/*/<ターゲット名>*
以下は2011/12/30に書いた記事です.
2011/12/30時点での最新の環境を配布します.
おそらくこれが書籍版になると思います.
(2012/02/26追記:さらに更新しました.上の最新版を参照してください)
以下は2011/12/09に書いた記事です.
環境を修正しました.また cross/sample, cross/exec をビルド済みの状態で 配布しますので,とりあえずアセンブラを見てみたいというかたはどうぞ.
以下は2011/12/05に書いた記事です.
以下は2011/12/05時点での最新のクロス環境構築用サンプルです.
環境を自動的に判断するようにビルドスクリプトを修正してあります (FreeBSD, Ubuntu, CentOS, cygwin で動作確認済み). 環境に合わせて build.sh を修正する必要がありません.現在の環境は cross/build/checkenv.sh で確認できます.
gdbのビルド用スクリプトが追加されています.cross/gnu に gdb-7.3.1.tar.gz を 展開し,cross/build/gdb/build.sh を実行することでビルドできます. ビルド後に install.sh でインストールします.
gdb-7.3.1をいちおう以下に置いておきます. もちろんGNUのサイトからもダウンロードできます.
また以下のアーキテクチャについては,gdbのシミュレータ機能を利用して エミュレーション動作させる環境(cross/exec)を追加してあります (そのための簡単なスタートアップとシステムコール呼び出しライブラリを作成して あります).各種アーキテクチャ用の簡単な Hello World が動作可能です.
arm-elf h8300-elf mips-elf powerpc-elf sh-elf avr-elf cris-elf frv-elf m32r-elf m6811-elf mcore-elf mn10300-elf sh64-elf sparc-elf v850-elf
以下のアーキテクチャはネイティブ実行します.
i386-elf
上記シミュレータとネイティブ実行は,cross/exec で make して make run を実行 することで動作します.
また他にも細かい点をいろいろ修正してあります.
以下は2011/10/10に書いた記事です.
以下は2011/10/10時点での最新のクロス環境構築用サンプルです. 以下2011/09/14に公開したものに対して,ビルド用スクリプト, サンプルプログラム等を修正してあります.
また binutils-2.21.1 を利用するように変更されています(以前は binutils-2.21). binutils-2.21.1 は以下,環境構築方法のところからダウンロードできます.
以下は2011/09/14に書いた記事です.
以下は2011/09/14時点での最新のサンプルです.以下2011/09/09に公開したものに対して, サンプルプログラム(sample/{sample.c,ld.scr,Makefile})をさらに修正してあります.
以下は2011/09/09に書いた記事です.
先行して,アセンブラの出力環境を公開しておきます(2011/09/09現在のもの).
興味のあるかたは見たりいじったりしてみてください.binutils-2.21 + gcc-3.4.6 の
組合せで34種類のアーキテクチャのクロス開発環境もどきを構築して,39種類の
アセンブラを出力させています.
(注:現在はさらに改良してあります.とくに理由が無ければ本ページの上のほうの
最新情報を参照してください)
(注1:ここで「もどき」といっているのは,アセンブラ解読を目的として作成した 環境なので,リンカスクリプトは逆アセンブラ解読向けで実開発向けではなく, またスタートアップやライブラリなどが用意されていない,という意味です)
(注2:言うまでもありませんが,ここで説明している内容は無保証です. 試すかたは自分の責任のもとで試してください)
クロスコンパイラ作成には,七誌さんの情報を参考にさせていただきました. ありがとうございます!
以下のアーキテクチャのクロス開発環境を構築しています.(34種類)
alpha-elf, arc-elf, arm-elf, avr-elf, cris-elf, fr30-elf, frv-elf, h8300-elf, hppa-linux, i386-elf, i960-elf, ia64-elf, m32r-elf, m6811-elf, m68k-elf, mcore-elf, mips-elf, mips64-elf, mmix-elf, mn10300-elf, pdp11-aout, powerpc-elf, powerpc64-linux, s390-linux, sh-elf, sh64-elf, sparc-elf, strongarm-elf, v850-elf, vax-netbsdelf, x86_64-linux, xscale-elf, xstormy16-elf, xtensa-elf
以下のアセンブラは,上記環境でコンパイルオプションを変えることによって 出力させています.(5種類)
arm16-elf, avr8-elf, h8300h-elf, m6811s-elf, mips16-elf
(注:上記アーキテクチャは binutils-2.21 + gcc-3.4.6 の組合せでクロス開発環境を 構築できそうなものでなるべくOS依存など無いターゲットを片っ端から構築してみた, というものです.このため私自身,すべてのアーキテクチャをよく知っているという わけではなく,それどころかよく知らないアーキテクチャもいっぱい入っています. またすべてを書籍で扱うわけでもないです.まあお試しで戯れに作ってみた, 軽い気持で見てみよう,くらいの温度で見ていただければと思います)
FreeBSD, Ubuntu, WindowsXP+Cygwinの環境で構築し,出力された逆アセンブラファイル が一致することを確認してあります.
% cd gnu % tar xvzf binutils-2.21.tar.gz % tar xvzf gcc-3.4.6.tar.gz
% cd binutils-2.21 % patch -p0 < ../../patch/patch-binutils-2.21-alpha.txt % cd ../gcc-3.4.6 % patch -p0 < ../../patch/patch-gcc-3.4.6-gcc4.txt % patch -p0 < ../../patch/patch-gcc-3.4.6-alpha.txt % patch -p0 < ../../patch/patch-gcc-3.4.6-ia64.txt % patch -p0 < ../../patch/patch-gcc-3.4.6-vax.txt
patch-binutils-2.21.1-alpha.txt patch-binutils-2.21.1-sed-am.txt patch-binutils-2.21.1-sed-in.txt
# rm -fR /usr/local/cross/<ターゲット名>* # rm -fR /usr/local/cross/*/<ターゲット名>* # rm -fR /usr/local/cross/*/*/<ターゲット名>* # rm -fR /usr/local/cross/*/*/*/<ターゲット名>* # rm -fR /usr/local/cross/*/*/*/*/<ターゲット名>* # rm -fR /usr/local/cross/*/*/*/*/*/<ターゲット名>*
以下は2011年6月に書いた旧記事です.
「フィーリングで読むアセンブラ入門」というような本を書きたいと思っている.
とりあえずクロスコンパイラをビルドしてみた.
で,25種類(!)のアセンブラを軽〜く眺めてみた.
※ 2011/06/25にalpha-elfを追加して,26種類になりました.クロスビルド方法を教えてくださった七誌さん,どうもありがとうございました.alpha-elf用のパッチはこちら
PDP11とかxtensaとか面白い.M6811はなんじゃこりゃ!って感じ. 64KB空間だからなのだと思うけどポインタサイズとか2バイトだし. AVRはマイコンだなあってかんじ.IA64は…なんつーか6バイト命令が 普通になってて,64ビットにもなるとコードサイズとかもうどうでもいいのね.
こうして見ると,昔ながらのCISCはプロセッサごとにクセがあって面白いし, どんなレジスタを持っているのかある程度予備知識が無いと,いきなり読むのは ちと厳しいかも(とくにアキュームレータ方式のやつ). RISCはだいたい似た感じなので,雰囲気でなんとなく読める. SPARCは初めて見たけど,スタックサイズをやたらでかくとっているのが気になる. レジスタウィンドウのせい?thumbやMIPS16は確かにサイズ縮小されているね. V850はH8に似ているなあ.
すっきりしているのはやっぱりPowerPCかMIPSかなあ.ARCもすっきりしているね.