アセンブラ命令メモ
■XCHG命令(Exchange)
第1オペランド(ディスティネーション)で指定されたデータ(レジスタ、又は、メモリ)と、第2オペランド(ソース)で指定されたデータ(レジスタ、又は、メモリ)を交換する
構文 xchg [destination] [source]
例文 xchg ax, bx
■LEA命令(Load Effective Address)
第1オペランド(ディスティネーション)で指定された場所(レジスタ)に、第2オペランド(ソース)で指定されたデータ(メモリ)のオフセットアドレスを転送する
構文 lea [destination] [source]
例文 lea si, [ebp-0x40]
■REP命令(Repeat String Operation Prefix)
カウンタレジスタ(CX)に指定された回数(0にデクリメントされる迄)、ストリング命令を繰り返す。
ストリング命令は、INS、MOVS、OUTS、LODS、STOS、CMPS、SCAS など
構文 rep [Mnemonic]
例文 rep stos DWORD PTR es:[edi],eax
例文の実行前が ecx=15 eax=0x0 edi=0xffffcff8 とする。例文の1行でediに格納されたアドレスにeaxの値を15回コピーする。実行後は ecx=0 eax=0x0 edi=0xffffd030 となり 0xffffcff8 ~ 0xffffd030 に 0x0 が書き込まれた。edi が自動で加算された理由は不明(es:[edi] の記述の意味も分からないが関係しているのかも?)
■stos命令(Store String)
■JA命令
より上(CF = 0 & ZF = 0)
■JAE命令
より上か等しい(CF = 0)
■JB命令
より下(CF = 1)
■JBE命令
より下か等しい(CF = 1 | ZF = 1)
■JC命令
キャリーがある(CF = 1)
■JCXZ命令
CXレジスタが0
■JE命令
等しい(ZF = 1)
■JG命令
より大きい(ZF = 0 & SF = OF)
■JGE命令
より大きいか等しい(SD = OF)
■JL命令
より小さい(SF ! OF)
■JLE命令
より小さいか等しい(ZF = 1 | SF ! OF)
■JNA命令
より上でない(CF = 1 | ZF = 1)
■JNAE命令
より上でなく等しい(CF = 1)
■JNB命令
より下でない(CF = 0)
■JNBE命令
より下でなく等しい(CF = 0 & ZF = 0)
■JNC命令
キャリーがない(CF = 0)
■JNE命令
等しくない(ZF = 0)
■JNG命令
より大きくない(ZF = 1 | SF ! OF)
■JNGE命令
より大きくなく等しくない(SF ! OF)
■JNL命令
より小さくない(SF = OF)
■JNLE命令
より小さくなく等しくない (ZF = 0 & SF = OF)
■JNO命令
オーバーフローがない(OF = 0)
■JNP命令
パリティがない(PF = 0)
■JNS命令
符号がない(SF = 0)
■JNZ命令
ゼロではない(ZF = 0)
■JO命令
オーバーフローがある(PF = 1)
■JP命令
パリティがある(PF = 1)
■JPE命令
パリティが偶数(PF = 1)
■JPO命令
パリティが基数(PF = 0)
■JS命令
符合がある(SF = 1)
■JZ命令
ゼロである(ZF = 1)
■XOR命令
第1オペランド(格納先)を第2オペランド(読み込み元)との間のビット単位のXOR(排他的論理和)演算を行い、結果を第1オペランド(格納先)に格納します。
構文 xor [destination] [source]
例文 xor eax, [ebp-0x40]
gdb コマンドメモ
gdbをファイルを指定して起動
$ gdb ./a.out
main関数の表示
(gdb) disas main
ブレイクポイントの設定(break)
(gdb) b *0x0804845e
ブレイクポイントの表示(info breakpoints)
(gdb) i b
ブレイクポイントの削除
(gdb) d 1
プログラムの実行(run)
(gdb) r
プログラムの再開(continue)
(gdb) c
プログラムを1行ずつ実行(step)
関数の中も1行ずつ実行する。ここで言う一行とは高等言語の1行と思われる。ライブラリ関数はデバック情報がないので関数を抜けるまで実行されるらしい。
(gdb) s
プログラムを1行ずつ実行(next)
関数は1行として実行する。ここで言う1行とは高等言語の1行と思われる。デバック情報がなければ最後まで実行されてしまうらしい。
(gdb) n
アセンブラを1行ずつ実行
(gdb) si
レジスタの値を表示
(gdb) i r
メモリの内容を表示
書式:x/[繰り返す数][表示単位][表示形式] [メモリ表示開始場所]
データの単位(ユニットサイズ)
b(1byte)
h(2byte)
w(4byte)
g(8byte)
表示形式
x(符号なし16進整数値)
d(符号付き10進整数値)
u(符号なし10進整数値)
o(符号なし8進整数値)
a(絶対アドレス、またはシンボルに定義された相対アドレス)
c(文字定数)
f(浮動小数点)
s(null-ターミネートされた文字列、指定されたユニットサイズは無視)
i(アセンブラ・シンタックスでの (もしくは、それに近い) マシン・ インストラクション、指定されたユニットサイズは無視、 1つのインストラクションを構成するバイト数はそのマシンで利用されているオペコードとアドレッシングモードの種類に依存)
(gdb) x/32hs 0xffffcfb8-0x80