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

          新聞中心

          常用ARM匯編指令

          作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò) 收藏
          嵌入式開發(fā)中,匯編程序常常用于非常關(guān)鍵的地方,比如系統(tǒng)啟動(dòng)時(shí)初始化,進(jìn)出中斷時(shí)的環(huán)境保護(hù),恢復(fù)等對(duì)性能有要求的地方。

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

          ARM指令集可以分為六大類,分別為數(shù)據(jù)處理指令、Load/Store指令、跳轉(zhuǎn)指令、程序狀態(tài)寄存器處理指令、協(xié)處理器指令和異常產(chǎn)生指令。
          ARM指令使用的基本格式如下:
          〈opcode〉{〈cond〉}{S}〈Rd〉,〈Rn〉{,〈operand2〉}
          opcode 操作碼;指令助記符,如LDR、STR等。
          cond 可選的條件碼;執(zhí)行條件,如EQ、NE等。
          S 可選后綴;若指定“S”,則根據(jù)指令執(zhí)行結(jié)果更新CPSR中的條件碼。
          Rd 目標(biāo)寄存器。
          Rn 存放第1操作數(shù)的寄存器。
          operand2 第2個(gè)操作數(shù)

          arm的尋址方式如下:
          立即尋址
          寄存器尋址
          寄存器間接尋址
          基址加偏址尋址
          堆棧尋址
          塊拷貝尋址
          相對(duì)尋址
          這里不作詳細(xì)描述,可以查閱相關(guān)文檔。

          數(shù)據(jù)處理指令
          Load/Store指令
          程序狀態(tài)寄存器與通用寄存器之間的傳送指令
          轉(zhuǎn)移指令
          異常中斷指令
          協(xié)處理器指令


          在S3C2410、S3C2440的數(shù)據(jù)手冊(cè)中對(duì)各種匯編指令有詳細(xì)的描述;這里只對(duì)較常見(jiàn)的作寫介紹。
          1、相對(duì)跳轉(zhuǎn)指令:b、bl
          這兩條指令的不同之處在于bl指令除了跳轉(zhuǎn)之外,還將返回地址(bl的下一條指令的地址)保存在lr寄存器中。
          這兩條指令的可跳轉(zhuǎn)范圍是當(dāng)前指令前后32M。

          b funa
          ....
          funa:
          b funb
          ....
          funb:
          ....

          2、數(shù)據(jù)傳送指令mov,地址讀取偽指令ldr
          mov指令可以把一個(gè)寄存器的值賦給另外一個(gè)寄存器,或者把一個(gè)常數(shù)賦給寄存器。
          mov r1, r2

          mov r1,#1024

          mov傳送的常數(shù)必須能用立即數(shù)來(lái)表示。當(dāng)不能用立即數(shù)表示時(shí),可以用ldr命令來(lái)賦值。
          ldr是偽命令,不是真實(shí)存在的指令,編譯器會(huì)把它擴(kuò)展成真正的指令;如果該常數(shù)能用“立即數(shù)”來(lái)表示,則使用mov指令,否則編譯時(shí)將該常數(shù)保存在某個(gè)位置,使用內(nèi)存讀取指令把它讀出來(lái)。
          ldr r1, = 1024


          3、內(nèi)存訪問(wèn)指令 ldr、str、ldm、stm
          ldr既可以指低至讀取偽指令,也可以是內(nèi)存訪問(wèn)指令。當(dāng)他的第二個(gè)參數(shù)前面有=時(shí)標(biāo)偽指令,否則表內(nèi)存訪問(wèn)指令。
          ldr指令從內(nèi)存中讀取數(shù)據(jù)到寄存器,str指令把寄存器的指存儲(chǔ)到內(nèi)存中,他們的操作數(shù)都是32位的。

          ldr r1, [r2, #4]
          ldr r1,[r2]
          ldr r1,[r2], #4
          str r1 ,[r2, #4]
          str r1, [r2]
          str r1, [r2],#4
          寄存器傳送指令可以用一條指令將16個(gè)可見(jiàn)寄存器(R0~R15)的任意子集合(或全部)存儲(chǔ)到存儲(chǔ)器或從存儲(chǔ)器中讀取數(shù)據(jù)到該寄存器集合中。與單寄存器存取指令相比,多寄存器數(shù)據(jù)存取可用的尋址模式更加有限。多寄存器存取指令的匯編格式如下:

          LDM/STM{}Rn{!},


          4、加減指令 add、sub

          add r1, r2, #1
          sub r1, r2, #1

          5、程序狀態(tài)寄存器的訪問(wèn)指令msr,mrs

          ARM指令中有兩條指令,用于在狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù)。修改狀態(tài)寄存器一般是通過(guò)“讀取-修改-寫回”三個(gè)步驟的操作來(lái)實(shí)現(xiàn)的。 這兩條指令分別是:
          狀態(tài)寄存器到通用寄存器的傳送指令(MRS)
          通用寄存器到狀態(tài)寄存器的傳送指令(MSR)

          其匯編格式如下:
          MRS{} Rd,CPSR|SPSR
          其匯編格式如下:
          MSR{} CPSR_f | SPSR_f,#<32-bit immediate>
          MSR{} CPSR_ | SPSR_,Rm

          msr cpsr, r0
          mrs r0, cpsr

          6、異常中斷指令
          異常中斷指令可以分為一下兩種:
          軟件中斷指令(SWI)
          斷點(diǎn)指令(BKPT—僅用于v5T體系)
          軟件中斷指令SWI用于產(chǎn)生SWI異常中斷,用來(lái)實(shí)現(xiàn)在用戶模式下對(duì)操作系統(tǒng)中特權(quán)模式的程序的調(diào)用;斷點(diǎn)中斷指令BKPT主要用于產(chǎn)生軟件斷點(diǎn),供調(diào)試程序用。

          7、其他偽指令

          .extern main
          .text
          .global _start
          _start:

          .extern 定義一個(gè)外部符號(hào)(可以是變量也可以是函數(shù)),上面的代碼表示表文本文件中引用的main是一個(gè)外部函數(shù)。

          .text表示下面的語(yǔ)句都屬于代碼段

          .global將本文件中的某個(gè)程序標(biāo)號(hào)定義為全局的,如‘_start’就是個(gè)全局函數(shù)



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

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