⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.asm

📁 游戏编程精粹2第四章源码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
xdata$x	SEGMENT DWORD USE32 PUBLIC 'CONST'
xdata$x	ENDS
;	COMDAT ??_R0?AVfailure@ios_base@std@@@8
_DATA	SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA	ENDS
;	COMDAT __TI2?AVlogic_error@std@@
xdata$x	SEGMENT DWORD USE32 PUBLIC 'CONST'
xdata$x	ENDS
;	COMDAT __TI3?AVoverflow_error@std@@
xdata$x	SEGMENT DWORD USE32 PUBLIC 'CONST'
xdata$x	ENDS
;	COMDAT __CT??_R0?AVdomain_error@std@@@8??0domain_error@std@@QAE@ABV01@@Z28
xdata$x	SEGMENT DWORD USE32 PUBLIC 'CONST'
xdata$x	ENDS
;	COMDAT __CT??_R0?AVruntime_error@std@@@8??0runtime_error@std@@QAE@ABV01@@Z28
xdata$x	SEGMENT DWORD USE32 PUBLIC 'CONST'
xdata$x	ENDS
;	COMDAT __CTA2?AVbad_typeid@std@@
xdata$x	SEGMENT DWORD USE32 PUBLIC 'CONST'
xdata$x	ENDS
;	COMDAT ??_R0?AVinvalid_argument@std@@@8
_DATA	SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA	ENDS
;	COMDAT ??_R0?AVrange_error@std@@@8
_DATA	SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA	ENDS
;	COMDAT __TI2?AVbad_exception@std@@
xdata$x	SEGMENT DWORD USE32 PUBLIC 'CONST'
xdata$x	ENDS
;	COMDAT ?_C@?1??_Nullstr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@CAPBDXZ@4DB
CONST	SEGMENT DWORD USE32 PUBLIC 'CONST'
CONST	ENDS
;	COMDAT __CT??_R0?AVlogic_error@std@@@8??0logic_error@std@@QAE@ABV01@@Z28
xdata$x	SEGMENT DWORD USE32 PUBLIC 'CONST'
xdata$x	ENDS
;	COMDAT __TI2?AVbad_alloc@std@@
xdata$x	SEGMENT DWORD USE32 PUBLIC 'CONST'
xdata$x	ENDS
;	COMDAT ??_R0?AVbad_exception@std@@@8
_DATA	SEGMENT DWORD USE32 PUBLIC 'DATA'
_DATA	ENDS
;	COMDAT __CTA3?AVout_of_range@std@@
xdata$x	SEGMENT DWORD USE32 PUBLIC 'CONST'
xdata$x	ENDS
FLAT	GROUP _DATA, CONST, _BSS, CRT$XCA, CRT$XCU, CRT$XCL, CRT$XCC, CRT$XCZ, xdata$x
	ASSUME	CS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC	?mCircleFactory@Application@@0PAVCircleFactory@@A ; Application::mCircleFactory
PUBLIC	?backbuffer@@3PAUHDC__@@A			; backbuffer
PUBLIC	?backbufferbitmap@@3PAUHBITMAP__@@A		; backbufferbitmap
PUBLIC	?textbuffer@@3PADA				; textbuffer
_BSS	SEGMENT
?mCircleFactory@Application@@0PAVCircleFactory@@A DD 01H DUP (?) ; Application::mCircleFactory
?backbuffer@@3PAUHDC__@@A DD 01H DUP (?)		; backbuffer
?backbufferbitmap@@3PAUHBITMAP__@@A DD 01H DUP (?)	; backbufferbitmap
?textbuffer@@3PADA DB 0400H DUP (?)			; textbuffer
_BSS	ENDS
CRT$XCU	SEGMENT
_$S19	DD	FLAT:_$E18
_$S25	DD	FLAT:_$E24
_$S32	DD	FLAT:_$E31
CRT$XCU	ENDS
_DATA	SEGMENT
$SG53997 DB	'spheretest_window_class', 00H
$SG53999 DB	'Sphere Tree for Game Programming Gems 2 : by John W. Rat'
	DB	'cliff.', 00H
	ORG $+1
