<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匯編編程基礎(chǔ)之三-基本尋址方式與基本指令

          ARM匯編編程基礎(chǔ)之三-基本尋址方式與基本指令

          作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò) 收藏
          要想進(jìn)行ARM的匯編編程,首當(dāng)其沖要知道最基本、最常用的指令,而要了解指令則必須要了解尋址方式。所以本文將聚焦在——基本尋址方式和基本指令。

          首先,來(lái)看一看我們已經(jīng)見(jiàn)過(guò)的2條指令:MOV pc, lr; BL addsub

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

          最簡(jiǎn)單的匯編指令格式是操作碼(例如:MOV、BL)和操作數(shù)(例如:pc, lr, addsub)。操作碼易于理解,例如MOV表示將某個(gè)值從一處傳送到另一處,BL表示跳轉(zhuǎn)到某處;而操作數(shù)則表示一處和另一處到底是哪里(是在寄存器中還是內(nèi)存中),要跳轉(zhuǎn)的位置在哪里(或者是絕對(duì)地址或者是相對(duì)地址)。

          操作數(shù)部分要解決的問(wèn)題是:到哪里去獲得操作數(shù)?因此就有了尋址方式的分類(lèi)?;旧蟻?lái)講,ARM共有8種尋址方式,本文我們了解其中最基本的3種尋址方式:寄存器尋址、立即數(shù)尋址、寄存器間接尋址。

          1、寄存器尋址

          MOV pc, lr 表示操作數(shù)來(lái)源于寄存器(pc和lr)。這種尋址方式,在指令的32位機(jī)器碼中的地址碼部分,存放的是寄存器(pc和lr)的編號(hào),故稱之為寄存器尋址。

          2、立即數(shù)尋址

          MOV pc, #64 表示將常數(shù)64放入寄存器pc,其中常數(shù)64被稱為立即數(shù)。立即數(shù)尋址指令中的地址碼部分就是操作數(shù)本身,也就是說(shuō),數(shù)據(jù)就包含在指令當(dāng)中,取出指令也就取出了可以立即使用的操作數(shù)(故稱為立即數(shù))。

          這里,可能大家會(huì)看出一個(gè)問(wèn)題:由于立即數(shù)是位于32位機(jī)器碼中的,而32位機(jī)器碼中除了操作數(shù)外還有操作碼,這就意味著不可能用全部32bit來(lái)表示立即數(shù)。事實(shí)上,ARM機(jī)器指令中,僅用了最低的12bit來(lái)表示立即數(shù)。那么我們自然推論立即數(shù)的范圍是-2048——2047,這意味著MOV pc, #8192這樣的指令是非法的。但事實(shí)情況并非如此,MOV pc,#8192是合法且能正常運(yùn)行的。真實(shí)情況是,ARM機(jī)器指令可以表示的立即數(shù)范圍是-2^31--2^31-1,只不過(guò)它只能表示這其中的2^12個(gè)數(shù)而已。ARM是這樣用12bit來(lái)表示1個(gè)立即數(shù)的:將12bit劃分為2部分——高4位和低8位,將低8位補(bǔ)0擴(kuò)展為32位,然后循環(huán)右移X位(X = 高4位表示的無(wú)符號(hào)整數(shù)*2),例如:如果32位機(jī)器碼中低12bit為0x512,則其表示的立即數(shù)為0x04800000

          這里,請(qǐng)大家不妨現(xiàn)在先思考2個(gè)問(wèn)題,我們將在后續(xù)文章中予以解答:

          1)、為什么ARM要這樣設(shè)計(jì),而不是按照我們最常見(jiàn)的想法(即:12bit就表示-2^11 -- 2^11-1中的數(shù))

          2)、如果我們需要mov r0, #10000這樣的指令,應(yīng)該怎么辦?(常數(shù)10000不能按照如上的方法進(jìn)行表示)

          3、寄存器間接尋址

          寄存器間接尋址指令中的地址碼給出的是一個(gè)通用寄存器的編號(hào),所需的操作數(shù)保存在寄存器指定地址的存儲(chǔ)單元中,即寄存器為操作數(shù)的地址指針。例如:

          LDR R0, [R2]表示將R2的值作為內(nèi)存地址,到該內(nèi)存處取出存放的數(shù),放到寄存器R0中

          執(zhí)行LDR R0, [R2]前的情況執(zhí)行LDR R0, [R2]后的情況

          了解了基本的尋址方式后,我們現(xiàn)在來(lái)看一看最常用的匯編指令

          1、單寄存器加載指令。主要有

          加載字指令:LDR r0, [r1],將內(nèi)存中的一個(gè)字(4個(gè)字節(jié))加載到寄存器r0中

          加載字節(jié)指令:LDRB r0, [r1],將內(nèi)存中的一個(gè)字節(jié)加載到寄存器r0中

          有符號(hào)數(shù)加載字節(jié)指令:LDRSB r0, [r1],這條指令與上一條指令的不同之處在于,由于加載的是一個(gè)字節(jié),而不是一個(gè)字,所以需要確定寄存器r0的高24bit是什么。對(duì)于上一條指令,r0的高24bit補(bǔ)0,而本條指令,r0的高24bit補(bǔ)符號(hào)位,也就是補(bǔ)r0的bit7

          2、單寄存器存儲(chǔ)指令。主要有

          存儲(chǔ)字指令:STR r0, [r1],將r0中的值存儲(chǔ)到內(nèi)存的4個(gè)字節(jié)中

          存儲(chǔ)字節(jié)指令:STRB r0, [r1],將r0的低8bit存儲(chǔ)到內(nèi)存的1個(gè)字節(jié)中


          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


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