Linux下ARM匯編語法._第1頁
Linux下ARM匯編語法._第2頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第一部分 Linux 下 ARM 匚編語法盡管在 Linux 下使用 C 或 C+編寫程序很方便,但匯編源程序用于系統(tǒng)最基本的初始化,如初始化堆棧指針、設(shè)置頁表、操作ARM 的協(xié)處理器等。初始化完成后就可以跳轉(zhuǎn)到 C 代碼執(zhí)行。需要注意的是, GNU 勺匯編器遵循 AT&T 的匯編語法,可 以從GNU 的站點 ( )上下載有關(guān)規(guī)范。一 . Linux 匯編行結(jié)構(gòu) 任何匯編行都是如下結(jié)構(gòu):: comment: 注釋Linux ARM 匯編中,任何以冒號結(jié)尾的標(biāo)識符都被認(rèn)為是一個標(biāo)號,而不一定非要在一行的 開始?!纠?1】定義一個 add 的函數(shù),返回兩個參數(shù)的和。.

2、section .text, “x”.global add give the symbol add external linkage add:ADD r0, r0, r1 add input argumentsMOV pc, lr return from subroutine end of program二 . Linux 匯編程序中的標(biāo)號標(biāo)號只能由 a乙AZ, 09, “. ”,等字符組成。當(dāng)標(biāo)號為09 的數(shù)字時為局部標(biāo)號,局部標(biāo)號可以重復(fù)出現(xiàn) , 使用方法如下:? 標(biāo)號 f: 在引用的地方向前的標(biāo)號? 標(biāo)號 b: 在引用的地方向后的標(biāo)號【例 2】使用局部符號的例子,一段循環(huán)程序1:subs

3、 r0,r0,#1每次循環(huán)使 r0=r0-1bne 1f 跳轉(zhuǎn)到 1 標(biāo)號去執(zhí)行 局部標(biāo)號代表它所在的地址 , 因此也可以當(dāng)作變量或者函數(shù)來使用。三. Linux 匯編程序中的分段 ( 1) .section 偽操作用戶可以通過 .section 偽操作來自定義一個段 , 格式如下 : .section section_name , flags,%type,flag_specific_arguments 每一個段以段名為開始 , 以下一個段名或者文件結(jié)尾為結(jié)束。 這些段都有缺省的標(biāo)志 (flags ), 連接器可以識別這些標(biāo)志。(與 armasm 中的 AREA 相同)。下面是 ELF 格式允

4、許的段標(biāo)志含義a 允許段w 可寫段x 執(zhí)行段【例 3】定義段.section .mysection 自定義數(shù)據(jù)段,段名為 “.mysection ”.align 2strtemp:.ascii Temp string n0( 2)匯編系統(tǒng)預(yù)定義的段名.text 代碼段.data 初始化數(shù)據(jù)段.bss 未初始化數(shù)據(jù)段.sdata .sbss 需要注意的是,源程序中 .bss 段應(yīng)該在 .text 之前。四 . 定義入口點匯編程序的缺省入口是start 標(biāo)號,用戶也可以在連接腳本文件中用ENTRY 標(biāo)志指明其它入口點。【例 4】定義入口點.section.data.section .bss.sec

5、tion .text.globl _start_start:五. Linux 匯編程序中的宏定義格式如下 :.macro 宏名 參數(shù)名列表 偽指令 .macro 定義一個宏 宏體.endm .endm 表示宏結(jié)束如果宏使用參數(shù) , 那么在宏體中使用該參數(shù)時添加前綴 “ ”。宏定義時的參數(shù)還可以使用默認(rèn) 值??梢允褂?.exitm 偽指令來退出宏。【例 5】宏定義.macro SHIFTLEFT a, bif b”表示不相等,其他的符號如:+、-、*、/、|、&、A、!、=、=、,分配 number_of_bytes 字節(jié)的數(shù)據(jù)空間, 并填充其值為 fill_byte , 若未指定該值,

