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

          新聞中心

          ARM匯編程序基本知識

          作者: 時(shí)間:2016-11-28 來源:網(wǎng)絡(luò) 收藏

          1.匯編程序的基本組成

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

          ARM匯編語言程序中,程序是以程序段為單位組織代碼的。段是相對獨(dú)立的指令或者代碼序列,擁有特定的名稱。段的種類有代碼段、數(shù)據(jù)段和通用段,代碼段的內(nèi)容為執(zhí)行代碼,數(shù)據(jù)段存放代碼運(yùn)行時(shí)需要用到的數(shù)據(jù),通用段不包含用戶代碼和數(shù)據(jù),所有通用段共用一個(gè)空間。段使用AREA偽操作來定義,并且說明相關(guān)屬性,如

          代碼段定義

          AREA Init, CODE, READONLY

          數(shù)據(jù)段定義

          AREA Stack1,DATA,READWRITE,NOINIT,ALIGN=3

          ……

          一個(gè)匯編程序至少應(yīng)該有一個(gè)代碼段,可以有零或者多個(gè)數(shù)據(jù)段。在格式上,一個(gè)匯編程序需要至少有一個(gè)ENTRY(關(guān)于ENTRY具體內(nèi)容看偽操作符ENTRY),還需要在匯編源文件結(jié)束處,寫上END表示該源文件的結(jié)束。

          如一個(gè)基本的匯編源程序

          AREA Init, CODE, READONLY ;定義一個(gè)代碼段

          ENTRY ;標(biāo)記程序入口點(diǎn)

          StartLDR R0,0x3FF5000 ;標(biāo)號Start可以要,也可以不要

          LDR R1,0Xff

          STR R1,[R0]

          LDR R0,=0x3FF5000

          LDR R1,0x01

          STR R1,[R0]

          ……

          END ;END偽操作表示本源文件結(jié)束

          當(dāng)匯編程序較長時(shí),可以分割為多個(gè)代碼段和多個(gè)數(shù)據(jù)段,多個(gè)段在程序編譯鏈接時(shí),最終形成一個(gè)可執(zhí)行的映像文件。一個(gè)可執(zhí)行映像文件通常由以下幾部分組成

          一個(gè)或者多個(gè)代碼段,代碼段屬性為只讀(只讀數(shù)據(jù)也放在代碼段?RO)

          零個(gè)或者多個(gè)初始化數(shù)據(jù)的數(shù)據(jù)段,可讀寫(存放初始化了的變量數(shù)據(jù),RW)

          零個(gè)或者多個(gè)不包含初始化數(shù)據(jù)的數(shù)據(jù)段,可讀寫(所有未初始化的變量,也就是ZI)

          鏈接器根據(jù)系統(tǒng)默認(rèn)或者用戶設(shè)定的規(guī)則,將各段安排在存儲器中的相應(yīng)位置,因此源程序中段之間的相對位置與可執(zhí)行映像文件中的段的相對位置一般不會相同。

          2.匯編語句應(yīng)該注意的地方

          匯編語句格式

          [LABEL] OPERATION, [OPERAND], [;COMMENT]

          LABEL必須在一行的開頭寫。

          OPERATION包括指令、偽操作、宏指令或偽指令。每一條操作助記符必須全部大寫或者全部小寫。在寫操作助記符前,必須有空格。

          OPERAND 表示操作的對象,可以使常量、變量、標(biāo)號、寄存器或者表達(dá)式,不同的對象之間必須用逗號分開。

          例子:

          AREA EX2,CODE,READONLY ;操作助記符前面必須有空格

          GBLA DATA ;操作助記符前面必須有空格

          DATASETA,0x20 ;變量名DATA前面不能留空格

          ADD R0,R1,R2

          ADD R0,R1,r2

          add R0,R1,r2

          Add R0,R1,r2 ;寄存器小寫正確,指令助記符大小寫混合錯(cuò)誤

          3.常用符號

          匯編語言中,經(jīng)常使用各種符號表示變量、常量和地址。

          變量的定義:使用偽操作GBLA、GBLL、GBLS,分別是定義全局的數(shù)值變量、邏輯變量和字符變量;LCLA、LCLL、LCLS定義局部的數(shù)值變量、邏輯變量和字符變量。相應(yīng)的變量使用SETA、SETL、SETS來進(jìn)行賦值。注意字符串長度不應(yīng)超過512個(gè)字節(jié)。

          例子:

          GBLA DATA

          DATASETA 0x20

          LCLS str1

          str1 SETS “PEN”

          LCLL lc

          lc SETL {TRUE}

          常量是在運(yùn)行過程中不能改變的量。ARM支持?jǐn)?shù)值常量、邏輯常量和字符串常量。匯編中使用EQU來定義一個(gè)數(shù)值常量,如

          Test EQU 10; 定義標(biāo)號Test的值為20.

          Addr EQU 0x55,CODE32;

          關(guān)于EQU的具體使用,看偽操作EQU。

          數(shù)值常量一般為32為的整數(shù),可以使十進(jìn)制、十六進(jìn)制,也可以是n進(jìn)制(n=2~9)如8_247是一個(gè)八進(jìn)制數(shù)。

          4.常見的偽操作符

          符號定義偽操作

          GBLA、GBLL、GBLS

          LCLA、LCLL、LCLS

          SETA、SETL、SETS

          RLIST

          其中RLIST用來定義通用寄存器列表名稱,使用該偽操作定義的名稱可以在ARM指令LDM/STM中使用。在LDM/STM中,訪問列表中的寄存器次序?yàn)榧拇嫫骶幪栍傻偷礁叩捻樞?。?/p>

          RegList RLIST {r0-r5,r8,r10}; 將寄存器列表名稱定義為RegList

          在程序中使用

          STMFD SP!, RegList ;存儲列表到堆棧

          LDMIA R5, RegList ; 加載列表

          數(shù)據(jù)定義偽操作

          DCB 分配一片連續(xù)的字節(jié)存儲單元并初始化

          DCW(DCWU) 分配一片連續(xù)的半字存儲單元并初始化

          DCD(DCDU) 分配一片連續(xù)的字存儲單元并初始化

          DCDO、DCI、DCQ(DCQU)

          DCFS(DCFSU) 為單精度浮點(diǎn)數(shù)分配一片連續(xù)的字存儲單元并初始化

          DCFD(DCFDU) 為雙精度浮點(diǎn)數(shù)分配一片連續(xù)的字存儲單元并初始化

          SPACE 分配一片連續(xù)的存儲單元

          FIELD、MAP、LTORG


          上一頁 1 2 下一頁

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