<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/257035.htm

          11.10和Thumb的

          11.10.1互交工作基礎(chǔ)

          Thumb以其較高的代碼密度和在窄存儲(chǔ)器上的性能,使得它在很多系統(tǒng)中得到廣泛應(yīng)用。但在很多情況下,還是不得不使用指令,這是因?yàn)椋?/p>

          代碼比Thumb代碼有更快的執(zhí)行速度;

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

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

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

          ARM-Thumb互交是指對(duì)匯編語(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ò)程調(diào)用的標(biāo)準(zhǔn)。

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

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

          BXRn;

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

          BX{cond}Rn;

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

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

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

          AREAHello,CODE,READONLY

          SWI_WriteCEQU0 ;軟中斷調(diào)用參數(shù)

          SWI_ExitEQU11 ;程序退出軟中斷調(diào)用參數(shù)

          ENTRY

          STARTADRr1,TEXT ;取字符串地址

          LOOPLDRBr0,[r1],#1 ;取下一字節(jié)內(nèi)容

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

          SWINESWI_WriteC ;軟中斷調(diào)用打印字符

          BENLOOP ;循環(huán)

          SWISWI_Exit ;軟中斷調(diào)用退出程序執(zhí)行

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

          END

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

          AREAHelloW_Thumb,CODE,READONLY

          SWI_WriteCEQU0 ;軟中斷調(diào)用參數(shù)

          SWI_ExitEQU11 ;程序退出軟中斷調(diào)用參數(shù)

          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] ;取下一字節(jié)內(nèi)容

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

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

          BEQDONE ;完成?**T

          SWISWI_WriteC ;如果不是字符串尾

          BLOOP ;繼續(xù)循環(huán)

          DONESWISWI_Exit ;程序退出

          ALIGN ;字對(duì)齊

          TEXTDATA

          HelloWorld,0a,0d,00

          END

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

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



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

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();