// doubledynamic.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <string.h>
// 动态参数列表作形参
int dynamic(int c, char *str, ...)
{
int len = 0;
for(int i = 0; i < c; i++)
{
char *_s = (char *)(*(&str + i));
len += strlen(_s);
}
return len;
}
// 或者
// 动态参数列表作形参
int doubledynamic(int c, char *str, ...)
{
// 动态参数列表再作实参
__asm
{
mov ebx, ebp // ebx = ebp
add ebx, 0x8 // ebx = ebp + 0x8 = &c
mov edx, ebx // edx = ebx = ebp + 0x8
mov ecx, [ebx] // ecx = [ebx] = c
imul ecx, 4 // ecx = ecx * 4 = c * 4
add ebx, ecx // ebx = ebx + ecx = ebp + 0x8 + c * 4
xor ecx, ecx // ecx = 0
accumulate:
push ecx // push ecx
push edx // push edx
push [ebx] // push [ebx], push params, right to left
call strlen // call strlen, return value stores in eax
pop esi // pop esi
pop edx // pop edx
pop ecx // pop ecx
add ecx, eax // ecx = ecx + eax
sub ebx, 4 // ebx = ebx - 4
cmp ebx, edx // if(ebx != edx)
jne accumulate // goto accumulate
mov eax, ecx // eax = ecx, will return eax
}
}
int _tmain(int argc, _TCHAR* argv[])
{
// 静态参数列表作实参
//int len = dynamic(3, "str1", "str2", "str3");
// 静态参数列表作实参
int len = doubledynamic(3, "str1", "str2", "str3");
return 0;
}