函数名定址

Posted 少年π

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数名定址相关的知识,希望对你有一定的参考价值。

综合研究2

之函数名定址

研究过程:

通过之前的研究学习,我们得出了这样一个结论,函数名即汇编语言中的标号,标号则就应该具有地址的属性,但就本质而言,无论是地址,还是数据而言,都其实应该是一个概念,以及针对于他们,同样的要有这样的一个问题要问:

  1. 地址在哪?
  2. 数据(地址)有多大?

这是在学习汇编语言的时候我们应该关注的一个重要问题,只有掌握了这两点才算是对数据本身以及内存有了一个清晰的认知。那么映射到C语言中来,第二个问题就变成了这样:数据类型是什么?

那么对于函数名而言,我们同样要问这个问题,我们之前在进行汇编程序设计的时候,通常的我们只关注标号的偏移地址,以至于容易导致我们容易忽略这样一个事实:无论是变量,还是标号,本质属性是都是有其物理地址的!

所以这个研究的任务是让我们认识到上述问题所在。

研究任务让我们能够输出函数名的段地址和偏移地址。

开始的时候并没有认识到事物的本质特征:即对于一个函数名,或者称之为标号而言,我们并没与认识到,它本身就同时具有段地址和偏移地址这样的一个属性,或者说的更清楚的一点,就是,它是有数据类型的的!!!,而且,段地址和偏移地址共8位,它是一个长整形数据!!

认识到这一点问题就变得很容易了

我使用了这样的语句:printf(“%lx\\n”,(long)f1)

发现最终在屏幕上显示了一个8位16进制数,高四位表示其段地址,低四位表示其偏移地址。

同时我们仍可以得到之前已经得到的结论:1fa并非是main函数的偏移地址,而是第一个函数的偏移地址。

已解决问题:

那么,新产生的问题在于:开头处定义的全局变量a是否对标号地址有影响?

如果把全局变量a变成每个函数内部的局部变量,又会有什么不同?

                      

    图1  a为全局变量                     图2  a为局部变量

从实验结果中,我们可以看到,是否定义全局变量对第一个函数名的地址没有影响,但是如果换成了局部变量,则对于后两个函数名的偏移地址产生影响。

未解决问题:

暂无。

感想:

在汇编中,我么关注数据的地址和数据的大小,在C语言中我们同样关注这个问题,只不过,我们换成了关注数据的数据类型,仅此而已,而其本质并无多大区别。

以上是关于函数名定址的主要内容,如果未能解决你的问题,请参考以下文章

Surf的MATLAB函数名

第十二天-函数名 迭代器

类函数指针(不涵盖:返回类函数指针)

函数名闭包装饰器

函数名 闭包 迭代器

嗯。。。。。SQL函数名之DATEADD的用法