<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM匯編程序基本知識

ARM匯編程序基本知識

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

1.匯編程序的基本組成

本文引用地址:http://dyxdggzs.com/article/201611/322725.htm

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

代碼段定義

AREA Init, CODE, READONLY

數據段定義

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

……

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

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

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

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

StartLDR R0,0x3FF5000 ;標號Start可以要,也可以不要

LDR R1,0Xff

STR R1,[R0]

LDR R0,=0x3FF5000

LDR R1,0x01

STR R1,[R0]

……

END ;END偽操作表示本源文件結束

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

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

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

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

鏈接器根據系統默認或者用戶(hù)設定的規則,將各段安排在存儲器中的相應位置,因此源程序中段之間的相對位置與可執行映像文件中的段的相對位置一般不會(huì )相同。

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

匯編語(yǔ)句格式

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

LABEL必須在一行的開(kāi)頭寫(xiě)。

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

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

例子:

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 ;寄存器小寫(xiě)正確,指令助記符大小寫(xiě)混合錯誤

3.常用符號

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

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

例子:

GBLA DATA

DATASETA 0x20

LCLS str1

str1 SETS “PEN”

LCLL lc

lc SETL {TRUE}

常量是在運行過(guò)程中不能改變的量。ARM支持數值常量、邏輯常量和字符串常量。匯編中使用EQU來(lái)定義一個(gè)數值常量,如

Test EQU 10; 定義標號Test的值為20.

Addr EQU 0x55,CODE32;

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

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

4.常見(jiàn)的偽操作符

符號定義偽操作

GBLA、GBLL、GBLS

LCLA、LCLL、LCLS

SETA、SETL、SETS

RLIST

其中RLIST用來(lái)定義通用寄存器列表名稱(chēng),使用該偽操作定義的名稱(chēng)可以在A(yíng)RM指令LDM/STM中使用。在LDM/STM中,訪(fǎng)問(wèn)列表中的寄存器次序為寄存器編號由低到高的順序。如

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

在程序中使用

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

LDMIA R5, RegList ; 加載列表

數據定義偽操作

DCB 分配一片連續的字節存儲單元并初始化

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

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

DCDO、DCI、DCQ(DCQU)

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

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

SPACE 分配一片連續的存儲單元

FIELD、MAP、LTORG


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

關(guān)鍵詞: ARM匯編程序基本知

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>