ホーム  ざれごと  ワシントン州  ツール  NT豆知識  Win32プログラミングノート  私的用語  ジョーク  いろいろ  ゲーム雑記  Favorites  掲示板   Mail

AMD64のお勉強ノート

Last modified: Thu Mar 18 07:33:18 2004 PDT

一つ上へ


AMD64に関するお勉強メモ。間違ってても責任は持てん。でも何か気がついたらメールで教えてください。

Goal

このお勉強ノートの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...

Since 1996

一つ上へ

ホーム  ざれごと  ワシントン州  ツール  NT豆知識  Win32プログラミングノート  私的用語  ジョーク  いろいろ  ゲーム雑記  Favorites  掲示板   Mail