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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM Cortex-M3 學(xué)習(xí)筆記(4-4)

          ARM Cortex-M3 學(xué)習(xí)筆記(4-4)

          作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò) 收藏
          最近在學(xué)ARM Cortex-M3,找了本號(hào)稱很經(jīng)典的書(shū)“An Definitive Guide to The ARM Cortex-M3”在看。這個(gè)系列學(xué)習(xí)筆記其實(shí)就是在學(xué)習(xí)這本書(shū)的過(guò)程中做的讀書(shū)筆記。

          無(wú)條件跳轉(zhuǎn)指令

          跳轉(zhuǎn)指令分為無(wú)條件跳轉(zhuǎn)和有條件跳轉(zhuǎn)兩大類。無(wú)條件跳轉(zhuǎn)類指令非常簡(jiǎn)單,常見(jiàn)的就四種形式。

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

          B Label ;跳轉(zhuǎn)到Label處對(duì)應(yīng)的地址, 無(wú)條件跳轉(zhuǎn)指令

          BX reg ;跳轉(zhuǎn)到由寄存器reg給出的地址, 無(wú)條件跳轉(zhuǎn)指令

          BL Label ;跳轉(zhuǎn)到Label對(duì)應(yīng)的地址,并且把跳轉(zhuǎn)前的下條指令地址保存到LR

          BLX reg ;跳轉(zhuǎn)到由寄存器reg給出的地址,并根據(jù)REG的LSB切換處理器狀態(tài),還要把轉(zhuǎn)移前的下條指令地址保存到LR

          標(biāo)志位與條件轉(zhuǎn)移指令

          在講解條件跳轉(zhuǎn)指令之前。先要講講APSR中的四個(gè)四個(gè)標(biāo)志位:N, Z, C, V。

          實(shí)際上,Cortex-M3中的APSR的標(biāo)志位共有5個(gè),但只有NZCV這四個(gè)可以用于條件跳轉(zhuǎn)指令。下圖中先給出Cortex-M3中的程序狀態(tài)寄存器(xPSR)的位圖。

          圖 1 Cortex-M3中的程序狀態(tài)寄存器(xPSR)

          可以看出,NZCV這四位位于xPSR 的最高四位。這四位的作用分別如下:

          標(biāo)志位

          作用

          N

          負(fù)數(shù)(上一次操作的結(jié)果是個(gè)負(fù)數(shù))。N=操作結(jié)果的MSB

          Z

          零(上次操作的結(jié)果是0)。當(dāng)數(shù)據(jù)操作指令的結(jié)果為0,或者比較/測(cè)試的結(jié)果為0時(shí),Z置位。

          C

          進(jìn)位(上次操作導(dǎo)致了進(jìn)位)。C用于無(wú)符號(hào)數(shù)據(jù)處理,最常見(jiàn)的就是當(dāng)加法進(jìn)位及減法無(wú)借位時(shí)C被置位。此外,C還充當(dāng)移位指令的中介(詳見(jiàn)v7M參考手冊(cè)的指令介紹節(jié))。

          V

          溢出(上次操作結(jié)果導(dǎo)致了數(shù)據(jù)的溢出)。該標(biāo)志用于帶符號(hào)的數(shù)據(jù)處理。比如,在兩個(gè)正數(shù)上執(zhí)行ADD運(yùn)算后,和的MSB為1(視作負(fù)數(shù)),則V置位。

          關(guān)于C和V這兩位我要多說(shuō)幾句。Cortex-M3中的進(jìn)位標(biāo)志與其他一些單片機(jī)有些不同。對(duì)加法運(yùn)算它表示的是結(jié)果有進(jìn)位,這與其他單片機(jī)中的含義是相同的。對(duì)減法運(yùn)算,它表示的是結(jié)果無(wú)借位,與有一些單片機(jī)(比如Freescale 的68HC11/12系列)中的含義正好相反。之所以這里這樣定義進(jìn)位標(biāo)志,我想是這樣考慮的。整數(shù)的減法運(yùn)算A-B實(shí)際是轉(zhuǎn)化為了A+(-B),-B用補(bǔ)碼表示。進(jìn)位標(biāo)志C指示的是A與(-B)相加時(shí)是否有進(jìn)位。A-B無(wú)進(jìn)位等價(jià)于A+(-B)有進(jìn)位。當(dāng)然,后來(lái)我發(fā)現(xiàn)有個(gè)特例,就是當(dāng)B=0時(shí),(-B)=0,A-0 是沒(méi)有進(jìn)位的,但A+(-0)也沒(méi)有進(jìn)位。這時(shí)可以這樣理解,對(duì)0取反操作時(shí),也就是得到-0時(shí)已經(jīng)產(chǎn)生的進(jìn)位(取反加1,加1時(shí)進(jìn)位了)。所以結(jié)果也認(rèn)為是進(jìn)位了。

          溢出位(V)置位有四種情況:

          1.兩個(gè)整數(shù)相加結(jié)果為負(fù)數(shù)時(shí)

          2.兩個(gè)負(fù)數(shù)相加結(jié)果為正數(shù)時(shí)

          3.一個(gè)正數(shù)減一個(gè)負(fù)數(shù)結(jié)果為負(fù)數(shù)時(shí)

          4.一個(gè)負(fù)數(shù)減一個(gè)正數(shù)結(jié)果為正數(shù)時(shí)

          這四種情況與我們的直觀是一致的,因此不需要特殊記憶。

          擔(dān)任條件跳轉(zhuǎn)及條件執(zhí)行的判據(jù)時(shí),這4個(gè)標(biāo)志位既可單獨(dú)使用,又可組合使用,以產(chǎn)生共15種跳轉(zhuǎn)判據(jù),如下表所示。

          符號(hào)

          條件

          關(guān)系到的標(biāo)志位

          EQ

          相等(EQual)

          Z==1

          NE

          不等(NotEqual)

          Z==0

          CS/HS

          進(jìn)位(CarrySet)

          無(wú)符號(hào)數(shù)大于等于

          C==1

          CC/LO

          未進(jìn)位(CarryClear)

          無(wú)符號(hào)數(shù)小于

          C==0

          MI

          負(fù)數(shù)(MInus)

          N==1

          PL

          非負(fù)數(shù)

          N==0

          VS

          溢出

          V==1

          VC

          未溢出

          V==0

          HI

          無(wú)符號(hào)數(shù)大于

          C==1 && Z==0

          LS

          無(wú)符號(hào)數(shù)小于等于

          C==0 || Z==1

          GE

          帶符號(hào)數(shù)大于等于

          N==V

          LT

          帶符號(hào)數(shù)小于

          N!=V

          GT

          帶符號(hào)數(shù)大于

          Z==0 && N==V

          LE

          帶符號(hào)數(shù)小于等于

          Z==1 || N!=V

          AL

          總是

          -

          上面的表格將各種情況都羅列的很清楚,但為什么是這樣還是值得詳細(xì)地說(shuō)說(shuō)的。

          EQ、NE、MI、PL、VS、VC和AL 很好理解,不用多說(shuō)。

          值得細(xì)說(shuō)的是CS/HS、CC/LO、HI、LS、GE、LT、GT、LE。

          首先,我們知道在計(jì)算機(jī)中,整數(shù)分為有符號(hào)型和無(wú)符號(hào)型。這兩種類型的判別是不同的。先說(shuō)無(wú)符號(hào)數(shù)。假設(shè)有兩個(gè)無(wú)符號(hào)整數(shù)A和B。他們之間的關(guān)系可以為:

          A==B、A!=B、A>B、A>=B、A

          判斷的方法就是兩數(shù)字相減A-B=D,然后看標(biāo)志位。

          A==B、A!=B 看 Z 位就可以了,這里不詳述。

          對(duì)于A>B,首先Z==0(表明兩數(shù)不相等),然后得到的結(jié)果必須滿足D<=A,也就是進(jìn)位標(biāo)志C==1(表示減法時(shí)沒(méi)有產(chǎn)生借位),合起來(lái)就是Z==0&& C==1,這時(shí)用后綴HI。這里啰嗦一句,進(jìn)位標(biāo)志置1的含義是加法時(shí)產(chǎn)生了進(jìn)位或減法時(shí)沒(méi)有產(chǎn)生借位。

          對(duì)于A>=B,只用進(jìn)位標(biāo)志C==1(沒(méi)有產(chǎn)生借位)就可以了,用后綴HS或CS。

          對(duì)于A

          對(duì)于A<=B,要么就是Z==1(兩數(shù)相等),要么C==0(A

          假設(shè)A和B是有符號(hào)整數(shù)。他們之間的關(guān)系同樣可以為:

          A==B、A!=B、A>B、A>=B、A

          A==B、A!=B 看 Z 位就可以了。

          其他的比較稍微困難一些,我們要用到溢出位V。

          對(duì)于A>B,有三種可能的情況

          A、B都是正數(shù),結(jié)果D是正數(shù)。Z==0 && V==0 && N==0

          A、B都是負(fù)數(shù),結(jié)果D是正數(shù)。Z==0 && V==0 && N==0

          A是正數(shù)、B是負(fù)數(shù),結(jié)果D可能是正數(shù)(Z==0 && V==0 && N==0)也可能是負(fù)數(shù)(V==1 && N==1)

          對(duì)于A

          A、B都是正數(shù),結(jié)果D是負(fù)數(shù)。V==0 && N==1,不用考慮Z,因?yàn)镹==1決定了Z==0

          A、B都是負(fù)數(shù),結(jié)果D是負(fù)數(shù)。V==0 && N==1,不用考慮Z,因?yàn)镹==1決定了Z==0

          A是負(fù)數(shù)、B是正數(shù),結(jié)果D可能是正數(shù)(V==1 && N==0)也可能是負(fù)數(shù)(V==0&& N==1),與上面的情況類似,V如果等于1了,Z必然等于0,所以還是不用考慮Z。

          綜合上面六種情況,我們可以得到:

          A>B 等價(jià)于 Z==0 && V==N

          A

          有了上面的分析,下面兩種情況就很容易得到答案了。

          對(duì)于A>=B,V==N 就足夠了

          對(duì)于A<=B,Z==1 || V!= N

          IF-THEN 指令塊

          IF-THEN(IT)指令塊在其他的單片機(jī)中沒(méi)有見(jiàn)過(guò),這里值得講一講。

          IF-THEN(IT)指令圍起一個(gè)塊,里面最多有4條指令,它里面的指令可以條件執(zhí)行。

          IT的使用形式如下:

          IT ;圍起1條指令的IF-THEN塊

          IT ;圍起2條指令的IF-THEN塊

          IT ;圍起3條指令的IF-THEN塊

          IT ;圍起4條指令的IF-THEN塊

          其中, ,的取值可以是“T”或者“E”。下面是個(gè)例子:

          要實(shí)現(xiàn)如下的功能:

          if (R0==R1)

          {

          R3 = R4 + R5;

          R3 = R3 / 2;

          }

          else

          {

          R3 = R6 + R7;

          R3 = R3 / 2;

          }

          可以寫(xiě)作:

          CMP R0, R1 ; 比較R0和R1

          ITTEE

          ADDEQ R3, R4, R5 ; 相等時(shí)加法EQ ; 如果R0 == R1,Then-Then-Else-Else

          ASREQ R3, R3, #1 ; 相等時(shí)算術(shù)右移

          ADDNE R3, R6, R7 ; 不等時(shí)加法

          ASRNE R3, R3, #1 ; 不等時(shí)算術(shù)右移

          IT指令塊的初衷應(yīng)該是避免了在執(zhí)行轉(zhuǎn)移指令時(shí),對(duì)流水線的清洗和重新指令預(yù)取的開(kāi)銷,但是最多只能有四條指令,使它的使用范圍也很受限。可能也就是C語(yǔ)言中用到“:?”運(yùn)算符的地方比較容易匯編為IT指令塊了。還有個(gè)邊很短小的if判斷,能夠被這么優(yōu)化。



          關(guān)鍵詞: ARMCortex-M

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(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); })();