<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Thumb指令集之: ARM和Thumb的混合編程

Thumb指令集之: ARM和Thumb的混合編程

作者: 時(shí)間:2013-09-30 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/257035.htm

11.10和Thumb的

11.10.1互交工作基礎

Thumb以其較高的代碼密度和在窄存儲器上的性能,使得它在很多系統中得到廣泛應用。但在很多情況下,還是不得不使用指令,這是因為:

代碼比Thumb代碼有更快的執行速度;

②A(yíng)RM處理器的一些特定功能必須由ARM指令實(shí)現,其中包括PSR指令、協(xié)處理器指令;

③異常發(fā)生時(shí),處理器自動(dòng)進(jìn)入ARM狀態(tài),如果異常處理程序需要使用Thumb指令也必須通用一個(gè)ARM程序頭(ARMassemblerheader)。

基于以上原因,即使程序需要由Thumb代碼實(shí)現,也必須通過(guò)ARM-Thumb互交(ARM-Thumbinterworking)進(jìn)入Thumb狀態(tài)。

ARM-Thumb互交是指對匯編語(yǔ)言和C/C++語(yǔ)言的ARM和Thumb代碼進(jìn)行連接的方法,它進(jìn)行兩種狀態(tài)(ARM和Thumb狀態(tài))間的切換。在進(jìn)行這種切換時(shí),有時(shí)需使用額外的代碼,這些代碼被稱(chēng)為。定義了ARM和Thumb過(guò)程調用的標準。

從一個(gè)ARM例程調用一個(gè)Thumb例程,內核必須進(jìn)行狀態(tài)切換。狀態(tài)的變化由CPSR的T位來(lái)顯示。在跳轉到一個(gè)例程時(shí)BX指令可用于A(yíng)RM和Thumb狀態(tài)切換,具體用法如下。

在Thumb狀態(tài)調用ARM例程時(shí),采用:

BXRn;

在A(yíng)RM狀態(tài)調用Thumb例程時(shí),采用:

BX{cond}Rn;

其中,Rn可以是r0~r15中的任意寄存器。

這種帶狀態(tài)切換的跳轉指令BX,將寄存器Rn的內容拷貝到程序計數器寄存器PC,因此可以實(shí)現4G空間的跳轉。指令根據寄存器Rn的bit[0]來(lái)決定處理器是否進(jìn)行狀態(tài)切換,詳細內容參見(jiàn)ARM指令一節。

下面是一段ARM程序,該程序調用虛擬的SWI_writeC子程序從存儲器的固定地址取出字符串“helloworld”并輸出。

AREAHello,CODE,READONLY

SWI_WriteCEQU0 ;軟中斷調用參數

SWI_ExitEQU11 ;程序退出軟中斷調用參數

ENTRY

STARTADRr1,TEXT ;取字符串地址

LOOPLDRBr0,[r1],#1 ;取下一字節內容

CMPr0,#0 ;判斷是否為字符串尾

SWINESWI_WriteC ;軟中斷調用打印字符

BENLOOP ;循環(huán)

SWISWI_Exit ;軟中斷調用退出程序執行

TEXT=“HelloWorld”,0a,0d,0

END

下面的代碼將上面的ARM代碼轉換成等價(jià)的Thumb代碼。

AREAHelloW_Thumb,CODE,READONLY

SWI_WriteCEQU0 ;軟中斷調用參數

SWI_ExitEQU11 ;程序退出軟中斷調用參數

ENTRY ;程序入口點(diǎn)

CODE32進(jìn)入ARM狀態(tài)

ADRr0,START+1 ;取得Thumb代碼入口地址

BXr0 ;進(jìn)入Thumb代碼

CODE16 ;Thumb代碼入口點(diǎn)

STARTADRr1,TEXT ;r1->HelloWorld

LOOPLDRBr0,[r1] ;取下一字節內容

ADDr1,r1,#1 ;地址指針加1**T

CMPr0,#0 ;判斷是否為字符串尾

BEQDONE ;完成?**T

SWISWI_WriteC ;如果不是字符串尾

BLOOP ;繼續循環(huán)

DONESWISWI_Exit ;程序退出

ALIGN ;字對齊

TEXTDATA

HelloWorld,0a,0d,00

END

上例中,ARM代碼到Thumb代碼轉換過(guò)程中新增加的指令用“**T”標注。

c++相關(guān)文章:c++教程



上一頁(yè) 1 2 3 4 5 6 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>