Memo

メモ > 技術 > プログラミング言語: Assembly > アセンブリ言語 メモ

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

Advertisement