日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Win32ASM 变长参数的理解

發布時間:2023/12/1 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Win32ASM 变长参数的理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C語言里面 提供了一些宏??可以使用變長參數

?

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); }

?

如果要知道變長參數的長度? 就不得不在傳一個參數來進行標識了

?

因為是C語言調用方式,所以棧由調用者來平衡? 也就是add esp,xxh?? 這個xxx也就是參數的總長度

add esp,xxh會被解釋成????? 83h 4ch xxh?? 也就是函數返回地址??加上2? 就是參數的總字節數了

C語言測試代碼如下

?

int Test(int a,int b,...) {int dwSizeOfPar;int *p = &a;dwSizeOfPar = *((int *)*(p - 1));dwSizeOfPar = ((dwSizeOfPar >> 16) & 0x0FF) >> 2;return dwSizeOfPar; }


根據這個原理? 寫了一個?? 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] ;獲取函數的返回地址movzx eax,byte ptr [eax + 2] ;獲取參數總字節數shr eax,2 ;獲取參數個數;沒有傳遞不定參數,作為默認處理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


?

?

?

總結

以上是生活随笔為你收集整理的Win32ASM 变长参数的理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。