ホーム ざれごと ワシントン州 ツール NT豆知識 Win32プログラミングノート 私的用語 ジョーク いろいろ ゲーム雑記 Favorites 掲示板 Mail
AMD64に関するお勉強メモ。間違ってても責任は持てん。でも何か気がついたらメールで教えてください。
このお勉強ノートのGoalは、一般的な、純粋に論理を扱うプログラムのディスアセンブリが読めること。 入出力やメモリマネージメント(ヒープじゃなくて、メモリマッピングなどのこと、念のため)・コンテクストスイッチングなどCPUべったりのOS的オペレーション、マルティメディア系のパラレル演算や、 浮動小数点演算な どは積極的には扱わない。
また、AMD64系プロセッサの概論や特徴などは、ニュースサイトをはじめとして解説系まで他にいくらでもWebサイトがあるので、ここでは省略する。
強力に工事中。
ia32 のレジスタは、ax が 16 ビット、eax が 32 ビットであった。 さらに AMD64 のレジスタセットでは、rax という名前で 64 ビットのレジスタが用意される
64ビットレジスタは、以下 rbx, rcx, rds, rsi, rdi, rip, rsp, rbp と続く。 セグメントレジスタは(いまやセレクタなのだが) cs, ss, ds, es, fs, gs で相変わらず 16 ビット。
さらに、64ビットモードでのみ使用可能なレジスタが r8 〜 r15 の8個追加されている。
rax=0000000000000000 rbx=0000000000000003 rcx=0000000000000003 rdx=00000000ffff008a rsi=00000000c0000005 rdi=0000000000000000 rip=fffff80000902bc0 rsp=fffffadf8e0829a8 rbp=0000000000000000 r8=00000000ffffffff r9=0000000000000000 r10=0000000000000000 r11=0000000000000000 r12=fffff97fff0b4cc9 r13=000000000000003b r14=0000000000000000 r15=fffffadf8e083840 iopl=0 nv up ei ng nz na pe nc cs=0010 ss=0018 ds=002b es=002b fs=0053 gs=002b efl=00000282
引数は左から4つが rcx, rdx, r8, r9 に入れられる。 残りのパラメータは、右から左にスタックにプッシュされる。 ただし、左から4つ分のスタックも確保される。 これにより、呼び出し側が引数をセーブする際スタックを新たに確保する必要はない。 この4つ分の値は未定義であるが、デバッグ用ビルドではフィルされているかもしれない。
スタックの撒き戻しは、呼び出し側が行う。 呼び出し側では、関数呼び出しが連続する場合でもスタックを撒き戻す必要がない。
引数が64ビットより小さい場合、引数の符号拡張は呼び出し側では行われず、呼ばれるほうが符号拡張ないしゼロ・エクステンドする。 プロトタイプを間違えると悲惨な結果になる。
引数が64ビットより大きい場合一時コピーがスタック上に作られ、そのオブジェクトをさすポインタが渡される。
レジスタは、rax, rcx, rdx, r8 〜 r11 を除いて保存されなければならない。
戻り値が64ビットより小さければ、戻り値は rax に保存される。 戻り値が64ビットより大きければ、呼び出し側が用意したスタック上のスペースに格納することとし、それへのポインタを隠れた第1引数とする。
引数ひとつにつきスタックは8バイト消費される。 スタックは16バイトアラインが基本だが、関数を呼び出す側は補正しない。 関数の呼び出し時に引数が奇数個ある場合、呼び出された側で補正する必要がある。
関数の先頭 fffff97f`ff0b4a60 4c894c2420 mov [rsp+0x20],r9 fffff97f`ff0b4a65 4c89442418 mov [rsp+0x18],r8 fffff97f`ff0b4a6a 89542410 mov [rsp+0x10],edx fffff97f`ff0b4a6e 4881ece8000000 sub rsp,0xe8 fffff97f`ff0b4a75 48899c24e0000000 mov [rsp+0xe0],rbx fffff97f`ff0b4a7d 4889b424d8000000 mov [rsp+0xd8],rsi fffff97f`ff0b4a85 4889bc24d0000000 mov [rsp+0xd0],rdi fffff97f`ff0b4a8d 4c89a424c8000000 mov [rsp+0xc8],r12 fffff97f`ff0b4a95 4c89ac24c0000000 mov [rsp+0xc0],r13 fffff97f`ff0b4a9d 4c89b424b8000000 mov [rsp+0xb8],r14 fffff97f`ff0b4aa5 4c89bc24b0000000 mov [rsp+0xb0],r15 fffff97f`ff0b4aad 498bf9 mov rdi,r9 fffff97f`ff0b4ab0 4d8bf8 mov r15,r8 fffff97f`ff0b4ab3 8bf2 mov esi,edx fffff97f`ff0b4ab5 488bd9 mov rbx,rcx fffff97f`ff0b4ab8 4c8b2db9631e00 mov r13,[xxxx (fffff97fff29ae78)] fffff97f`ff0b4abf 8d8200fcffff lea eax,[rdx-0x400] fffff97f`ff0b4ac5 4533f6 xor r14d,r14d fffff97f`ff0b4ac8 458be6 mov r12d,r14d fffff97f`ff0b4acb 3dffbb0000 cmp eax,0xbbff fffff97f`ff0b4ad0 410f96c4 setbe r12b fffff97f`ff0b4ad4 4585e4 test r12d,r12d fffff97f`ff0b4ad7 740a jz xxxx+0x83 (fffff97fff0b4ae3) fffff97f`ff0b4ad9 b957000000 mov ecx,0x57 fffff97f`ff0b4ade e82d081800 call xxxx (fffff97fff235310) fffff97f`ff0b4ae3 4885db test rbx,rbx fffff97f`ff0b4ae6 0f85fb010000 jne xxx+0x287 (fffff97fff0b4ce7) ... fffff97f`ff0b4c49 53 push rbx fffff97f`ff0b4c4a 3f aas fffff97f`ff0b4c4b 1a00 sbb al,[rax] fffff97f`ff0b4c4d 488b4810 mov rcx,[rax+0x10] fffff97f`ff0b4c51 48894c2468 mov [rsp+0x68],rcx fffff97f`ff0b4c56 488d4c2468 lea rcx,[rsp+0x68] fffff97f`ff0b4c5b 48894810 mov [rax+0x10],rcx fffff97f`ff0b4c5f 48895c2470 mov [rsp+0x70],rbx fffff97f`ff0b4c64 488d05f5dbf6ff lea rax,[xxxxx(fffff97fff022860)] fffff97f`ff0b4c6b 4889442478 mov [rsp+0x78],rax fffff97f`ff0b4c70 4c8d442448 lea r8,[rsp+0x48] fffff97f`ff0b4c75 4885ff test rdi,rdi fffff97f`ff0b4c78 4d0f44c6 cmove r8,r14 fffff97f`ff0b4c7c 488b842418010000 mov rax,[rsp+0x118] fffff97f`ff0b4c84 4889442420 mov [rsp+0x20],rax fffff97f`ff0b4c89 448b8c2410010000 mov r9d,[rsp+0x110] fffff97f`ff0b4c91 498bd7 mov rdx,r15 fffff97f`ff0b4c94 8bce mov ecx,esi fffff97f`ff0b4c96 e895d3ffff call xxxx (fffff97fff0b2030) fffff97f`ff0b4c9b 4885ff test rdi,rdi fffff97f`ff0b4c9e 7418 jz xxxx+0x258 (fffff97fff0b4cb8)
To be continued...
ホーム ざれごと ワシントン州 ツール NT豆知識 Win32プログラミングノート 私的用語 ジョーク いろいろ ゲーム雑記 Favorites 掲示板 Mail