■アセンブリ言語 メモ
■機械語(マシン語)
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進数)