日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

arm export 汇编_灵活使用ARM汇编的WEAK关键字 (INPORT,EXPORT)---应该是在keil环境下,iar等还不知道...

發布時間:2023/12/29 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 arm export 汇编_灵活使用ARM汇编的WEAK关键字 (INPORT,EXPORT)---应该是在keil环境下,iar等还不知道... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載于: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等还不知道...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。