X86アセンブラ/x86アセンブラ

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

x86アーキテクチャにおいて、多数のアセンブラ言語が利用可能である。ここでは、アセンブラ言語を幾つか挙げる。そして、入手可能な場所, 長所, 適用分野に関して述べる。

また、本ページの後半では、NASMを例にインストールや初期設定などの方法を述べる。アセンブラは一般のアプリとは若干、セットアップ方法や使い方が違うので、本書を読者の参考にしてもらえればありがたい。


GNUアセンブラ(GAS)[編集]

Wikipedia
ウィキペディアGNUアセンブラの記事があります。


GNUアセンブラは最も一般的で、GNUコンパイラコレクションのバックエンドとして働いている。GAS(しばしばGASと略される)でのプログラムを学ぶ最も説得力のある理由は、GNU CコンパイラのインラインアセンブリはGASの文法によらなくてはならないということであろう。GASはアセンブリ言語で書くのにAT&T記法を使っており、人によってはより複雑になっていると不平を言い、人によってはより情報が含まれていると言うものである。

一般的な Linux のデスクトップ版では(Fedora31で確認ずみ)、初期状態ですでにGASが入っており、リンカなどの設定が完了しており、(c言語形式のソースファイルさえあれば)あとはアセンブルコマンドを入れるだけでアセンブリコードなどにコンパイルできるようになっている。

一般的な Linuxでは、下記のMASMやNASMはインストールの必要は無い。MASMやNASMを入れなくても、C言語ファイルをアセンブリコードにコンパイルできる。


GCC は、コンパイルに使用しているWindows上やLinux上で動く実行ファイルを作るのが簡単である。gcc でコンパイルすれば、特に指定しないかぎり、そのホストOSで動くファイル形式の実行ファイルにしてくれる。

このため、gccでの標準コンパイルでは、アセンブラで記述したコード以外にも、Windowsの実行ファイル形式であるPEフォーマット化をするための情報が多く追加されたり、あるいはLinuxなら実行ファイル形式であるELF形式にするための情報が追加される。

いっぽう、アセンブラを対応する機械語コードに直訳するのは、可能であるが、やや面倒である。(※ ネット上に、資料が不足している。)(※ アセンブラで記述したことだけを機械語にしたいなら、 nasm のほうが簡単である。)

このため、学習の目的に応じて、gcc を使おう。


Microsoft Macro Assembler (MASM)[編集]

Wikipedia
ウィキペディアMicrosoft Macro Assemblerの記事があります。


マイクロソフトマクロアセンブラ (MASM) は、本当に長い年月、一貫して使われてきた。かつて有料であったが、現在は無料である。マイクロソフトは否定している文句だが、多くの人々は、MASMはサポートされていないし、今以上改善されることもないと文句を言われてもいる。マイクロソフトの主張では、MASMはメンテナンスされているし、現在もバグの修正が行なわれていると主張している。現在、新しい機能は追加されていない。しかし、マイクロソフトは新しい64ビットコンパイラスイートと一緒に64ビット版のMASMを出荷している。MASMはまだマイクロソフトから入手することができる。1つの方法は、MSDNからダウンロードすることであり、もう1つの方法は、Microsoft DDKの一部として入手することである。現在入手可能なMASMのバージョンは8.xである。

MASMは、Intel記法を採用している。AT&T記法を採用しているGASとは違う。最も違うのは、MASMの命令はGASの場合とオペランドの順が逆であるということである。この事実は、おそらく人々がGASとMASMの間を行き来するのを妨げている最大の理由であろう。

MASMは非常に強力なマクロエンジンを持っており、多くのプログラマはMASMでプログラムを書く際に高水準言語風に書くのに使っている。

外部リンク[編集]

JWASM[編集]

Wikipedia
ウィキペディアJWASMの記事があります。


JWASMは16、32、64ビットに対応したx86プラットフォーム用のアセンブラであり、Open WatcomのWASMをベースとして、Japheth氏によって作られた。MASMと文法に互換性があり高速で、ソースコードはSybase Open Watcom Public Licenseの下でフリーで入手できる。つまり、商用非商用を問わずに自由に使うことができる。これらに加え、ELF形式をサポートしており、これにより広く使われているMASMの文法をサポートした唯一のクロスプラットフォームのアセンブラとなっている。JWASMは活発に開発されており、一般的には非公式なMASMの後継とみなされている。

外部リンク[編集]

Netwide Assembler (NASM)[編集]

Wikipedia
ウィキペディアNetwide Assemblerの記事があります。


NASM による機械語の翻訳では、PEフォーマットなどの付加情報をつけずに、アセンブラで記述したことだけを、そのまま対応する機械語に翻訳してくれる方式が、標準的な設定になっている。

