怀旧之使用汇编启动hge

6 篇文章 0 订阅
2 篇文章 0 订阅
本文介绍了作者尝试使用汇编语言启动HGE的过程,通过学习理解dword ptr的含义,对比内联汇编和Win32汇编在程序大小上的差异,展示了从7k到2.5k的代码优化过程。
摘要由CSDN通过智能技术生成

虽然其实只是抄了一遍而已,不过之后我会考虑使用纯汇编启动一次看看

	hge = hgeCreate(HGE_VERSION);

	hge->System_SetState(HGE_FRAMEFUNC, FrameFunc);
	hge->System_SetState(HGE_WINDOWED, true);

	if(hge->System_Initiate())
	{
		hge->System_Start();
		hge->System_Shutdown();
	}
	
	hge->Release();

首先是C++的代码。以上代码就足以运行一个简单的hge了,当然库和头文件自己导进去,全局的hge指针也需要声明下。

__asm
	{
		push        180h
		call        hgeCreate

		mov         ecx,dword ptr [eax]
		mov         edx,dword ptr [ecx+24h] 
		push        offset FrameFunc
		push        8    
		push        eax  
		mov         dword ptr [hge],eax 
		call        edx 

		mov         eax,dword ptr [hge] 
		mov         ecx,dword ptr [eax] 
		mov         edx,dword ptr [ecx+20h] 
		push        1    
		push        1    
		push        eax  
		call        edx  

		mov         eax,dword ptr [hge] 
		mov         ecx,dword ptr [eax] 
		mov         edx,dword ptr [ecx+4] 
		push        eax  
		call        edx  

		test        al,al 
		je          ENDMARK

		mov         eax,dword ptr [hge] 
		mov         ecx,dword ptr [eax] 
		mov         edx,dword ptr [ecx+0Ch] 
		push        eax  
		call        edx 

		mov         eax,dword ptr [hge] 
		mov         ecx,dword ptr [eax] 
		mov         edx,dword ptr [ecx+8] 
		push        eax  
		call        edx 

ENDMARK:
		mov         eax,dword ptr [hge] 
		mov         ecx,dword ptr [eax] 
		mov         edx,dword ptr [ecx] 
		push        eax  
		call        edx  
	}

用内联汇编的话就是这个感觉。可以看到虚函数其实就是每次偏移然后call,hge指针包含了虚函数表的起始地址,每次根据偏移调用不同的函数,然后还要传入this指针,这一步跟C如出一辙,但是简化了调用过程。hge是stdcall,所以堆栈也不用自己手动恢复了。

ecx,dword ptr [eax]

其实我并不理解这句的用意。看起来是将hge的地址给eax,而又将eax的地址给力ecx,其实是完全没有理解dword ptr的含义,继续慢慢看书吧


果然内联什么的还是有点太弱了的感觉,直接使用win32汇编吧,原本编译出来7k的程序,一下子变成了2.5k

.386 
.model flat,stdcall 
option casemap:none 

hgeCreate proto :DWORD

include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib 

includelib hge.lib 
includelib hgehelp.lib

.data
hge DWORD ?

.code
start:
		push        180h
		call        hgeCreate
		mov         ecx,dword ptr [eax]
		mov         edx,dword ptr [ecx+24h] 
		push        offset FrameFunc
		push        8    
		push        eax  
		mov         dword ptr [hge],eax 
		call        edx 

		mov         eax,dword ptr [hge] 
		mov         ecx,dword ptr [eax]
		mov         edx,dword ptr [ecx+20h] 
		push        1    
		push        1    
		push        eax  
		call        edx  

		mov         eax,dword ptr [hge] 
		mov         ecx,dword ptr [eax] 
		mov         edx,dword ptr [ecx+4] 
		push        eax  
		call        edx  

		test        al,al 
		je          ENDMARK

		mov         eax,dword ptr [hge] 
		mov         ecx,dword ptr [eax] 
		mov         edx,dword ptr [ecx+0Ch] 
		push        eax  
		call        edx 

		mov         eax,dword ptr [hge] 
		mov         ecx,dword ptr [eax] 
		mov         edx,dword ptr [ecx+8] 
		push        eax  
		call        edx 

ENDMARK:
		mov         eax,dword ptr [hge] 
		mov         ecx,dword ptr [eax] 
		mov         edx,dword ptr [ecx] 
		push        eax  
		call        edx  
invoke ExitProcess,0

FrameFunc proc
	xor         al,al 
	ret
FrameFunc endp

end start


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值