実験結果

元ソース

// Sample.cpp : アプリケーション用のエントリ ポイントの定義
//

#include "stdafx.h"
#include "resource.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst; // 現在のインスタンス
TCHAR szTitle[MAX_LOADSTRING]; // タイトル バー テキスト
TCHAR szWindowClass[MAX_LOADSTRING]; // タイトル バー テキスト

// このコード モジュールに含まれる関数の前宣言:
ATOM MyRegisterClass( HINSTANCE hInstance );
BOOL InitInstance( HINSTANCE, int );
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
LRESULT CALLBACK About( HWND, UINT, WPARAM, LPARAM );

// テスト用に追加されたコードのプロトタイプ
void ProcTest0(long Arg1);
void ProcDivMod();
void ProcMemory();
long ProcDummy(long Arg1);

// ウィンメイン
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
// TODO: この位置にコードを記述してください。
MSG msg;
HACCEL hAccelTable;

// グローバル ストリングを初期化します
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_SAMPLE, szWindowClass, MAX_LOADSTRING);
MyRegisterClass( hInstance );

// アプリケーションの初期化を行います:
if( !InitInstance( hInstance, nCmdShow ) )
{
return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_SAMPLE);

// メイン メッセージ ループ:
while( GetMessage(&msg, NULL, 0, 0) )
{
if( !TranslateAccelerator (msg.hwnd, hAccelTable, &msg) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}

// テスト用に追加されたコード
(void) ProcTest0(1000);

return msg.wParam;
}



//
// 関数: MyRegisterClass()
//
// 用途: ウィンドウ クラスの登録
//
// コメント:
//
// この関数およびその使用はこのコードを Windows 95 で先に追加された
// 'RegisterClassEx' 関数と Win32 システムの互換性を保持したい場合に
// のみ必要となります。アプリケーションが、アプリケーションに関連付け
// られたスモール アイコンを取得できるよう、この関数を呼び出すことは
// 重要です。
//
ATOM MyRegisterClass( HINSTANCE hInstance )
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_SAMPLE);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCSTR)IDC_SAMPLE;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

return RegisterClassEx( &wcex );
}

//
// 関数: InitInstance(HANDLE, int)
//
// 用途: インスタンス ハンドルの保存とメイン ウィンドウの作成
//
// コメント:
//
// この関数では、インスタンス ハンドルをグローバル変数に保存し、プログラムの
// メイン ウィンドウを作成し表示します。
//
BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )
{
HWND hWnd;

hInst = hInstance; // グローバル変数にインスタンス ハンドルを保存します

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if( !hWnd )
{
return FALSE;
}

ShowWindow( hWnd, nCmdShow );
UpdateWindow( hWnd );

return TRUE;
}

//
// 関数: WndProc(HWND, unsigned, WORD, LONG)
//
// 用途: メイン ウィンドウのメッセージを処理します。
//
// WM_COMMAND - アプリケーション メニューの処理
// WM_PAINT - メイン ウィンドウの描画
// WM_DESTROY - 終了メッセージの通知とリターン
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);

switch( message )
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// メニュー選択の解析:
switch( wmId )
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow( hWnd );
break;
default:
return DefWindowProc( hWnd, message, wParam, lParam );
}
break;
case WM_PAINT:
hdc = BeginPaint (hWnd, &ps);
// TODO: この位置に描画用のコードを追加してください...
RECT rt;
GetClientRect( hWnd, &rt );
DrawText( hdc, szHello, strlen(szHello), &rt, DT_CENTER );
EndPaint( hWnd, &ps );
break;
case WM_DESTROY:
PostQuitMessage( 0 );
break;
default:
return DefWindowProc( hWnd, message, wParam, lParam );
}
return 0;
}

// バージョン情報ボックス用メッセージ ハンドラ
LRESULT CALLBACK About( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
switch( message )
{
case WM_INITDIALOG:
return TRUE;

case WM_COMMAND:
if( LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL )
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}


////////
// テスト用に追加されたコードの実体
void ProcTest0(long Arg1){
(void) ProcDivMod();
(void) ProcMemory();
(void) ProcDummy(0);
}

void ProcDivMod(){
char a,b;

a=(char)ProcDummy(10);
b=(char)ProcDummy(3);
(void) ProcDummy(a/b);
(void) ProcDummy(a%b);

}

void ProcMemory(){
long x,y;
char a[100],b[100];
/* char *c;*/

x=ProcDummy(100);

(void) memcpy(a,b,x);

a[50]='A';

(void) memset(b,' ',x);

y = memcmp(a,b,x);

(void) ProcDummy(y);

/* c = (char *)strchr(a,'a');
(void) ProcDummy((long)*c);*/
}

// 計算式が最適化されないようにするためのダミー関数
long ProcDummy(long Arg1){
return (Arg1);

}

出力結果

long Main(void arg1, void arg2)
/* Takes no parameters.
* Have 28Byte(s) local variable(s).
*/
{
long loc1; /* ESP 16 */
long loc2; /* ESP 20 */
long loc3; /* ESP 24 */
register long loc4; /* ESI */
register long loc5; /* EAX */

loc4 = arg1;
/* 004040D0 */
(void) LoadStringA(loc4, 103, var004054F4, 100);
/* 004040D0 */
(void) LoadStringA(loc4, 109, var00405490, 100);
/* 004010D0 No prototype. */
(void) proc_0001(loc4);
/* 00401160 No prototype. */
loc5 = proc_0002(loc4, arg2);

if (loc5 == 0) {
return (loc5);
}
/* 004040D4 */
loc4 = LoadAcceleratorsA(loc4, (char *)0000006D);

if (GetMessageA(&loc1, 0, 0, 0) != 0) {

do {

if (TranslateAcceleratorA(loc1, loc4, &loc1) == 0) {
/* 004040E0 */
(void) TranslateMessage(&loc1);
/* 004040E4 */
(void) DispatchMessageA(&loc1);
}
} while (GetMessageA(&loc3, 0, 0, 0) != 0);

}
/* 00401360 No prototype. */
(void) proc_0003(0x000003E8);
return (loc2);
}




long proc_0001(void arg1, void arg2)
/* Takes 4 bytes of parameters.
* Unknown calling convention.
* Have 48Byte(s) local variable(s).
*/
{
long loc1; /* ESP 4 */
void loc2; /* ESP 12 */
void loc3; /* ESP 16 */
void loc4; /* ESP 20 */
long loc5; /* ESP 24 */
void loc6; /* ESP 28 */
long loc7; /* ESP 32 */
long loc8; /* ESP 36 */
void loc9; /* ESP 44 */
register long loc10; /* EAX */

loc10 = arg2;
loc2 = 48;
loc3 = 3;
loc4 = &var004011C0;
loc5 = 0;
loc6 = 0;
loc7 = loc10;
/* 004040C4 */
loc8 = LoadIconA(loc10, (char *)0000006B);
/* 004040C8 */
loc7 = LoadCursorA(0, (char *)00007F00);
loc9 = 6;
arg1 = 109;
arg2 = var00405490;
/* 004040C4 */
loc10 = LoadIconA(loc5, (char *)0000006C);
arg1 = loc10;
/* 004040CC */
return (RegisterClassExA(&loc1));
}




long proc_0002(void arg1, long arg2)
/* Takes 8 bytes of parameters.
* Unknown calling convention.
*/
{
register long loc1; /* EAX */
register long loc2; /* ESI */

loc1 = arg1;
var00405558 = loc1;
/* 004040B8 */
loc1 = CreateWindowExA(0, var00405490, var004054F4, 0x00CF0000, 0x80000000, 0, 0x80000000, 0, 0, 0, loc1, 0);
loc2 = loc1;

if (loc2 == 0) {
return (loc1);
}
/* 004040BC */
(void) ShowWindow(loc2, arg2);
/* 004040C0 */
(void) UpdateWindow(loc2);
return (1);
}




void proc_0003()
/* Takes 4 bytes of parameters.
* Unknown calling convention.
*/
{

/* 00401380 No prototype. */
(void) proc_0004();
/* 004013C0 No prototype. */
(void) proc_0006();
/* 00401430 No prototype. */
(void) proc_0005(0);
return;
}




void proc_0004()
/* Takes no parameters.
* Unknown calling convention.
*/
{
register long loc1; /* EAX */
register char loc2; /* BL */
register char loc3; /* AL */
register long loc4; /* EDI */
register long loc5; /* ESI */
register char loc6; /* rTMP */
register long loc7; /* EDX */

/* 00401430 No prototype. */
loc1 = proc_0005(10);
loc2 = loc3;
/* 00401430 No prototype. */
loc1 = proc_0005(3);
loc4 = loc2;
loc5 = loc3;
loc1 = loc4;
loc6 = loc1;
loc7 = loc6 % loc5;
/* 00401430 No prototype. */
(void) proc_0005(loc6 / loc5);
loc1 = loc4;
loc6 = loc1;
loc1 = loc6 / loc5;
/* 00401430 No prototype. */
(void) proc_0005(loc6 % loc5);
return;
}




long proc_0005(void arg1)
/* Takes 4 bytes of parameters.
* Unknown calling convention.
*/
{

return (arg1);
}




void proc_0006()
/* Takes no parameters.
* Unknown calling convention.
* Have 200Byte(s) local variable(s).
*/
{
long loc1; /* ESP 8 */
long loc2; /* ESP 12 */
long loc3; /* ESP 108 */
long loc4; /* ESP 112 */
void loc5; /* ESP 158 */
register long loc6; /* EAX */
register long loc7; /* EDI */
register long loc8; /* EDX */
register long loc9; /* ESI */
register long loc10; /* ECX */

/* 00401430 No prototype. */
loc6 = proc_0005(100, loc7);
loc8 = loc6;
loc9 = &loc2;
loc7 = &loc4;
loc10 = loc8 >> 2;
/* Unsupported operation. */
_asm{004013DE F3A5 REP_MOVS ESI,EDI};
loc10 = loc6;
loc6 = 0x20202020;
loc10 = loc10 & 3;
/* Unsupported operation. */
_asm{004013ED F3A4 REP_MOVS ESI,EDI};
loc10 = loc8;
loc7 = &loc1;
loc9 = loc10;
loc5 = 65;
loc10 = loc10 >> 2;
/* Unsupported operation. */
_asm{00401402 F3AB REP_STOS EDI,EAX};
loc10 = loc9;
loc9 = &loc3;
loc10 = loc10 & 3;
/* Unsupported operation. */
_asm{0040140D F3AA REP_STOS EDI,AL};
loc10 = loc8;
loc7 = &loc1;
loc6 = 0;
/* Unsupported operation. */
_asm{00401417 F3A6 REPE_CMPS ESI,EDI};
/* Unsupported operation. */
_asm{0040141B 7405 JE 0x};

if {
/* Unsupported operation. */
_asm{0040141D 1BC0 SBB EAX,EAX};
/* Unsupported operation. */
_asm{0040141F 83D8FF SBB EAX,-1};
}
/* 00401430 No prototype. */
(void) proc_0005(loc6, loc9);
return;
}




 


トップ 戻る:ブラウザで。