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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM匯編指令的一些總結(jié)

          ARM匯編指令的一些總結(jié)

          作者: 時(shí)間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
          ARM匯編指令很多,但是真正常用的不是很多,而且需要認(rèn)真琢磨的又更少了。

          比較有用的是MOVBBLLDRSTR

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

          還是通過具體匯編代碼來學(xué)習(xí)吧。

          @ disable watch dog timer

          movr1, #0x53000000//立即數(shù)尋址方式

          movr2, #0x0

          strr2, [r1]

          MOV沒有什么好說的,只要掌握幾個(gè)尋址方式就可以了,而且ARM的尋址方式比386的簡單很多。立即數(shù)尋址方式,立即數(shù)要求以“#”作前綴,對于十六進(jìn)制的數(shù),還要求在#后面加上0x或者&。0x大家很好理解。有一次我碰到了&ff這個(gè)數(shù),現(xiàn)在才明白跟0xff是一樣的。

          STR是比較重要的指令了,跟它對應(yīng)的是LDR。ARM指令集是加載/存儲型的,也就是說它只處理在寄存器中的數(shù)據(jù)。那么對于系統(tǒng)存儲器的訪問就經(jīng)常用到STR和LDR了。STR是把寄存器上的數(shù)據(jù)傳輸?shù)街付ǖ刂返拇鎯ζ魃稀K母袷轿覀€(gè)人認(rèn)為很特殊:

          STR(條件)源寄存器,<存儲器地址>

          比如STR R0, [R1],意思是R0-> [R1],它把源寄存器寫在前面,跟MOV、LDR都相反。

          LDR應(yīng)該是非常常見了。LDR就是把數(shù)據(jù)從存儲器傳輸?shù)郊拇嫫魃?。而且有個(gè)偽指令也是LDR,因此我有個(gè)百思不得其解的問題。看這段代碼:

          movr1, #GPIO_CTL_BASE

          addr1, r1, #oGPIO_F

          ldrr2,=0x55aa// 0x55aa是個(gè)立即數(shù)啊,前面加個(gè)=干什么?

          strr2, [r1, #oGPIO_CON]

          movr2, #0xff

          strr2, [r1, #oGPIO_UP]

          movr2, #0x00

          strr2, [r1, #oGPIO_DAT]

          對于當(dāng)中的ldr那句,我就不明白了,如果你把=去掉,是不能通過編譯的。我查了一些資料,個(gè)人感覺知道了原因:這個(gè)=應(yīng)該表示LDR不是ARM指令,而是偽指令。作為偽指令的時(shí)候,LDR的格式如下:

          LDR寄存器,=數(shù)字常量/Label

          它的作用是把一個(gè)32位的地址或者常量調(diào)入寄存器。嗬嗬,那大家可能會問,

          “MOV r2,#0x55aa”也可以啊。應(yīng)該是這樣的。不過,LDR是偽指令啊,也就是說編譯時(shí)編譯器會處理它的。怎么處理的呢?——規(guī)則如下:如果該數(shù)字常量在MOV指令范圍內(nèi),匯編器會把這個(gè)指令作為MOV。如果不在MOV范圍中,匯編器把該常量放在程序后面,用LDR來讀取,PC和該常量的偏移量不能超過4KB。

          這么一說,雖然似懂非懂,但是能夠解釋這個(gè)語句了。

          然后說一下跳轉(zhuǎn)指令。ARM有兩種跳轉(zhuǎn)方式。

          (1)mov pc <跳轉(zhuǎn)地址〉

          這種向程序計(jì)數(shù)器PC直接寫跳轉(zhuǎn)地址,能在4GB連續(xù)空間內(nèi)任意跳轉(zhuǎn)。

          (2)通過BBLBLXBX可以完成在當(dāng)前指令向前或者向后32MB的地址空間的跳轉(zhuǎn)(為什么是32MB呢?寄存器是32位的,此時(shí)的值是24位有符號數(shù),所以32MB)。

          B是最簡單的跳轉(zhuǎn)指令。要注意的是,跳轉(zhuǎn)指令的實(shí)際值不是絕對地址,而是相對地址——是相對當(dāng)前PC值的一個(gè)偏移量,它的值由匯編器計(jì)算得出。

          BL非常常用。它在跳轉(zhuǎn)之前會在寄存器LR(R14)中保存PC的當(dāng)前內(nèi)容。BL的經(jīng)典用法如下:

          blNEXT; 跳轉(zhuǎn)到NEXT

          ……

          NEXT

          ……

          mov pc, lr; 從子程序返回。

          最后提一下Thumb指令。ARM體系結(jié)構(gòu)還支持16位的Thumb指令集。Thumb指令集是ARM指令集的子集,它保留了32位代碼優(yōu)勢的同時(shí)還大大節(jié)省了存儲空間。由于Thumb指令集的長度只有16位,所以它的指令比較多。它和ARM各有自己的應(yīng)用場合。對于系統(tǒng)性能有較高要求,應(yīng)使用32位存儲系統(tǒng)和ARM指令集;對于系統(tǒng)成本和功耗有較高要求,應(yīng)使用16位存儲系統(tǒng)和ARM指令集。



          關(guān)鍵詞: ARM匯編指

          評論


          技術(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); })();