中级会员
 
- 积分
- 222
- 金钱
- 222
- 注册时间
- 2013-9-21
- 在线时间
- 0 小时
|
发表于 2014-4-15 08:48:16
|
显示全部楼层
回复【3楼】styleno1:
---------------------------------
恩,确实对weak的用法了解不清晰。
ARM汇编中的WEAK关键字是一个很有意思的功能,如果能够灵活使用,能减轻不少繁琐。一般来说,这个关键字使用在IMPORT和EXPORT这两个声明段。
如果我们有一个名为ARM_Vectors的量表,向量表的第一个数值指向一个StackTop函数的地址。因为我们可能定义了该函数,也可能没有,为了代码的简便,我们可以使用WEAK关键字,如:
////////////////////////////////////////////////////////////////////////////
//VectorsTrampolines.s
////////////////////////////////////////////////////////////////////////////
IMPORT StackTop [WEAK]
AREA |.text|, CODE, READONLY
;Vector list
ARM_Vectors
DCD StackTop
当我们定义了StackTop函数后,那么ARM_Vectors里第一个向量值就是StackTop函数的地址。如果没有定义StackTop,那么编译器不会报错,而这时候第一个向量值就直接赋予0。
那么对于EXPORT,WEAK又有什么样的功能呢?如果你EXPORT的函数带有WEAK标志的话,并且别的源代码没有定义同名函数,那么连接时就是该函数;否则,就是另外的一个同名函数。这个机制,和类的继承有点相像,都是一个函数将另一个函数给掩盖了;所不同的是,WEAK里的这个掩盖,是彻彻底底让另外一个函数消失。
启动文件里是属于EXPORT +变量 + [weak]的情况
从网上找的,讲的不错,可以加深一下理解。感觉和C里的强符号弱符号挺相似的。 |
|