*命令*
・mov dest, src
・lea dest, src
lea命令は、src
オペランドのアドレスを計算し、そのアドレスをdestオペレンドにロードする
lea eax,[esp+0x40]のように、変位などを含めたアドレス計算をする(この場合スタックポインタを指すアドレスから変位の0x40を加えた位置のアドレスが、eaxに格納される)
・xchg dest1, dest2
・lodsb
lodsb命令は、[DS:ESI]のメモリの内容を、BYTE、すなわち1バイト分、AL
レジスタに読み込む
読み込んだ後は、ESI
レジスタを、DF
レジスタに基づいて、読み込んだサイズ分、加算または減算する
lodsw命令は、WORDの2バイト分、AX
レジスタに読み込む
lodsd命令は、DWORDの4バイト分、EAX
レジスタに読み込む
メモリの値を決まったバイト数ずつ処理する場合に用いられ、文字列処理などでよく使う
・stosb
stosb命令は、lodsb命令の反対でAL
レジスタの値を、[ES:ESI]のメモリに書き込む
・push src
push命令はarg
オペランドの値をスタックにpushする(32bitでは4バイト、64bitでは8バイト)
・pop dest
加算する
・add dest, src sub dest, src
sub命令はこの減算バージョン
・mul
・div src
・inc dest dec dest
inc命令とdec命令は、それぞれ、dest
オペランドの値を1加算/減算する
・cmp src1, src2
cmp命令はsub命令と同じだが、結果は
オペランドに格納されず、破棄される
目的は、フラグ
レジスタの値を条件によって変化させること
・xor dest, src
・test src1,src2
cmp命令と同じく、結果は破棄され、フラグ
レジスタの変化が主な目的
・jmp arg
フラグ
レジスタを参照して、条件が満たされた時のみ分岐する条件分岐命令もある
JE命令(Jump if equal) JZ命令(Jump if zero):ZF=1の時に分岐
JNE命令(Jump in not equal) JNZ命令(Jump if not zero):ZF=0の時に分岐
JG命令(Jump if greater):ZF=0かつSF=OFの時に分岐
JL命令(Jump if less):SF<>OFの時に分岐
・ret命令
callと対になる命令で、callされた関数の終わりに、call元の次のアドレスへと実行を戻すための命令
・call arg
call命令は、jmp命令と同様に、実行をarg
オペランドへと分岐させる
ret命令で戻ってこれるようにcall命令の次の命令のアドレスを、戻り先のアドレスとしてスタックに保存する
・leave
leave命令は、データ転送命令だが、ret命令とセットで使われることが多い
この命令は、関数の最後、ret命令の前に呼び出され、スタックポインタをベースポインタと同じ位置に戻し、
スタック上に保存していた呼び出し元の関数のスタックフレームでのベースポインタを復元する
つまり、mov esp,
ebp;pop
ebpと同じ動作をする
・EAX(アキュムレータ
レジスタ):演算の結果を格納する
・ECX(カウンタ
レジスタ):ループの回数などのカウントを格納する
・EDX(データ
レジスタ):演算に用いるデータを格納する
・EBX(ベース
レジスタ):アドレスのベース値を格納する
・ESI(ソースインデックス
レジスタ):一部のデータ転送命令において、データの送信元を格納する
・EDI(デスティネーションインデックス
レジスタ):一部のデータ転送命令において、データの転送先を格納する
・
EBP(ベースポインタ
レジスタ):現在のスタックフレームにおける底のアドレスを保持する(ベースポインタともいう)
・ESP(スタックポインタ
レジスタ):現在のスタックトップのアドレスを保持する(スタックポインタともいう)
・EIP(インストラクションポインタ
レジスタ):次に実行する
アセンブリ命令のアドレスを保持する(命令ポインタともいう)
*フラグ*
・CF(キャリーフラグ):演算命令でキャリー(桁上がり)かボロー(桁借り)が発生した時にセットされる
・ZF(ゼロフラグ):操作の結果が0になった場合にセットされる
・SF(符号フラグ):操作の結果が負となった場合にセットされる
・DF(方向フラグ):ストリームの方向を制御する
・OF(オーバーフローフラグ):符号付き算術演算の結果が
レジスタの格納可能範囲を超えた場合にセットされる
・CS(コードセグメント
レジスタ):コードセグメントのアドレスを格納する
・DS(データセグメント
レジスタ):データセグメントのアドレスを格納する
・SS(スタックセグメント
レジスタ):スタックセグメントのアドレスを格納する
・ES(エクストラセグメント
レジスタ):エクストラセグメントの(追加セグメント)のアドレスを格納する
・FS(Fセグメント
レジスタ):Fセグメント(2つめの追加セグメント)のアドレスを格納する
・GS(Gセグメント
レジスタ):Gセグメント(3つめの追加セグメント)のアドレスを格納する
・DWORD PTR
これは対象の値(や
レジスタ)を何バイトとして扱うか、ということを修飾する
DWORDは4バイト、WORDは2バイト、BYTEは1バイト
・callしたら次の命令の番地をスタックに積んで戻るべき場所を記録しておく
・plt(プログラムリンケージテーブル)とは、共有ライブラリから呼び出される個々の関数は、それぞれのエントリをPLTに持っていて、静的にリンクされるので直接呼び出される