首页
社区
课程
招聘
[原创]可变长参数函数实现
发表于: 2011-8-6 00:11 6700

[原创]可变长参数函数实现

2011-8-6 00:11
6700

前段时间看了一阵子汇编,也算是对荒废的大学四年的祭奠,有的时候通过了解底层的东西, 对高级语言的理解还是灰常有帮助地。

c/c++中是存在可变长参数的,但那些仅仅是在编译阶段的可变长参数,运行时的调用参数状态则是固定的,
至于c++中的默认参数就根本和可变长不沾边儿了,只不过编译器做了个顺水人情而已

至于能不能在运行阶段在确定参数的个数呢,当然是可以的,用一些低级语言来做就很容易,例如汇编
下面就是实现一个对 c api sprintf 的改写 sprintf_x

 ;sprintfx.asm

.386P
.model flat

public _sprintfx

extern _sprintf:near          ;C lib api sprintf

;TCHAR* pOutBuf, 
;TCHAR* pszFormat, 
;LPCTSTR* pszData, 
;int x
_sprintfx proc near

        push ebp
        mov ebp, esp

        mov esi, [ebp+10H]
        mov ecx, dword ptr [ebp+14H]
LArgv:
        push dword ptr [esi]          ;sprintf( *, *, argv[] sequenc reverse.... );
        add ESI, 4
        loop LArgv

        push [ebp+0CH]                ;sprintf( *, szFormat, .... );
        push [ebp+8]                  ;sprintf( szBuffer, *, .... );

        call _sprintf
    
        mov esp, ebp                  ;balance the stack
        pop ebp
        ret
    
_sprintfx endp

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (3)
雪    币: 174
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
在nasm里试过对sprintf平衡堆栈
2011-8-6 01:34
0
雪    币: 1897
活跃值: (1976)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
3
void DbgPrint(const wchar_t *format, ...)
{
        va_list argptr;
        TCHAR buffer[1024];
        va_start(argptr, format);
        _vsnwprintf(buffer, 1024, format, argptr);
        va_end(argptr);

        OutputDebugString(buffer);
}

这样就变长啦,高级语言实现应该更容易的。
2011-8-6 09:06
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=shuax;988176]void DbgPrint(const wchar_t *format, ...)
{
        va_list argptr;
        TCHAR buffer[1024];
        va_start(argptr, format);
        _vsnwprintf(buffer, 1024, format, a...[/QUOTE]

void DbgPrint(const wchar_t *format, ...)这样对于dbgprint传递给printf的参数还是在编译阶段确定的, 我的想法是在运行时确定传递给printf的参数个数
2011-8-6 10:14
0
游客
登录 | 注册 方可回帖
返回