6、 缺省填 充 0。(與 armasm中的 SPACE 功能相同)(10).word , 插入一個 32-bit 的數(shù)據(jù)隊列。(與 armasm 中的 DCD 功能相同)可以使用 .word 把標(biāo)識符作為常量使用例如:Start:valueOfStart:.word Start這樣程序的開頭 Start 便被存入了內(nèi)存變量 valueOfStart 中。(11).hword ,插入一個 16-bit 的數(shù)據(jù)隊列。(與 armasm 中的 DCV 相同)八.GNU ARM 匯編特殊字符和語法 代碼行中的注釋符號 : 整行注釋符號 : # 語句分離符號 : ; 直接操作數(shù)前綴 : # 或 $ 第二部

7、分 GNU 的編譯器和調(diào)試工具一 . 編譯工具 1編輯工具介紹GNU 提供的編譯工具包括匯編器as、C 編譯器 gcc、C+編譯器 g+、連接器 Id 和二進(jìn)制轉(zhuǎn)換工具 objcopy?;?ARM 平臺的工具分另 U 為 arm- linux-as 、arm-linux-gcc 、arm-linux-g+ 、arm-linux-ld和 arm-linux- objcopy。GNU 的編譯器功能非常強大,共有上百個操作選項,這也是這類工具讓初學(xué)者頭痛的原因。 不過,實際開發(fā)中只需要用到有限的幾個, 大部分可 以 采用缺省選項。GNU 工具的開發(fā)流程如下:編寫C、C+語言或匯編源程序,用gcc

8、或 g+生成目標(biāo)文件,編寫連接腳本文件,用連接器生成最終目標(biāo)文件( elf 格式),用二進(jìn)制轉(zhuǎn)換工具生成可下載的二進(jìn)制代碼。(1)編寫 C、C+語言或匯編源程序通常匯編源程序用于系統(tǒng)最基本的初始化,如初始化堆棧指針、設(shè)置頁表、操作 ARM 的協(xié)處理器等。初始化完成后就可以跳轉(zhuǎn)到C 代碼執(zhí)行。需要注意的是,GNU 勺匯編器遵循 AT&T 的匯編語法,讀者可以從 GNU 的站點( )上下載有關(guān)規(guī)范。匯編程序的缺省入口 是 start 標(biāo)號,用戶也可以在連接腳本文件中用ENTRY 標(biāo)志指明其它入口點(見下文關(guān)于連接腳本的說明) 。(2 )用 gcc 或 g+生成目標(biāo)文件

9、 如果應(yīng)用程序包括多個文件,就需要進(jìn)行分另編譯,最后用連接器連接起來。如筆者的引導(dǎo) 程序包括 3 個文件: init.s (匯編代碼、初始化硬件) xmrecever.c (通信模塊,采用 Xmode 協(xié)議)和 flash.c ( Flash 擦寫模塊)。分 另 用 如 下 命 令 生 成 目 標(biāo) 文 件 : arm-linux-gcc-c-O2-oinit.oinit.sarm-linux-gcc-c-O2-oxmrecever.oxmrecever.c arm-linux-gcc-c-O2-oflash.oflash.c其中-c 命令表示只生成目標(biāo)代碼,不進(jìn)行連接;-o 命令指明目標(biāo)文件的

10、名稱;-02 表示采用二級優(yōu)化,采用優(yōu)化后可使生成的代碼更短,運行速度更快。如果 項目包含很多文件,則需要 編寫 makefile文件。關(guān)于 makefile 的內(nèi)容,請感興趣的讀者參考相關(guān)資料。( 3)編寫連接腳本文件gcc 等編譯器內(nèi)置有缺省的連接腳本。 如果采用缺省腳本, 則生成的目標(biāo)代碼需要操作系統(tǒng) 才能加載運行。為了能在嵌入式系統(tǒng)上直接運行, 需要編寫自己的連接腳本文 件。編寫連接 腳本,首先要對目標(biāo)文件的格式有一定了解。GNU 編譯器生成的目標(biāo)文件缺省為elf 格式。elf 文件由若干段(section )組成,如不特 殊指明,由 C 源程序生成的目標(biāo)代碼中包含如 下段:.text