$SG54000 DB	'spheretest_window_class', 00H
_DATA	ENDS
PUBLIC	?Startup@Application@@QAEHPAUHINSTANCE__@@@Z	; Application::Startup
PUBLIC	?Render@Application@@QAEHPAUHDC__@@@Z		; Application::Render
PUBLIC	_WinMain@16
EXTRN	??2@YAPAXI@Z:NEAR				; operator new
EXTRN	??3@YAXPAX@Z:NEAR				; operator delete
EXTRN	__imp__DeleteDC@4:NEAR
EXTRN	__imp__DeleteObject@4:NEAR
EXTRN	_exit:NEAR
EXTRN	_atoi:NEAR
EXTRN	__imp__timeGetTime@0:NEAR
EXTRN	__imp__Sleep@4:NEAR
EXTRN	__imp__TranslateMessage@4:NEAR
EXTRN	__imp__DispatchMessageA@4:NEAR
EXTRN	__imp__PeekMessageA@20:NEAR
EXTRN	??1CircleFactory@@QAE@XZ:NEAR			; CircleFactory::~CircleFactory
EXTRN	__imp__GetDC@4:NEAR
EXTRN	__imp__ReleaseDC@8:NEAR
_TEXT	SEGMENT
_appInstance$ = 8
_cmdLine$ = 16
_msg$ = -28
_WinMain@16 PROC NEAR

; 26   : {

	push	ebp
	mov	ebp, esp
	sub	esp, 28					; 0000001cH

; 27   : 	MSG			msg;
; 28   : 
; 29   :   int count = atoi( cmdLine );

	mov	eax, DWORD PTR _cmdLine$[ebp]
	push	ebx
	push	esi
	push	edi
	push	eax
	call	_atoi
	mov	edi, eax
	add	esp, 4

; 30   :   if ( count < 20 )    count = 1000; // default value is 1000

	cmp	edi, 20					; 00000014H
	jge	SHORT $L53954
	mov	edi, 1000				; 000003e8H

; 31   :   if ( count > 10000 ) count = 10000;

	jmp	SHORT $L53955
$L53954:
	cmp	edi, 10000				; 00002710H
	jle	SHORT $L53955
	mov	edi, 10000				; 00002710H
$L53955:

; 32   : 	
; 33   : 	Application* App = new Application(count);

	push	1127					; 00000467H
	call	??2@YAPAXI@Z				; operator new
	mov	esi, eax
	xor	ebx, ebx
	add	esp, 4
	cmp	esi, ebx
	je	SHORT $L55665
	mov	DWORD PTR [esi+1123], edi
	mov	BYTE PTR [esi+1120], bl
	mov	DWORD PTR [esi], ebx
	mov	DWORD PTR [esi+52], ebx
	mov	DWORD PTR [esi+56], ebx
	call	DWORD PTR __imp__timeGetTime@0
	mov	DWORD PTR [esi+60], eax
	mov	BYTE PTR [esi+1122], bl
	mov	BYTE PTR [esi+1121], bl
	jmp	SHORT $L55666
$L55665:
	xor	esi, esi
$L55666:

; 34   : 
; 35   : 	if (App->Startup(appInstance))

	mov	ecx, DWORD PTR _appInstance$[ebp]
	push	ecx
	mov	ecx, esi
	call	?Startup@Application@@QAEHPAUHINSTANCE__@@@Z ; Application::Startup
	test	eax, eax
	je	SHORT $L55751

; 36   : 	{
; 37   : 		delete (App);

	cmp	esi, ebx
	je	SHORT $L55708
	mov	edi, DWORD PTR ?mCircleFactory@Application@@0PAVCircleFactory@@A ; Application::mCircleFactory
	cmp	edi, ebx
	je	SHORT $L55705
	mov	ecx, edi
	call	??1CircleFactory@@QAE@XZ		; CircleFactory::~CircleFactory
	push	edi
	call	??3@YAXPAX@Z				; operator delete
	add	esp, 4
$L55705:
	push	esi
	call	??3@YAXPAX@Z				; operator delete
	add	esp, 4
$L55708:

; 38   : 		exit(-1);

	push	-1
	call	_exit
$L55753:
$L55751:

; 39   : 	}
; 40   : 
; 41   : 	while (!App->ExitApp())

	mov	al, BYTE PTR [esi+1120]
	test	al, al
	jne	SHORT $L53966

; 47   : 		}
; 48   : 
; 49   : 		App->Process();

	mov	ebx, DWORD PTR __imp__GetDC@4
$L53965:

; 42   : 	{
; 43   : 		if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))

	push	1
	push	0
	push	0
	lea	edx, DWORD PTR _msg$[ebp]
	push	0
	push	edx
	call	DWORD PTR __imp__PeekMessageA@20
	test	eax, eax
	je	SHORT $L53967

