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