11、(正文段)包含程序的指令代碼; .data( 數(shù)據(jù)段)包含固定的數(shù)據(jù),如常量、字 符 串;.bss (未初始化數(shù)據(jù)段)包含未初始化的變量、數(shù)組等。C+源程序生成的目標(biāo)代碼中還包括 .fini (析構(gòu)函數(shù)代碼) 和 . init (構(gòu)造函數(shù)代碼) 等。 連接器的任務(wù)就是將多個目 標(biāo)文件的.text、 .data和.bss 等段連接在一起,而連接腳本文件是告訴連接器從什么地址開始放置這些段。例如連接文件 link.lds 為:ENTRY(begin)SECTI0N.=0 x30000000;.text:*(.text) .data:*(.data) .bss:*(.bss)其中,ENTRY(beg

12、in)指明程序的入口點為begin 標(biāo)號;.=0 x00300000 指明目標(biāo)代碼的起始地址為 0 x30000000,這一段地址為 MX1 的片內(nèi) RAM .text:*(.text) 表示從 0 x30000000開始放置所有目標(biāo)文件的代碼段,隨后的 .data:* (.data) 始,再后是 .bss 段。(4)用連接器生成最終目標(biāo)文件 有了連接腳本文件,如下命令可生成最終的目標(biāo)文件: arm-l inu x-ld no stadlib o bootstrap.elf -Tli nk.lds in it.o xmrecever.o flash.o其中,ostadlib 表示不連接系統(tǒng)的運

13、行庫,而是直接從 begin 入口; -o 指明目標(biāo)文件的名稱;-T 指明采用的連接腳本文件(也可以使用 -Ttext address , address 表示執(zhí)行區(qū)地址) ;最后 是需要連接的目標(biāo)文件列表。(5)生成二進(jìn)制代碼連接生成的 elf 文件還不能直接下載執(zhí)行,通過 objcopy 工具可生成最終的二進(jìn)制文件:arm-linux-objcopy- O binary bootstrap.elf bootstrap.bin其中-O bin ary 指定生成為二進(jìn)制格式文件。Objcopy 還可以生成 S 格式的文件,只需將參數(shù)換成 -O srec 。還可以使用 -S 選項,移除所有的符號

14、信息及重定位信息。如果想將生成的目 標(biāo)代碼反匯編,還可以用 objdump 工具: arm-linux-objdump -D bootstrap.elf 至此,所生成的目標(biāo)文件就可以直接寫入 Flash 中運行了。表示數(shù)據(jù)段從代碼段的末尾開2 Makefile 實例 example: head.s main.c arm-linux-gcc -c -o head.o head.s arm-linux-gcc -c -o main.omain.c arm-linux-ld -Tlink.lds head.o ain.o -o example.elf arm-linux-objcopy -O bin

15、ary -S example_tmp.oexample arm-linux-objdump -D -b binary -m arm example ttt.s 二. 調(diào)試工具Linux 下的 GNU調(diào)試工具主要是 gdb、 gdbserver和 kgdb。 其中 gdb和 gdbserver可完成對 目標(biāo)板上 Linux下應(yīng)用程序的遠(yuǎn)程調(diào)試。 gdbserver 是一個很小的應(yīng)用程序, 運行于目標(biāo)板 上,可監(jiān)控被調(diào)試進(jìn)程的運行,并通過串口與上位機上的gdb 通信。開發(fā)者可以通過上位機的 gdb 輸 入命令,控制目標(biāo)板上進(jìn)程的運行,查看內(nèi)存和寄存器的內(nèi)容。gdb5.1.1 以后的版本加入了對 ARM 處理器的支持,在初始化時加入target=arm 參數(shù)可直接生成基于ARM平臺的 gdbserver 。 gdb 工具可以從 ftp: //pub/gnu/gdb/上下載。對于 Linux 內(nèi)核的調(diào)試, 可以采用 kgdb 工具, 同樣需要通過

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論