; 44   : 		{
; 45   : 			TranslateMessage(&msg);

	lea	eax, DWORD PTR _msg$[ebp]
	push	eax
	call	DWORD PTR __imp__TranslateMessage@4

; 46   : 			DispatchMessage(&msg);

	lea	ecx, DWORD PTR _msg$[ebp]
	push	ecx
	call	DWORD PTR __imp__DispatchMessageA@4
$L53967:

; 47   : 		}
; 48   : 
; 49   : 		App->Process();

	mov	edx, DWORD PTR [esi+52]
	push	edx
	call	ebx
	mov	edi, eax
	mov	ecx, esi
	push	edi
	call	?Render@Application@@QAEHPAUHDC__@@@Z	; Application::Render
	mov	eax, DWORD PTR [esi+52]
	push	edi
	push	eax
	call	DWORD PTR __imp__ReleaseDC@8
	push	1
	call	DWORD PTR __imp__Sleep@4
	mov	al, BYTE PTR [esi+1120]
	test	al, al
	je	SHORT $L53965

; 39   : 	}
; 40   : 
; 41   : 	while (!App->ExitApp())

	xor	ebx, ebx
$L53966:

; 50   : 	}
; 51   : 
; 52   : 	App->Shutdown();

	mov	ecx, DWORD PTR ?backbufferbitmap@@3PAUHBITMAP__@@A ; backbufferbitmap
	push	ecx
	call	DWORD PTR __imp__DeleteObject@4
	mov	edx, DWORD PTR ?backbuffer@@3PAUHDC__@@A ; backbuffer
	push	edx
	call	DWORD PTR __imp__DeleteDC@4

; 53   : 
; 54   : 	delete(App);

	cmp	esi, ebx
	mov	DWORD PTR ?backbuffer@@3PAUHDC__@@A, ebx ; backbuffer
	je	SHORT $L55750
	mov	edi, DWORD PTR ?mCircleFactory@Application@@0PAVCircleFactory@@A ; Application::mCircleFactory
	cmp	edi, ebx
	je	SHORT $L55747
	mov	ecx, edi
	call	??1CircleFactory@@QAE@XZ		; CircleFactory::~CircleFactory
	push	edi
	call	??3@YAXPAX@Z				; operator delete
	add	esp, 4
$L55747:
	push	esi
	call	??3@YAXPAX@Z				; operator delete
	add	esp, 4
$L55750:
	pop	edi
	pop	esi

; 55   : 
; 56   : 	return 0;

	xor	eax, eax
	pop	ebx

; 57   : }

	mov	esp, ebp
	pop	ebp
	ret	16					; 00000010H
$L55752:
_WinMain@16 ENDP
_TEXT	ENDS
PUBLIC	??0Application@@QAE@H@Z				; Application::Application
_TEXT	SEGMENT
_simcount$ = 8
??0Application@@QAE@H@Z PROC NEAR			; Application::Application

; 63   : {

	push	ebp
	mov	ebp, esp

; 64   :   mSimulationCount  = simcount;

	mov	eax, DWORD PTR _simcount$[ebp]
	push	ebx
	push	esi
	mov	esi, ecx

; 65   : 	mExitApplication	= false;

	xor	ebx, ebx
	mov	DWORD PTR [esi+1123], eax
	mov	BYTE PTR [esi+1120], bl

; 66   : 	mAppInstance			= NULL;

	mov	DWORD PTR [esi], ebx

; 67   : 	mWindow						= NULL;

	mov	DWORD PTR [esi+52], ebx

; 68   : 	mFrameRate				= 0;

	mov	DWORD PTR [esi+56], ebx

; 69   : 	mUpdateFrameRate	= timeGetTime();

	call	DWORD PTR __imp__timeGetTime@0
	mov	DWORD PTR [esi+60], eax

; 70   : 	mStep							= false;

	mov	BYTE PTR [esi+1122], bl

; 71   : 	mPause						= false;

	mov	BYTE PTR [esi+1121], bl

; 72   : }

	mov	eax, esi
	pop	esi
	pop	ebx
	pop	ebp
	ret	4
??0Application@@QAE@H@Z ENDP				; Application::Application
_TEXT	ENDS
PUBLIC	??1Application@@QAE@XZ				; Application::~Application
_TEXT	SEGMENT
??1Application@@QAE@XZ PROC NEAR			; Application::~Application

; 77   : {

	push	esi

; 78   : 	delete (mCircleFactory);

	mov	esi, DWORD PTR ?mCircleFactory@Application@@0PAVCircleFactory@@A ; Application::mCircleFactory
	test	esi, esi
	je	SHORT $L55758
	mov	ecx, esi
	call	??1CircleFactory@@QAE@XZ		; CircleFactory::~CircleFactory
	push	esi
	call	??3@YAXPAX@Z				; operator delete
	add	esp, 4
$L55758:
	pop	esi

; 79   : }

	ret	0
??1Application@@QAE@XZ ENDP				; Application::~Application
_TEXT	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -