熱血!アセンブラ入門 サポートページ
(旧:フィーリングで読むアセンブラ入門)
アセンブラ出力環境の構築のためのアーカイブ(書籍版)を以下で配布します.
(2013/08/26版)
注意! 64ビット環境だとうまくビルドできないアーキテクチャがあります.
詳しくは以下の注意1を参照してください.
以下でビルド済みのVMイメージを配布しているので,
そちらの利用も検討してください.
- cross-20130826.tgz:ライブラリ無し版(tgz形式)
- cross-20130826.zip:ライブラリ無し版(zip形式)
- cross2-20130826.tgz:newlib利用版(tgz形式)
- cross2-20130826.zip:newlib利用版(zip形式)
※「tgz形式」と「zip形式」は圧縮方法が異なるだけで内容は同じです.
tgzはFreeBSDで標準で操作できるため単に筆者がtgzをよく使うので,tgzでも
配布しているというだけです.
※「ライブラリ無し版」(cross)に対する「newlib利用版」(cross2)の違いは,
以下の2点です.
- gccのビルド時にnewlibを同時にビルドするようになっている.
(このためnewlibもインストールされる)
- printf()利用のサンプルである「printf」というフォルダが追加されている.
※「newlib利用版」には,「printf」というフォルダにprintf()利用のサンプル
があります.9種類のアーキテクチャでprintf()で文字列出力しています.
(スタートアップとシステムコール呼び出しは,ライブラリを使わず
自前でやっています.つまりlibglossは(ビルドはしていますが)使っていません).
※基本として「newlib利用版」(cross2)は「ライブラリ無し版」(cross)の
上位互換になっています.
HDDに余裕があれば「newlib利用版」,なるべくコンパクトに済ませたければ
「ライブラリ無し版」を利用してください(必要はHDDサイズはこのページの下のほうに
あります).アセンブラのサンプル出力(cross/sample)やシミュレータでの実行結果
(cross/exec)は同じになることを確認してあります.
上記アーカイブファイルは,環境構築用スクリプトとパッチ類,サンプルプログラム,
またサンプルプログラムをビルドしてアセンブラを出力した状態でアーカイブして
あります.このため解凍すれば,とりあえずは(環境構築無しでも)アセンブラを
見てみることができます.
(2013/01/26追記:上記環境をインストール済みのVirtualBox用VMイメージを
こちらで配布しています.ご自由に利用ください.
ゲストOSはFreeBSDで軽いので,非力なPCでも動作可能です)
FreeBSD, CentOS, Ubuntu, WindowsXP+Cygwinで環境構築し,出力された
逆アセンブラファイルが一致することを確認してあります.
- アセンブラのサンプル(cross/sample)は以下の39種.
alpha, arc, arm, arm16, avr, avr8, cris, fr30, frv, h8300,
h8300h, hppa, i386, i960, ia64, m32r, m6811, m6811s, m68k, mcore,
mips, mips16, mips64, mmix, mn10300, pdp11, powerpc, powerpc64, s390, sh,
sh64, sparc, strongarm, v850, vax, x86_64, xscale, xstormy16, xtensa
- HelloWorld実行のサンプル(cross/exec)は以下の18種.
(i386以外の17種はGDB付属のシミュレータでの実行.i386はネイティブ実行)
arm, arm16, avr, cris, frv, h8300, i386, m32r, m6811, mcore,
mips, mips16, mn10300, powerpc, sh, sh64, sparc, v850
- printf()利用のサンプル(cross2/printf)は以下の9種.(cross2のみ)
(i386以外はGDB付属のシミュレータでの実行.i386はネイティブ実行)
arm, i386, m32r, mcore, mips, mn10300, powerpc, sparc, v850
さらに自身のPCに環境構築すれば,自分でアセンブラ出力させていろいろ試すことが
できます.
環境構築には binutils-2.21.1, gcc-3.4.6, gdb-7.3.1 を必要とします.
また「newlib利用版」を使えば,printf()などの標準ライブラリ関数を利用する
ことができます.(この場合は newlib-1.20.0 を必要とします)
binutils, gcc, gdb はGNUのサイト,
newlib はRedHatのサイトから
ダウンロードできます.いちおうオリジナルを以下でも配布します.
環境構築の手順については,添付のREADMEを参考にしてください
(基本作業はすべてスクリプト化してありますので,スクリプトを実行するだけです).
マルチコアのPCの場合は,ビルド前に config.sh の makeopt のコメントを外して
-j オプションを有効にしてやるとビルドが高速になるのでおすすめです.
gdbが不要な場合(アセンブラ出力だけさせたくて,シミュレータ実行は不要な場合)は
gdbのビルドを外してスクリプト実行してください.(付属のシェルスクリプトは
簡単なものばかりなので,読めばわかると思います)
(注意1)x86-64のプラットホーム上ではうまくビルドできないアーキテクチャが
いくつかあります.この場合はVM利用でx86アーキテクチャ上にUbuntuとか入れて
そっちで環境構築するか,必要なアーキテクチャだけ選択してビルドすることを
おすすめします.
※ arc, fr30, frv, i960, mcore, v850 の6種類のアーキテクチャがビルドに失敗
します.またARM系のアーキテクチャ(arm, strongarm, xscale-elf)ではアセンブラ
出力が異なってくるようです.
※ h8300, m68k も標準のままではビルドに失敗するのですが,これらは修正パッチが
既に出ていて,本書の環境でも同等のパッチを包含しているので,とりあえずは
問題は起きません.
h8300向け修正情報
m68k向け修正情報
(注意2)
環境構築の際には,システムにあらかじめインストールしておく必要があるツール類
があります.詳しくは過去の記事を参考にしてください.
構築に失敗した場合は,まずは未インストールのツール類が無いか,確認してみて
ください.(失敗したアーキテクチャのビルドディレクトリで再度 make することで,
エラーメッセージを確認できます)
(注意3)
makeoptの-jオプションを付加して実行すると高速なのですが,まれにビルドに
失敗する?ことがあるように思います(あまりきちんと検証していないので,
不確かな情報です).もしも「あれ?」と思ったときは,-jオプションを外して
再度試してみてください.まあ不安ならば,makeoptは有効にせずにデフォルトのまま
使うのがいいでしょう.
(2012/10/20追加情報)
gdb/mn10300-elf のビルドに決まって失敗しインストールされないようです
(cross/cross2の両方で,FreeBSD, Ubuntu, CentOS, Cygwin全てで失敗).
さらに,その後に cross/build/gdb/mn10300-elf で make ; make install すれば,
(-jオプションはそのままでも)今度はうまくいくようです
(Ubuntuでは make install がエラーになったが,gdb自体はインストールされている
ようだ).
オプションはそのままなのになぜうまくいくのか原因は謎….
それ以外は大丈夫みたいです.
(2012/10/22追加情報)
gdb/sim/mn10300/Makefile.inでファイルの依存関係の記述が不足しているため,
-jオプションにより並列コンパイルするとエラーになることが判明しました.
修正パッチを含めてアーカイブを作成しなおしましたので,最新版の環境を利用すれば
大丈夫です.(Ubuntuでは上記同様に make install がエラーになりましたが,gdb自体
はインストールされているようです)
全てのアーキテクチャ用のクロスコンパイラをビルドしようとすると,
以下の容量が必要になります.(cygwinだと2〜3割増しになります)
- ビルドディレクトリ... crossは7GB程度,cross2は15GB程度 (インストール後に削除可)
- インストール先 ... crossは2.5GB程度,cross2は4.5GB程度
また時間も数時間〜数日(!)かかります(PCのスペックによります).
さらにnewlib利用のcross2だと,時間はだいたい倍くらいかかる感じです.
Cygwinだとさらに時間がかかる感じです.ビルドディレクトリ(crossを展開する
ディレクトリ)がUSBハードディスクやネットワークストレージ上にあると,
とてつもなく遅くなると思われるのでおすすめしません.
基本,しばらく電源いれっぱなしにする前提で始めてください.
さらに,この手の作業は何かの理由で1回か2回くらいはやりなおす可能性も
多いと思うので,一発で終わるとは思わずにそんなようなつもりでやってみて
ください.(VPSなど契約してそっちでやるととてもラクでおすすめです)
変更履歴は以下です.
- 2012/12/16版→2013/08/26版
- toolchain, build 以下のスクリプトをgcc4版に合わせて全面アップデート.
- 2012/10/22版→2012/12/16版
- m68k向けのx86_64ビルド用パッチの不備を修正.
(旧版では GEN_INT (-2147483648) のようになっていたが,これだと渡す値の
型がおそらく long long になってしまうので,GEN_INT (-2147483647 - 1)
のように修正する.gcc-4.7.2のソースコードにも同様の対応が入っている
ことを確認)
- AVRのシミュレータ用スタートアップ(lib-avr-elf.S)で,r1レジスタを
ゼロクリアする対処を追加.(AVRではr1はゼロになっていることを期待した
コードが生成される.おそらくシミュレータでの実行時は各レジスタはゼロに
初期化されているのでシミュレータ上では問題は起きないが,一応修正しておく)
- SPARCシミュレータでの実行時にWatchdogタイマを切る対応を追加.
(これをやらないと,長い処理を走らせたときに途中で中断してしまう)
- 2012/10/18版→2012/10/22版
- make -j オプション利用でMN10300がビルドエラーになる問題の対策
(Makefileの不備を修正した)
- 2012/02/26版→2012/10/18版
- cross2(newlib利用版)を追加.
- パッチをいくつか追加.
- セットアップ用スクリプトを追加.(setup.sh)
- 掃除用スクリプトを追加.(clean.sh)
- 全ビルド用スクリプトを追加.(build-install-all.sh)
- スクリプト構成を全体的に見直し.
- --disable-werror を追加.(最新のUbuntuに付属のgccでエラーになったため)
- MMIXをELFで出力するように修正.(-melf オプション)
- make の -j オプション対応を追加.(デフォルトで無効.使うときは自分でコメントを外す)
- READMEを追加.
- ライセンス文書を追加.(ライセンスはKL-01)
以下は旧版です.いちおう配布しますが,とくに理由無ければこのページの一番上の
最新版を利用してください.
- 2012/12/16版
- 2012/10/22版
- 2012/10/18版
メールは kozos(アットマーク)kozos.jp まで