インラインアセンブラの関数
__declspec( naked ) void __fastcall memcpy_test( void* dst, const void* src, size_t nsize ) { mov [esp-4], edi mov [esp-8], esi mov edi, ecx // dst mov esi, edx // src mov ecx, [esp+4] // nsize cld rep movsb mov esi, [esp-8] mov edi, [esp-4] ret 4 }
上記簡易memcpy関数は大抵の場合は問題なく動いたが、割り込みが入るプログラムではスタックが書き換わり、保存したedi、esiの内容が不定となった
push edi push esi ; pop esi pop edi
もしくは
sub esp, 8 mov [esp], edi mov [esp+4], esi ; mov esi, [esp+4] mov edi, [esp] add esp, 8
とespをキチンと指定する
MMXやSSEレジスタを使う場合も元の値に復元してやる
フラグレジスタは・・・とりあえず未定