版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、ARM匯編語言 ARM匯編語言源程序語句,一般由指令,偽操作,宏指令和偽指令作成.ARM匯編語言的設(shè)計基礎(chǔ)是匯編偽指令,匯編偽操作和宏指令. 偽操作,是ARM匯編語言程序里的一些特殊的指令助記符,其作用主要是為完成匯編程序做各種準(zhǔn)備工作,在源程序運行匯編程序處理,而不是在計算機運行期間有機器執(zhí)行.也就是說,這些偽操作只是匯編過程中起作用,一旦匯編結(jié)束,偽操作的使命也就隨之消失. 宏指令,是一段獨立的程序代碼,可以插在程序中,它通過偽操作來定義,宏在被使用之前必須提前定義好,宏之間可以互相調(diào)用,也可自己遞歸調(diào)用.通過直接書寫宏名來使用宏.并本具宏指令的格式輸入輸出參數(shù).宏定義本身不產(chǎn)生代碼,只是
2、在調(diào)用它時把宏體插入到原程序中.宏與C語言中的子函數(shù)形參和實參的調(diào)用相似,調(diào)用宏時通過實際的指令來 代替宏體實現(xiàn)相關(guān)的一段代碼,但宏的調(diào)用與子程序的調(diào)用有本質(zhì)的區(qū)別,既宏并不會節(jié)省程序的空間,其優(yōu)點是簡化程序代碼,提高程序的可讀性以及宏內(nèi)容可以同步修改. 偽操作,宏指令一般與編譯程序有關(guān),因此ARM匯編語言的偽操作,宏指令在不同的編譯環(huán)境下有不同的編寫形式和規(guī)則. 偽指令也是ARM匯編語言程序里的特殊助記符,也不在處理器運行期間由機器執(zhí)行,他們在匯編時將被合適的機器指令代替成ARM或Thumb指令,從而實現(xiàn)真正的指令操作. 目前常用的ARM編譯環(huán)境有2種. 1. ADS/SDT IDE:ARM
3、公司開發(fā),使用了CodeWarrior公司的編譯器. 2. 集成了GNU開發(fā)工具的IDE開發(fā)環(huán)境;它由GNU的匯編器as,交叉匯編器gcc和連接器id組成.ADS編譯環(huán)境下的ARM偽操作和宏指令,可參考北航出版社的ARM微控制器基礎(chǔ)與實踐(周立功)這里主要講述ARM GNU常用匯編語言4 ARM GNU常用匯編語言介紹4.1 ARM GNU常用匯編偽指令介紹1. abort.abort: 停止匯編.align absexpr1,absexpr2:以某種對齊方式,在未使用的存儲區(qū)域填充值. 第一個值表示對齊方式,4, 8,16或32. 第二個表達(dá)式值表示填充的值.2. if.else.endif
4、.if.else.endif: 支持條件預(yù)編譯3. include.include file: 包含指定的頭文件, 可以把一個匯編常量定義放在頭文件中.4. m symbol, length:在bss段申請一段命名空間,該段空間的名稱叫symbol, 長度為length. Ld連接器在連接會為它留出空間.5. data.data subsection: 說明接下來的定義歸屬于subsection數(shù)據(jù)段.6. equ.equ symbol, expression: 把某一個符號(symbol)定義成某一個值(expression).該指令并不分配空間.7. global.glob
5、al symbol: 定義一個全局符號, 通常是為ld使用.8. ascii.ascii string: 定義一個字符串并為之分配空間.9. byte.byte expressions: 定義一個字節(jié), 并為之分配空間.10. short.short expressions: 定義一個短整型, 并為之分配空間.11. expressions: 定義一個整型,并為之分配空間.12 long.long expressions: 定義一個長整型, 并為之分配空間.13 word.word expressions: 定義一個字,并為之分配空間, 4bytes.14. macro/end
6、m.macro: 定義一段宏代碼, .macro表示代碼的開始, .endm表示代碼的結(jié)束.15. reqname .req register name: 為寄存器定義一個別名.16. code.code 16|32: 指定指令代碼產(chǎn)生的長度, 16表示Thumb指令, 32表示ARM指令.17. ltorg.ltorg: 表示當(dāng)前往下的定義在歸于當(dāng)前段,并為之分配空間.4.2 ARM GNU專有符號1. 表示注釋從當(dāng)前位置到行尾的字符.2. #注釋掉一整行.3. ;新行分隔符.4.3 操作碼1. NOPnop空操作, 相當(dāng)于MOV r0, r02. LDRldr , = 相當(dāng)于PC寄存器或其
7、它寄存器的長轉(zhuǎn)移.3.ADRadr 相于PC寄存器或其它寄存器的小范圍轉(zhuǎn)移.ADRLadrl 相于PC寄存器或其寄存器的中范圍轉(zhuǎn)移.5 可執(zhí)行生成說明5.1 lds文件說明5.1.1 主要符號說明 1. OUTPUT_FORMAT(bfdname) 指定輸出可執(zhí)行文件格式. 2. OUTPUT_ARCH(bfdname) 指定輸出可執(zhí)行文件所運行CPU平臺 3. ENTRY(symbol) 指定可執(zhí)行文件的入口段 5.1.2 段定義說明 1. 段定義格式 SECTIONS . 段名 : 內(nèi)容 . 前言: 以前用ARM的IDE工具,使用的是ARM標(biāo)準(zhǔn)的匯編語言。現(xiàn)在要使用GNU的工具,當(dāng)然要了解
8、一點GNU ARM匯編的不同之處。其實非常的簡單,瀏覽一下文檔然后再看看程序就完全可以搞定了,或者你硬著頭皮看GNU ARM的匯編程序,用不了多少時間你就就可以無師自通了。個人比較健忘,還是把文檔翻譯了一下,算是給自己一個避免遺忘的理由吧。 ARM匯編語言源程序語句,一般由指令,偽操作,宏指令和偽指令作成.ARM匯編語言的設(shè)計基礎(chǔ)是匯編偽指令,匯編偽操作和宏指令. 目前常用的ARM編譯環(huán)境有2種:ARMASM: ARM公司的IDE中使用了CodeWarrior的編譯器,絕大多數(shù)windows下的開發(fā)者都在使用這一環(huán)境,完全按照ARM的規(guī)定; GNU ARM ASM: GNU工具的ARM版本,與
9、ARMASM略有不同; 關(guān)于CodeWarriror ARM匯編的書和文章很多,本文假定你已經(jīng)完全了解ARMASM,這里只說明GNU ARM匯編,并針對ARMASM給出說明。本文翻譯自:GNU ARM Assembler Quick Reference, 本人水平有限,錯誤難免,轉(zhuǎn)載隨意,請注明出處。英文原文地址不詳。 GNU ARM 匯編快速入門任何匯編行都是如下結(jié)構(gòu):: comment: 注釋GNU ARM 匯編中,任何以冒號結(jié)尾的都被認(rèn)為是一個標(biāo)簽,而不一定非要在一行的開始。下面是一個簡單的例子,這段匯編程序定義了一個add的函數(shù),該函數(shù)返回兩個參數(shù)的和:.section .text,
10、“x”.global add give the symbol add external linkageadd:ADD r0, r0, r1 add input argumentsMOV pc, lr return from subroutine end of programGNU ARM匯編偽指令下面列出了一些GNU ARM匯編偽指令,并給出了相應(yīng)說明。.ascii “” 在匯編中定義字符串并為之分配存儲空間(與armasm中的DCB功能類似)。 .asciz “” 和.ascii類似, 但不分配存儲空間。.balign , , 以某種排列方式在內(nèi)存中填充數(shù)值。 (該指令與armasm中的AL
11、IGN類似)。power_of_2表示排列方式,其值可為4,8,16或32,單位是byte; fill_value是要填充的值; max_padding最大的填充界限,請求填充的bytes數(shù)超過該值,將被忽略。.byte , 定義一個或多個Byte,并為之分配空間(與armasm的DCB類似)。 .code 設(shè)定指令寬度,16表示Thumb,32表示ARM assembly (和armasm中的CODE16,CODE32相同)。.if .else .endif 預(yù)編譯宏(與armasm中的IF ELSE ENDIF相同)。 .end 匯編文件結(jié)束標(biāo)志,常常省略不用。 .endm 宏結(jié)束標(biāo)志。
12、.exitm 宏跳出。 .macro arg_1 , , 定義一段名為name的宏,arg_xxx為參數(shù)。必須有對應(yīng)的.endm結(jié)尾??梢允褂?exitm從中間跳出宏。(與armasm中的MACRO, MEND, MEXIT相同)。 在使用宏參數(shù)時必須這樣使用:“”。例如: CODE.macro SHIFTLEFT a, b.if b 0MOV a, a, ASR #-b.exitm.endifMOV a, a, LSL #b.endm.rept 循環(huán)執(zhí)行.endr前的代碼段number_of_times次。(與armasm中的WEN相似).irp , , 循環(huán)執(zhí)行.endr前的代碼段,par
13、am依次取后面給出的值。在循環(huán)執(zhí)行的代碼段中必須以“ ”表示參數(shù)。.endr 結(jié)束循環(huán)(與armasm中的WEND相似). .equ , 為一個標(biāo)號賦值,類似C中的#define。(與armasm中的EQU相同).err 編譯錯誤報告,將引起編譯的終止。.global 全局聲明標(biāo)志,這樣聲明的標(biāo)號將可以被外部使用。(與armasm中的EXPORT相同)。.hword , 插入一個16-bit的數(shù)據(jù)隊列。(與armasm中的DCW相同).ifdef 如果 被定義,該快代碼將被編譯。以 .endif結(jié)束。.ifndef 如果 未被定義,該快代碼將被編譯。以 .endif結(jié)束。.include “”
14、 包含文件。(與armasm中的INCLUDE 或者C中的i nclude一樣) .req 定義一個寄存器,.req的左邊是定義的寄存器名,右邊是使用的真正使用的寄存器。(與armasm中的RN類似)例如:acc .req r0CODE.section ,”開始一個新的代碼或數(shù)據(jù)段。.text, 代碼段;.data, 初始化數(shù)據(jù)段;.bss, 未初始化數(shù)據(jù)段。 這些段都有缺省的標(biāo)志(flags),聯(lián)接器可以識別這些標(biāo)志。(與armasm中的AREA相同)。下面是ELF格式允許的段標(biāo)志 含義a 允許段w 可寫段x 執(zhí)行段.set , 變量賦值。(與armasm中的SETA相同).space ,分配number_of_bytes字節(jié)的數(shù)據(jù)空間,并填充其值為fill_byte,若未指定該值,缺省填充0。(與armasm中的SPACE功能相同).word , 插入一個32-bit的數(shù)據(jù)隊列。(與armasm中的DCD功能相
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 英國歷史與文化概論課件
- 巧克力制造:從原料到市場
- 員工外出培訓(xùn)學(xué)習(xí)制度
- 建筑物沉降位移觀測方案
- 制度修訂方案
- 童聲合唱團(tuán)規(guī)章制度
- 2023年山東醫(yī)療衛(wèi)生招聘考試真題
- 2023年臺州教師招聘臨海市回浦中學(xué)普通招聘教師筆試真題
- 2023年四川護(hù)理職業(yè)學(xué)院招聘筆試真題
- 秸稈回收再利用方案
- 醫(yī)院開診儀式策劃方案
- 造口回納術(shù)護(hù)理
- 螃蟹水產(chǎn)養(yǎng)殖知識培訓(xùn)課件
- 過敏性休克的急救和處理專題醫(yī)學(xué)知識宣講培訓(xùn)課件
- 工業(yè)自動化中的生產(chǎn)柔性與響應(yīng)性制造
- JC/T2055-2020 寵物墊圈用顆粒膨潤土
- 《西游記》第三回讀后感
- 抽油煙機控制系統(tǒng)的設(shè)計
- 企業(yè)綠色發(fā)展工作計劃
- 《大壩安全檢測》課件
- 五臟六腑中醫(yī)診斷微循環(huán)疾病研究
評論
0/150
提交評論