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

          新聞中心

          EEPW首頁 > 嵌入式系統 > 設計應用 > ARM匯編快速入門

          ARM匯編快速入門

          作者: 時間:2016-11-09 來源:網絡 收藏
          前言:
          以前用ARM的IDE工具,使用的是ARM標準的匯編語言?,F在要使用GNU的工具,當然要了解一點GNU ARM匯編的不同之處。其實非常的簡單,瀏覽一下文檔然后再看看程序就完全可以搞定了,或者你硬著頭皮看GNU ARM的匯編程序,用不了多少時間你就就可以無師自通了。個人比較健忘,還是把文檔翻譯了一下,算是給自己一個避免遺忘的理由吧。

          ARM匯編語言源程序語句,一般由指令,偽操作,宏指令和偽指令作成.ARM匯編語言的設計基礎是匯編偽指令,匯編偽操作和宏指令.

          目前常用的ARM編譯環(huán)境有2種:
          ARMASM: ARM公司的IDE中使用了CodeWarrior的編譯器,絕大多數windows下的開發(fā)者都在使用這一環(huán)境,完全按照ARM的規(guī)定;
          GNU ARM ASM: GNU工具的ARM版本,與ARMASM略有不同;

          關于CodeWarriror ARM匯編的書和文章很多,本文假定你已經完全了解ARMASM,這里只說明GNU ARM匯編,并針對ARMASM給出說明。本文翻譯自:GNU ARM Assembler Quick Reference,本人水平有限,錯誤難免,轉載隨意,請注明出處。英文原文地址不詳。


          GNU ARM 匯編快速入門

          任何匯編行都是如下結構:
          [
          GNU ARM匯編中,任何以冒號結尾的都被認為是一個標簽,而不一定非要在一行的開始。下面是一個簡單的例子,這段匯編程序定義了一個"add"的函數,該函數返回兩個參數的和:
          .section .text, “x”
          .global add @ give the symbol add external linkage
          add:
          ADD r0, r0, r1 @ add input arguments
          MOV pc, lr @ return from subroutine
          @ end of program
          GNU ARM匯編偽指令

          下面列出了一些GNU ARM匯編偽指令,并給出了相應說明。

          .ascii “” 在匯編中定義字符串并為之分配存儲空間(與armasm中的DCB功能類似)。
          .asciz “” 和.ascii類似,但不分配存儲空間。
          .balign {, {,} }
          以某種排列方式在內存中填充數值。(該指令與armasm中的ALIGN類似)。
          power_of_2表示排列方式,其值可為4,8,16或32,單位是byte;
          fill_value是要填充的值;
          max_padding最大的填充界限,請求填充的bytes數超過該值,將被忽略。
          .byte {,} … 定義一個或多個Byte,并為之分配空間(與armasm的DCB類似)。
          .code 設定指令寬度,16表示Thumb,32表示ARM assembly
          (和armasm中的CODE16,CODE32相同)。
          .if
          .else
          .endif
          預編譯宏(與armasm中的IF ELSE ENDIF相同)。
          .end 匯編文件結束標志,常常省略不用。

          .endm 宏結束標志。
          .exitm 宏跳出。
          .macro {} … {,}
          定義一段名為name的宏,arg_xxx為參數。
          必須有對應的.endm結尾。
          可以使用.exitm從中間跳出宏。(與armasm中的MACRO, MEND, MEXIT相同)。
          在使用宏參數時必須這樣使用:“/”。
          例如:
          [CODE].macro SHIFTLEFT a, b
          .if /b < 0
          MOV /a, /a, ASR #-/b
          .exitm
          .endif
          MOV /a, /a, LSL #/b
          .endm

          .rept 循環(huán)執(zhí)行.endr前的代碼段number_of_times次。
          (與armasm中的WEN相似)

          .irp {,} {,} …
          循環(huán)執(zhí)行.endr前的代碼段,param依次取后面給出的值。
          在循環(huán)執(zhí)行的代碼段中必須以“/ ”表示參數。

          .endr 結束循環(huán)(與armasm中的WEND相似).
          .equ , 為一個標號賦值,類似C中的#define。(與armasm中的EQU相同)
          .err編譯錯誤報告,將引起編譯的終止。
          .global 全局聲明標志,這樣聲明的標號將可以被外部使用。(與armasm中的EXPORT相同)。
          .hword {,} …
          插入一個16-bit的數據隊列。(與armasm中的DCW相同)
          .ifdef 如果 被定義,該快代碼將被編譯。以 .endif結束。
          .ifndef 如果 未被定義,該快代碼將被編譯。以 .endif結束。
          .include “” 包含文件。(與armasm中的INCLUDE 或者C中的#i nclude一樣)
          .req
          定義一個寄存器,.req的左邊是定義的寄存器名,右邊是使用的真正使用的寄存器。
          (與armasm中的RN類似)
          例如:acc .req r0
          [CODE].section {,””}
          開始一個新的代碼或數據段。.text,代碼段;.data,初始化數據段;.bss,未初始化數據段。
          這些段都有缺省的標志(flags),聯接器可以識別這些標志。(與armasm中的AREA相同)。

          下面是ELF格式允許的段標志
          <標志>含義
          a允許段
          w可寫段
          x 執(zhí)行段
          .set , 變量賦值。(與armasm中的SETA相同)
          .space {,}
          分配number_of_bytes字節(jié)的數據空間,并填充其值為fill_byte,若未指定該值,缺省填充0。
          (與armasm中的SPACE功能相同)
          .word {,} …
          插入一個32-bit的數據隊列。(與armasm中的DCD功能相同)

          GNU ARM匯編特殊字符和語法
          代碼行中的注釋符號: ‘@’
          整行注釋符號: ‘#’
          語句分離符號: ‘;’
          直接操作數前綴: ‘#’或‘$’
          .arm以arm格式編譯,同code32
          .thumb以thumb格式編譯,同code16
          .code16以thumb格式編譯
          .code32以arm格式編譯


          關鍵詞: ARM匯編快速入

          評論


          技術專區(qū)

          關閉
          看屁屁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); })();