//cl mymul.cpp /link /nodefaultlib /entry:DllMain /out:mymul.dll /dll #include BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD reason, void*) { return TRUE; } extern "C" __declspec(dllexport, naked) unsigned long long __stdcall MyMul(unsigned long long, unsigned long long) { __asm { push ebx mov eax, [esp+8] //eax = al mov ecx, [esp+16] //ecx = bl mov ebx, eax //ebx = eax (= al) mul ecx //eax:edx = eax * ecx (al * blの上位32ビットをedx、下位32ビットをeaxへ) imul ebx, [esp+20] //ebx = al * bh imul ecx, [esp+12] //ecx = bl * ah add edx, ebx //edx += ebx add edx, ecx //edx += eax pop ebx ret 16 } } /* __declspec(naked)はVC++に対して、関数に入ったとき・出るときの処理のコードを全く出力させないようにする効果があり、このように関数の中身を全てインラインアセンブラを利用する場合に重宝します。そして、関数から64ビット整数を返すにはeax:edxに値をおけばよいので、戻り値を返すことについて特に何も行っていませんが問題ありません。 */