■機械語(マシン語)
CPUが理解できる、2進数の命令。(電気信号の高低。)
具体的には以下のようなコード。
01010101 10001001 11100101
桁が多くなりすぎて人間には読みづらいため、通常は16進数で扱う。
55 89 e5
■アセンブリ
アセンブリ … アセンブリ言語のこと。
アセンブラ … アセンブリ言語を機械語に翻訳する処理系のこと。
アセンブル … アセンブリ言語を機械語に翻訳すること。
機械語とアセンブリの命令は一対一なので、単純に以下のように置換できる。
55 … pushl %ebp
89 … movl %esp,
e5 … %ebp
よって「55 89 e5」は以下の意味となる。
pushl %ebp
movl %esp, %ebp
単純な置換なので、コンピュータの仕組みを理解してプログラミングする必要がある。環境にもベッタリと依存する。
このような言語を「低級言語」と呼ぶ。C言語など、環境に依存しにくくした言語を「高級言語」と呼ぶ。
■記法
アセンブリには2つの記法がある。
大きくは変わらないが、書き方が少し異なる。
Intel記法 ... コンパイラNASMが扱う記法。Intel社が開発した。
AT&T記法 ... コンパイラGASが扱う記法。AT&T社が開発した。
Linuxのgccがディスアセンブルで書き出すコードと互換性があるため、以降こちらを使う。
■レジスタ
CPUの内部にある、小型記憶装置。電源を切るとデータは消える。
レジスタのサイズが32ビットなら「32ビットのCPU」と呼ばれる。
汎用レジスタ。(プログラマがいじってもいいレジスタ。)
eax … アキュムレータ。何に使ってもよい。
ebx … ベースレジスタ。32ビット環境ではeax同様。
ecx … カウントレジスタ。ループカウンタなどに使う。
edx … データレジスタ。データ格納などに使う。
esi … ソースインデックス。メモリアドレス格納などに使う。
edi … ディスティネーションインデックス。esi同様。
ebp … ベースポインタ。
esp … スタックポインタ。
セグメントレジスタ。
cs ... コードセグメント。
ds ... データセグメント。
ss ... スタックセグメント。
es ... エクストラセグメント。
fs
gs
フラグレジスタ。
eflags … フラグ。各種状態が基本一ビットずつ入っている。
命令ポインタ。
eip … インストラクションポインタ。次に実行すべきコードのアドレスが入っている。
■レジスタの名前
32ビット環境では eax, ebx, ecx, edx となっているが、
16ビット環境ではeを除いて ax, bx, cx, dx となっている。
64ビット環境ではeがrになり rax, rbx, rcx, rdx となっている。
eax, ebx, ecx, edx に限り、下位16ビットの ax, bx, cx, dx を
上記8ビットを ah, bh, ch, dh、下位8ビットを al, bl, cl, dl に分けることができる。(「h」と「l」はそれぞれ「high」「low」の意味。)
■システムコール
OSの機能を呼び出す。
各レジスタに決められた値をセットし、int命令を使うことで呼び出せる。
eax にシステムコール番号、ebx, ecx, edx には第1引数〜第3引数(にあたるもの)をセットする。
以下は msg を表示(標準出力に書き込み)する例。
movl $4, %eax ... writeシステムコール番号は4。
movl $1, %ebx ... 標準入力は0、標準出力は1、標準エラー出力は2。
movl $msg, %ecx ... 出力するデータの先頭アドレス。
movl $13, %edx ... 出力バイト数。(msgの長さ。)
int $0x80 ... 割り込み命令。システムコールの実行は80。(16進数。)