アセンブリ言語
アセンブリ言語について
アセンブリ言語(assembly language)とは
アセンブリ言語とは、機械語(バイナリ)を直接記述するのではなく、ニーモニックと呼ばれる人間に理解しやすい形式の命令語でプログラムを記述する、低水準プログラミング言語です。
コンピュータが直接解釈・実行できる言語(マシン語)と1対1に対応した言語を用いて記述するため、高級言語ではできないような詳細な処理制御が可能となります。
ただし、アセンブリ言語は、マイクロプロセッサの種類(命令セットの種類)に依存するため、高水準言語のような移植性はありません。
アセンブラ (assembler) とは
アセンブラとは、アセンブリ言語で記述されたソースコードを機械語に変換するプログラムのことです。
アセンブリ言語のソースコードを機械語プログラムに変換する事をアセンブル(assemble) すると言います。
ニーモニック (mnemonic)
ニーモニックとは、コンピュータが実行可能な機械語を人間が理解/記述しやすいように置き換えた、簡略記憶記号です。
アセンブリ言語のプログラムは、ニーモニックでコーディングし、アセンブラによって機械語に変換します。
ニーモニックはアセンブラによって機械語に変換されるため、「アセンブラコード」などとも呼ばれます。
構文について
アセンブリ言語の記述構文は、「AT&T形式」と「Intel形式」の2つが主流です。
言語仕様により構文が異なりますので、注意が必要です。
(例1)AT&T構文とIntel構文ではソース・オペランドとデスティネーション・オペランドの順序が逆です。
また、AT&T 構文ではレジスター・オペランドの前に % が付きますが、Intel 構文では付きません。
(Intel)
mov eax, 4
(AT&T)
movl $4, %eax
(例2)AT&T 構文では即値オペランドの前に $ が付きますが、Intel 構文では付きません。
(Intel)
push 4
(AT&T)
pushl $4
アセンブラ/アセンブリ言語
gas(GNU Assembler)
GASとは
GAS(GNU アセンブラ)は、gccに付属するx86向けアセンブラです。
基本的にAT&T形式の構文で記述しますが、アセンブラにオプションを指定することでIntel構文を用いることも可能です。
なお、アセンブラはOSやCPUに依存したプログラムとなります。
同じGASプログラムであっても、LinuxとFreeBSD(MAC OS)でもシステムコールの利用方法やサポートされるディレクティブが異なるため、アセンブルできないことがあります。
gccアセンブルについて
gccを用いて、GASファイルからバイナリファイルを生成することができます。
$ gcc gas_file.s -o binary
C言語のコードからアセンブリを生成する
gccコマンドで「-S」オプションを用いるとGASのアセンブリコードが出力されます。
さらに、最適化オプション「-O2」をつけることで可読性が高いコードを出力できます。
$ gcc -S c_src.c
GASの文法
NASM(Netwide Assembler)
Netwide Assembler (NASM) はx86向けのフリーソフトウェアのアセンブラです。
(以前はLGPLライセンスでしたが、その後BSDライセンスに変更されている)
Intel構文で記述し、a.out形式やELF形式など様々なフォーマットで出力可能です。
主要命令語
ORG(origin) | この機械語が実行時にメモリのどこに読み込まれるか。 |
JMP(jump) | 指定ラベルへ移動する。C言語におけるgoto文 |
MOV(move) | 値の代入 |
ADD(add) | 加算代入 |
CMP(compare) | 値の比較 |
INT(interrupt) | 割り込み処理。レジスタの値を読み取り、BIOSが処理を実行。 |
HLT(halt) | CPUを待機状態にする |
$(変数) | 現在の先頭行からのバイト数 |
DB(data byte) | ファイルの内容を1バイトだけ直接書く |
RESB(reserve byte) | 指定した数値分、0x00を書く |
DW(data word) | 2バイト出力 |
DD(data double-word) | 4バイト出力 |
JE(jump equal) | CMPした要素の値が真(等しい)ならばラベルにジャンプ |
JC(jump if carry) | キャリーフラグが1なら指定したラベルにジャンプ |
JNC(jump if not carry) | キャリーフラグが0なら指定したラベルにジャンプ |
JAE(jump if above or equal) | 値を比較し、以上なら指定したラベルにジャンプ |
JBE(jump if bellow or equal) | 値を比較し、以下なら指定したラベルにジャンプ |
JB(jump if below) | 小さければジャンプ |
その他アセンブラ
MASM (Microsoft Macro Assembler)
MicrosoftがMS-DOS上の開発のために製造したx86向けアセンブラ。
マクロと高水準なループ構造、プロシージャ呼び出しなどの構造化プログラミングをサポートしており、高級アセンブラとされている。
Intel構文。
TASM (Turbo Assembler)
Borlandが開発したMASMと互換性の高いx86向けアセンブラ。
Z80アセンブラ
Z80とは、米国ザイログ社によって製造された 8ビット・マイクロプロセッサーです。
MSX(1983年に米マイクロソフトとアスキーによって提唱された8ビット・16ビットのパソコンの共通規格の名称)で動作するアセンブラです。