/*
文件名:cvar.cpp
环境:win2k sp4+vc6
作者: Vical Lee
完成日期:2004-9-12 晨1:00
版本:1.0
描述:测试如何在子程序里修改主程序的局部参数.
*/
#include <stdio.h>
#include <string.h>
void foo(void);
int main(int argc, char* argv[])
{
int a = 3, b = 4;
char c = 'a';
char *d = "b";
long e = 2;
float f = 3.0;
foo();
printf("a=%d\t b=%d\t c=\'%c\'\t d=%08X \"\"\t e=%ld\t f=%f\n",
a, b, c, d, e, f);
}
void foo(void)
{
int paramcount = 0;
char *p;
_asm{
push edi;
mov edi, [ebp];/*取得主程序的EBP;*/
mov p, edi;
sub edi, ebp;/*主程序的esp==现在的ebp+返回地址栈位+原ebp栈位.即esp==ebp+2*4 */
sub edi, 4*5;/*程序保存了返回地址,ebp,ebx,esi,edi共占5个栈位,*/
/*故再减5个栈位可取得主程序局部参数所占字节数*/
mov paramcount, edi;
sub p, edi;/*P即为主程序局部参数起始地址了.*/
pop edi;
}
memset(p, 0, paramcount);/*把它全部置0算了,极其危险的作法,如果主程里malloc了,就
会导致主程序访问*(NULL),产生0址访问异常.*/
}
输出:
a=0 b=0 c=' ' d=00000000 "" e=0 f=0.000000