C语言综合研究与高强度程序设计训练 2

来源:互联网 发布:java 获取apk版本号 编辑:程序博客网 时间:2024/04/28 03:11

C语言综合研究与高强度程序设计训练 2

编写程序

int a;

void f1(void)

{

  a=1;

}

void f2(void)

{

  a=2;

}

void f3(void)

{

  a=3;

}

main()

{

  printf("f1: %lx\n",(long)f1);

  printf("f2: %lx\n",(long)f2);

  printf("f3: %lx\n",(long)f3);

  printf("main: %lx\n",(long)main);

}

通过编译链接后我们可以看到各个函数的地址;





通过Debug加载后可以看到汇编代码:

通过代码可以得知,函数的地址代码是cs和偏移地址组成的.

也可以直接打印出段地址和偏移地址;

main()

{

  printf("CS:%x\n",_CS);

  printf("f1:%x\n",f1);

  printf("f2:%x\n",f2);

  printf("f3:%x\n",f3);

  printf("main:%x\n",main);

}




可以通过函数的地址计算出程序的长度,也可以通过程序来计算出来,比如  f2函数的长度:修改main函数如下:

Main()

{

    long lf2=(long)f3-(long)f2;

printf("f1: %lx\n",(long)lf2);

}




 

 

函数名就像是汇编中的标记一样,是一个程序的入口地址,记录的是程序偏移地址.所以可以通过将函数名强制转换类型后可以得到偏移地址,通过运算,从而得到函数的长度.

 

当打开多个command命令窗口运行程序时,地址是相同的:




使用debug同时加载后在运行后发现地址还是一样的:



0 0