函数名定址
综合研究2
之函数名定址
研究过程:
通过之前的研究学习,我们得出了这样一个结论,函数名即汇编语言中的标号,标号则就应该具有地址的属性,但就本质而言,无论是地址,还是数据而言,都其实应该是一个概念,以及针对于他们,同样的要有这样的一个问题要问:
- 地址在哪?
- 数据(地址)有多大?
这是在学习汇编语言的时候我们应该关注的一个重要问题,只有掌握了这两点才算是对数据本身以及内存有了一个清晰的认知。那么映射到C语言中来,第二个问题就变成了这样:数据类型是什么?
那么对于函数名而言,我们同样要问这个问题,我们之前在进行汇编程序设计的时候,通常的我们只关注标号的偏移地址,以至于容易导致我们容易忽略这样一个事实:无论是变量,还是标号,本质属性是都是有其物理地址的!
所以这个研究的任务是让我们认识到上述问题所在。
研究任务让我们能够输出函数名的段地址和偏移地址。
开始的时候并没有认识到事物的本质特征:即对于一个函数名,或者称之为标号而言,我们并没与认识到,它本身就同时具有段地址和偏移地址这样的一个属性,或者说的更清楚的一点,就是,它是有数据类型的的!!!,而且,段地址和偏移地址共8位,它是一个长整形数据!!
认识到这一点问题就变得很容易了
我使用了这样的语句:printf(“%lx\n”,(long)f1)
发现最终在屏幕上显示了一个8位16进制数,高四位表示其段地址,低四位表示其偏移地址。
同时我们仍可以得到之前已经得到的结论:1fa并非是main函数的偏移地址,而是第一个函数的偏移地址。
已解决问题:
那么,新产生的问题在于:开头处定义的全局变量a是否对标号地址有影响?
如果把全局变量a变成每个函数内部的局部变量,又会有什么不同?
图1 a为全局变量 图2 a为局部变量
从实验结果中,我们可以看到,是否定义全局变量对第一个函数名的地址没有影响,但是如果换成了局部变量,则对于后两个函数名的偏移地址产生影响。
未解决问题:
暂无。
感想:
在汇编中,我么关注数据的地址和数据的大小,在C语言中我们同样关注这个问题,只不过,我们换成了关注数据的数据类型,仅此而已,而其本质并无多大区别。