このため、もしブートローダなどのBIOS周辺のOS部分や、あるいは小さい組み込みOSなどを作りたいなら、gcc でなく nasm が適切かもしれない。


NASM (Netwide Assembler) は、フリーな、x86プラットフォーム用コードを生成するx86以外のプラットフォームでも動作するアセンブラを作ることを目的に作り始められた。NASMプロジェクトが始められた時、MASMはまだマイクロソフトによって販売されており(MASMは現在は無料である)、GASはエラーチェック能力が非常に不足していた。というのは、GASはGCCのバックエンドであり、GCCは常にGAS文法に適合したコードを生成するからである。このため、GASはユーザの求めるインターフェースを持つ必要がなく、GAS用のコードを書くのは非常に大変であった。NASMの文法は、インテル記法に近いが複雑さのより少ないものである。

NASMのユーザマニュアルは http://www.nasm.us/doc/ で読むことができる。

特徴:

  • クロスプラットフォーム: GASと同様にNASMはほとんど全てのプラットフォームで動き、PowerPCを搭載したMacでさえ動く(しかし、生成されたコードはx86プラットフォームでしか動かない)。
  • オープンソースである。
  • マクロ言語(コードを書くコード)を持つ

Flat Assembler (FASM)[編集]

Wikipedia
ウィキペディアFASMの記事があります。

アセンブリで書かれているが、MS-DOSやDexOS、Linux、Windows、BSDといったいくつかのオペレーティングシステムで動く。FASMの文法はTASMの「idealモード」やNASMと似ているが、FASMのマクロは異なる。

特徴:

  • FASM自身で書かれており、ソースコードはFASMでどのように書くかの例となる
  • クリーンでNASMに似ている文法
  • 非常に非常に高速である
  • マクロ言語(コードを書くコード)を持つ
  • MS-DOSとWindows用には、内蔵のIDEを持つ
  • リンカなしでMZ、PE、ELF、COFFのバイナリを作ることができる

外部リンク[編集]

Yasmアセンブラ[編集]

Wikipedia
ウィキペディアYasmの記事があります。


Yasmは、修正BSDライセンスでNASMを一から書き直したものである。Yasmは複数の文法をネイティブに解釈するように設計されている(現在はNASMとGASの文法をサポートしている)。Yasmの第一の目的は、低水準のコードとはたらく再利用可能で、他のソフトウェアプロジェクトに簡単に統合できるようなライブラリlibyasmを作ることである。

外部リンク[編集]

HLA[編集]

Wikipedia
ウィキペディアHigh Level Assemblyの記事があります。


HLAはRandall Hydeによって作られたアセンブラフロントエンドであり、最初に彼の著書である「The Art of Assembly」で広まった。

HLAでは高水準のフォーマットを使ってアセンブリ言語を書き、コードを他のフォーマット(通常はMASMかGAS)に変換する。他のアセンブラ(MASMかGAS)で命令を機械語にアセンブルする。


セットアップ方法など[編集]

NASMを例に、アセンブラ言語のインストール方法や、初期設定などの方法を説明する。

ほかのアセンブラでは若干違う部分もあるかもしれないので、適宜、応用せよ。

インストール方法

(Windows版の場合)

※ ネットを調べても、Windows版のインストール方法の説明で詳しいのが無かったので、wikibooks日本語版でまとめておく。
  1. まず、公式サイトからWindows版NASMのインストーラーをダウンロードしてくる。
  2. インストール後のファイルを格納するためのフォルダを、ホームフォルダに作っておく(べつに他のフォルダでもいいが、ホームフォルダ内に子フォルダを作っておけば後の作業が簡単である)。関連ファイルが大量に作られるので、必ずフォルダを作っておくこと(でないと、ホームフォルダ内の最初の階層に大量の関連ファイルが作成されてしまい、見づらくなってしまう)。とりあえず「nnnn」とでもインストール用フォルダに名前をつけておく(あとからフォルダ名は変えられる)。
  3. 続けて、管理者権限(ダウンロードしてきたインストーラーにマウスカーソルをあわせて右クリック→プロパティで設定できる)で、インストーラーを実行する。このとき、さきほど作成した「nnnn」の中にインストールするようにする。
  4. これでインストールは成功するハズである。

このほか、NASMでexeファイルなどの実行ファイルを作りたい場合はリンカとして GCCが必要なので、Windowsの場合ならMinGWもインストールする必要がある。(または Visual Studio からリンカを持ってくる。)

もしexeファイルを作るのではなくて、ブートローダなどのよう電源投入直後のBIOS環境で機械語で動くプログラムを作りたいならGCCは不要だが(ただし、ブートローダを作る場合でも開発にQEMUなどのエミュレータが必要になる)、しかし初心者は、まずexeファイルを作るのから慣れよう。

