/* 文件名: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 
|