转载于:http://blog.csdn.net/norains/article/details/5954459

//=====================================================================

//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 export 汇编_灵活使用ARM汇编的WEAK关键字 (INPORT,EXPORT)---应该是在keil环境下,iar等还不知道...相关推荐

  1. 麒麟处理器是基于arm的吗_直接采用ARM的CPU和GPU,那么麒麟芯片算自研吗?

    华为的麒麟芯片采用ARM提供的CPU和GPU核心,麒麟970又采用寒武纪提供的NPU芯片等等,因此有人会问,麒麟芯片既然很多核心都是采用别人的,为什么还要说是自研芯片呢?麒麟芯片到底是不是华为生产的? ...

  2. attiny13a程序实例_世界最小的Arduino——ATTiny13上手全攻略1B在Arduino IDE环境下的搭建...

    本帖最后由 幻生幻灭 于 2017-2-15 10:41 编辑 系列教程传送门 世界最小的Arduino--ATTiny13上手全攻略1A简介 世界最小的Arduino--ATTiny13上手全攻略1 ...

  3. 【Android 逆向】arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 分析 malloc 函数的 arm 汇编语言 )

    文章目录 一.分析 malloc 函数的 arm 汇编语言 一.分析 malloc 函数的 arm 汇编语言 在上一篇博客 [Android 逆向]arm 汇编 ( 使用 IDA 解析 arm 架构的 ...

  4. ARM指令集与Thumb指令集--区别关联--汇编指令 BX LR ; 跳转回LR地址处,既可以是ARM模式也可以是Thumb模式

    BX        LR    ; 跳转回LR地址处,既可以是ARM模式也可以是Thumb模式 A 一.现在先区分下ARM指令集与Thumb指令集        Thumb 指令可以看作是 ARM 指 ...

  5. Win32汇编_基础

    Win32汇编_基础 包含全部段的源程序结构: .386 .model flat, stdcall Option casemap:none ;<一些include语句> .stack [堆 ...

  6. java 汇编_大话+图说:Java 汇编指令——只为让你懂

    原标题:大话+图说:Java 汇编指令--只为让你懂 前言 随着Android开发技术不断被推到新的高度,对于Android程序员来讲越来越需要具备一些对深入的基础性的技术的理解,比如说Java汇编指 ...

  7. ARM核心板_迅为imx6工控核心板_核心板中的小新潮

    ARM核心板_迅为imx6工控核心板_核心板中的小新潮 核心板参数 尺寸 51mm*61mm CPU Freescale Cortex-A9 四核 i.MX6Q,主频 1.2 GHz 内存 2GB D ...

  8. 80X86汇编_绘制五角星程序

    80X86汇编_绘制五角星程序 DATAS SEGMENT mode  dw 0 COLOR DW 12 BKCOLOR DW 15 POINT dw 160,200,480,200,480,200, ...

  9. 麒麟处理器是基于arm的吗_麒麟芯片是基于ARM构架,如果得不到授权华为还能活吗?...

    跟其他的国产公司相比,华为最大的特点就是拥有自研的一些技术,比如华为的麒麟芯片,毕竟友商OPPO.小米都在使用高通的骁龙,他们没有足够的能力研发强大的芯片,单单在这一方面华为人就已经足够自豪. 不过最 ...

最新文章

  1. html转义字符对照表
  2. 正态分布||方差、均值的概念
  3. 主流的Python领域和框架--转
  4. 返回的到的数据做整合_Excel玩转数据分析常用的43个函数!(建议收藏)
  5. Python中曲率与弯曲的转换_1000R曲率更具沉浸感!三星T55曲面显示器评测
  6. 【免费下载】2021年4月热门报告盘点下载
  7. 第六:Pytest中的setup/teardown
  8. asa802.k8-telnet for lan-base
  9. AcWing 889. 满足条件的01序列(卡特兰数)
  10. eclipse 设置虚拟机内存(可用)
  11. Nginx作为WebSocket代理(Handshake failed due to invalid Upgrade header: null)
  12. lopatkin俄大神精简中英俄系统Windows 10 Home 18362.145 19H1 Release x86-x64 RU-EN-CN NANO
  13. 各类文件的文件头标志
  14. android高仿朋友圈,高仿微信朋友圈图片展示效果 ImageWatcher
  15. 计算机文件搜索快捷方式,文件搜索快捷键是什么
  16. idea验证失败_阿里云滑块验证失败解决方案
  17. 程序员作死手册:我们是怎样弄丢1400万条日志记录的
  18. H3C路由交换常用命令
  19. SpringBoot SSM vue在线作业考试系统
  20. 安装指定版本docker

热门文章

  1. 【Linux】进程间通信,超详解!
  2. 设置电脑眼睛保护色_百度经验
  3. 【特别篇】不为人知的U盘秘密
  4. 第一次参加csdn活动
  5. web前端期末大作业 html+css+javascript 全球私人定制旅游网页设计实例(6个页面)
  6. 数据结构期末复习知识点详解
  7. 豆瓣八卦小组html失败,养活无数营销号的豆瓣小组,到底在聊什么?
  8. 手机app安卓开发!字节跳动Android岗经典面试真题,文末领取面试资料
  9. BEPs协议:BUMO ATP 30 协议
  10. 深度学习环境配置——(5)Pycharm使用Anaconda创建的pytorch虚拟环境