下記のセットアップ解説では、特にことわらないかぎり、NASMでexeファイルを作労とする場合の方法について説明する。

GCC以外のリンカでもいいようだが(「ALINK」というリンカソフトがあるらしい)、マイナーなので、GCCを紹介しておく。なお、GCC内部のGNU製の「ld」(エルイデー)というプログラムをリンカに代用しているようである。


起動方法
  1. Windows版NASMはコマンドプロンプトから起動するアプリなので、まずコマンドプロンプトを開く。(一方、もし左下スタートメニューの「すべてのプログラム」から、たどって、「nasm」のメニュ-をクリックしても、黒いウィンドウが一瞬表示されるだけで、すぐに終了してしまう。)
  2. コマンド cd nnnnで、さきほど作成した「nnnn」フォルダに移動する。「cd」とは、「参照ディレクトリ(directory)を変更(Change)せよ」という意味のUnixコマンド。ウィンドウズも一部、Unixコマンドを採用している。
  3. すると、下記のように参照先フォルダがnnnnフォルダに移る。
Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\ユーザー名>cd nnnn

C:\Users\ユーザー名\nnnn>

  1. コマンド「nasm -h」を入れてみて(引数 -h はヘルプファイルのこと。unixコマンドでは引数は一般に「-」をつけて区別する)、使用法の説明が表示されればインストール成功。
C:\Users\ユーザー名\nnnn>nasm -h
usage: nasm [-@ response file] [-o outfile] [-f format] [-l listfile]
            [options...] [--] filename
    or nasm -v (or --v) for version info


Response files should contain command line parameters,
one per line.

    -t            assemble in SciTech TASM compatible mode
    -E (or -e)    preprocess only (writes output to stdout by default)

のような画面が出る(長いので冒頭の一部だけを紹介)。

使い方
  1. これから「nnnn」フォルダ内をいじるが、初期状態を保存するために、右クリックでコピーして「nnnn - コピー」を作っておいて、コピーフォルダのほうを「nnnn - 初期状態」とでも名前を変えておく。下記の作業は、もとの「nnnn」ファイルで行う。
  2. まず、アセンブルしたいソースコード自体は、『メモ帳』などのテキストエディタで作成しておき、(Windows版NASMを使い場合なら)ソースコードの拡張子に「.asm」とつけて保存しておく。たとえば「qqqq.asm」というファイルとしよう。とりあえず、ネットに転がってる、アセンブラ用のHello Wowldプログラムを書いたとしよう。
  3. これ「qqqq.asm」を先ほど作成したインストール用ファイル「nnnn」フォルダの中に入れておく。
  4. コマンドC:\Users\ユーザー名\nnnn>nasm -fwin32 qqqq.asmを実行。-fとは、出力フォーマットの指定。-fwin32でWindows用32ビット用で出力。
  5. すると、オブジェクトファイル「qqqq.obj」が作成される。
  6. この後、リンカとしてMinGW(ウィンドウズ版GCC)を使うのでC:\Users\ユーザー名\nnnn>gcc qqqq.obj -o xxxx.exeを実行。「xxxx」は伏字でなく、そういう名前をつけたファイル(私が勝手に決めた。他の名前にしてもいいが、下記のコマンドも対応する名前の部分は変更してコマンド実行すること。)。
  7. C:\Users\ユーザー名\nnnn>xxxx.exeを実行。
C:\Users\ユーザー名\nnnn>xxxx.exe
Hello, World

みたいにハローワールド文が表示されれば成功。

このほか、いろんなコマンドや各種のソースコードをテストしていくと、どんどんオブジェクトファイルや実行ファイルが作成されていくので、見づらくなってくる。もしファイルが増えすぎて見づらくなってきたら、保管しておいた「nnnn - 初期状態」をコピーして、あらたにそれを「nnnn」とすれば、初期状態に戻せるので便利。


なお、インストール先のフォルダは、通常、

C:\Users\ユーザー名\AppData\Local\bin\NASM

みたいなフォルダになる。

これはフォルダ位置を検索する際に、特定のユーザー名に依存していて不便である。

しかし、この位置を変えてもインストール中にエラーが発生するので、残念ながら、そのままにしておこう。

Windowsで環境変数のパスに追加したい場合は、

;C:\Users\ユーザー名\AppData\Local\bin\NASM

を環境変数に追加すればいい。「ユーザー名」の部分は、各自のパソコンのユーザー名に変えること。

なお、パス追加後のコンパイル対象のファイルの入力元および出力先は、特に設定変更などを指定しないかぎり、入力元・出力先はホームフォルダである。