Win32ASM 变长参数的理解
生活随笔
收集整理的這篇文章主要介紹了
Win32ASM 变长参数的理解
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
C語言里面 提供了一些宏??可以使用變長(zhǎng)參數(shù)
?
int MsgPrintf(INT dwszBuffer,TCHAR* szCaption,TCHAR* szFormat,...) {LPVOID lpszBuffer;va_list pArgList;va_start(pArgList,szFormat);lpszBuffer = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,100);_vsntprintf((LPTSTR)lpszBuffer,dwszBuffer/sizeof (TCHAR),szFormat,pArgList);va_end(pArgList);return MessageBox(NULL,(LPTSTR)lpszBuffer,szCaption,MB_OK); }?
如果要知道變長(zhǎng)參數(shù)的長(zhǎng)度? 就不得不在傳一個(gè)參數(shù)來進(jìn)行標(biāo)識(shí)了
?
因?yàn)槭荂語言調(diào)用方式,所以棧由調(diào)用者來平衡? 也就是add esp,xxh?? 這個(gè)xxx也就是參數(shù)的總長(zhǎng)度
add esp,xxh會(huì)被解釋成????? 83h 4ch xxh?? 也就是函數(shù)返回地址??加上2? 就是參數(shù)的總字節(jié)數(shù)了
C語言測(cè)試代碼如下
?
int Test(int a,int b,...) {int dwSizeOfPar;int *p = &a;dwSizeOfPar = *((int *)*(p - 1));dwSizeOfPar = ((dwSizeOfPar >> 16) & 0x0FF) >> 2;return dwSizeOfPar; }
根據(jù)這個(gè)原理? 寫了一個(gè)?? Win32ASM版本的格式化輸出
?
_MsgBoxPrintf proc C _dwSizeOfBuff:DWORD,_lpszCaption:DWORD,_lpszFormat:DWORD,_varg:VARARGLOCAL @hProcessHeap:DWORD LOCAL @lpszBuffer:DWORD LOCAL @dwSizePar:DWORDlea eax,_dwSizeOfBuffmov eax,[eax - 4] ;獲取函數(shù)的返回地址movzx eax,byte ptr [eax + 2] ;獲取參數(shù)總字節(jié)數(shù)shr eax,2 ;獲取參數(shù)個(gè)數(shù);沒有傳遞不定參數(shù),作為默認(rèn)處理cmp eax,3 jnb @Fsub eax,3mov @dwSizePar,eax invoke GetProcessHeapmov @hProcessHeap,eaxinvoke HeapAlloc,@hProcessHeap,HEAP_ZERO_MEMORY,_dwSizeOfBuff mov @lpszBuffer,eax.while @dwSizeParlea esi,_vargmov ebx,@dwSizeParsub ebx,1mov eax,[esi + ebx * 4]push eaxdec @dwSizePar.endwpush _lpszFormatpush @lpszBuffercall wsprintfinvoke MessageBox,NULL,@lpszBuffer,_lpszCaption,MB_OKret@@:invoke MessageBox,NULL,_lpszFormat,_lpszCaption,MB_OKret_MsgBoxPrintf endp
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Win32ASM 变长参数的理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。