灵活使用ARM汇编的WEAK关键字
//=====================================================================
//TITLE:
// 灵活使用ARM汇编的WEAK关键字
//AUTHOR:
// norains
//DATE:
// Tuesday 20-October-2010
//Environment:
// KEIL MDK 4.0
//=====================================================================
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里的这个掩盖,是彻彻底底让另外一个函数消失。
可能这样说还是有点不太明白,我们以实例来说明:
////////////////////////////////////////////////////////////////////////////
//VectorsTrampolines.s
////////////////////////////////////////////////////////////////////////////
IMPORT StackTop
AREA |.text|, CODE, READONLY
;Vector list
ARM_Vectors
DCD StackTop
////////////////////////////////////////////////////////////////////////////
//VectorsHandlers.s
////////////////////////////////////////////////////////////////////////////
EXPORT StackTop [WEAK]
AREA |i.DefaultHandler|, CODE, READONLY
StackTop PROC
B .
ENDP
虽然这时候StackTop在通过EXPORT导出时带有WEAK关键字,但因为整个源代码文件中只有这里有StackTop,所以VectorsTrampolines.s文件中连接的StackTop是VectorsHandlers.s定义的同名函数。
如果另外的源代码也定义了同名的函数,如:
////////////////////////////////////////////////////////////////////////////
//VectorsTrampolines.s
////////////////////////////////////////////////////////////////////////////
IMPORT StackTop
AREA |.text|, CODE, READONLY
;Vector list
ARM_Vectors
DCD StackTop
////////////////////////////////////////////////////////////////////////////
//VectorsHandlers.s
////////////////////////////////////////////////////////////////////////////
EXPORT StackTop [WEAK]
AREA |i.DefaultHandler|, CODE, READONLY
StackTop PROC
B .
ENDP
////////////////////////////////////////////////////////////////////////////
//Func.c
////////////////////////////////////////////////////////////////////////////
Extern “C” StackTop()
{}
因为VectorsHandlers.s的StackTop是用WEAK导出的,而Func.c又有同名的函数,那么这时候VectorsTrampolines.s里的StackTop是连接Func.c里定义的StackTop。
这里有一个很有意思的问题,如果EXPORT和IMPORT都用WEAK声明,如:
////////////////////////////////////////////////////////////////////////////
//VectorsTrampolines.s
////////////////////////////////////////////////////////////////////////////
IMPORT StackTop [WEAK]
AREA |.text|, CODE, READONLY
;Vector list
ARM_Vectors
DCD StackTop
////////////////////////////////////////////////////////////////////////////
//VectorsHandlers.s
////////////////////////////////////////////////////////////////////////////
EXPORT StackTop [WEAK]
AREA |i.DefaultHandler|, CODE, READONLY
StackTop PROC
B .
ENDP
这时候VectorsTrampolines.s里的ARM_Vectors的第一个向量值是什么呢?还是VectorsHandlers.s里的StackTop函数地址么?很遗憾,不是,而直接是0!所以这点就注意了,最好不要对同名的函数在IMPORT和EXPORT时都使用WEAK,否则结果很可能让你抓狂!
最后,以一个列表作为总结:
|
VectorsTrampolines.s |
VectorsHandlers.s |
Func.c |
ARM_Vectors第一个向量值 |
|
IMPORT StackTop [WEAK] |
无 |
无 |
0 |
|
IMPORT StackTop [WEAK] |
EXPORT StackTop |
无 |
VectorsHandlers.s的StackTop地址 |
|
IMPORT StackTop |
EXPORT StackTop [WEAK] |
有同名的StackTop函数 |
Func.c的StackTop地址 |
|
IMPORT StackTop |
EXPORT StackTop |
有同名的StackTop函数 |
存在两个StackTop,编译出错 |
|
IMPORT StackTop [WEAK] |
EXPORT StackTop [WEAK] |
无 |
0 |
灵活使用ARM汇编的WEAK关键字的更多相关文章
- 汇编的WEAK关键字
一般来说,这个关键字使用在IMPORT和EXPORT这两个声明段. ////////////////////////////////////////////////////////////////// ...
- 经常使用ARM汇编指令
一面学习,一面总结,一面记录. 以下是整理在网上找到的一些资料,简单整理记录一下,方便以后查阅. ARM处理器的指令集能够分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.载入/存储指令. ...
- ARM汇编编程概述
1.为什么需要学些汇编指令 2.ARM汇编指令分类 3.汇编程序框架 4.编程准备 +++++++++++++++++++++++++++++++++++ 1.为什么需要学些汇编指令 bootload ...
- C/C++ 中嵌入 arm 汇编
GCC编译器支持直接在C或者C++代码中,嵌入ARM汇编代码.其基本格式非常简单,大致如下: __asm__ [__volatile__] ( assembler template : [output ...
- ARM汇编初探---汇编代码中都有哪几类指令---ARM伪指令介绍
要学习一个东西首先要把概念搞清楚,以下仅仅是自己的一些关于汇编的理解. 可运行文件里的01码是机器码,机器码不等于汇编码,尽管机器码能够非常easy翻译成汇编码. 汇编码中包括非常多汇编指令.伪指令和 ...
- 如何在C或C++代码中嵌入ARM汇编代码
转载自:http://blog.csdn.net/roland_sun/article/details/42921131 大家知道,用C或者C++等高级语言编写的程序,会被编译器编译成最终的机器指令. ...
- 生成ARM汇编
使用ndk即可生成arm汇编 1.首先写好hello.c 2.编写makefile #ndk根目录 NDK_ROOT=E:\Android\android-ndk-r10b #编译器根目录 TOOLC ...
- ARM汇编指令调试方法
学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...
- ARM汇编
ARM汇编 ISA ISA即指指令集架构(Instruction Set Architecture)是与程序设计有关的计算机架构的一部分,包括本地数据类型.指令.寄存器.地址模式.内存架构.中断和意外 ...
随机推荐
- C#中pictureBox笔记
if (File.Exists(productInfo.预览图路径)) this.picPreview.Image = BitmapFactory.Alloc(productInfo.预览图路径, f ...
- JVM(一)运行机制
1.启动流程 2.JVM基本结构 PC寄存器 >每个线程拥有一个PC寄存器 >在线程创建时创建 >指向下一条指令的地址 >执行本地方法时,PC的值为undefined 方法区 ...
- 域对象 pageContext request session servletContext
pageContext 当前页面之内有效 request 当前的请求内有效 session 当前的会话内有效 servletContext 当前这次服务器生命周期内有效
- Python列表去重的三种方法
1. 列表去重 li = [] for item in my_list: if item not in li: li.append(item) 2.集合去重 list(set(my_list)) 3. ...
- python深浅copy-转自EVA的博客
感谢Eva_J, http://www.cnblogs.com/Eva-J/p/5534037.html,新手上路,转载纯为自己学习. 初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合p ...
- 算法训练 Bus Tour
问题描述 想象你是一个在Warsaw的游客,而且预订了一次乘车旅行,去城镇外看一些令人惊异的景点.这辆公共汽车首先围绕城镇行驶一段时间(一段很长的时间,由于Warsaw是一个大城市),把在各自旅馆的人 ...
- POJ3421:X-factor Chains——题解
http://poj.org/problem?id=3421 题目大意:一个数列,起始为1,终止为一给定数X,满足Xi < Xi+1 并且Xi | Xi+1. 求出数列最大长度和该长度下的情况数 ...
- BZOJ3195:[JXOI2012]奇怪的道路——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3195 Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方 ...
- php 在线预览word
一般类似oa或者crm等管理系统可能都会遇到需要再线查看word文档的功能,类似百度文库. 记得去年小组中的一个成员负责的项目就需要这个的功能,后面说是实现比较困难,就将就着用chm格式替代了.今天看 ...
- Multi-target tracking with Single Moving Camera
引自:http://www.eecs.umich.edu/vision/mttproject.html Wongun Choi, Caroline Pantofaru, Silvio Savarese ...