程序设计训练 2"/>
C语言综合研究与高强度程序设计训练 2
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同时加载后在运行后发现地址还是一样的:
更多推荐
C语言综合研究与高强度程序设计训练 2
发布评论