新聞中心

        ARM匯編快速入門(mén)

        作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
        前言:
        以前用ARM的IDE工具,使用的是ARM標(biāo)準(zhǔn)的匯編語(yǔ)言?,F(xiàn)在要使用GNU的工具,當(dāng)然要了解一點(diǎn)GNU ARM匯編的不同之處。其實(shí)非常的簡(jiǎn)單,瀏覽一下文檔然后再看看程序就完全可以搞定了,或者你硬著頭皮看GNU ARM的匯編程序,用不了多少時(shí)間你就就可以無(wú)師自通了。個(gè)人比較健忘,還是把文檔翻譯了一下,算是給自己一個(gè)避免遺忘的理由吧。

        ARM匯編語(yǔ)言源程序語(yǔ)句,一般由指令,偽操作,宏指令和偽指令作成.ARM匯編語(yǔ)言的設(shè)計(jì)基礎(chǔ)是匯編偽指令,匯編偽操作和宏指令.

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

        關(guān)于CodeWarriror ARM匯編的書(shū)和文章很多,本文假定你已經(jīng)完全了解ARMASM,這里只說(shuō)明GNU ARM匯編,并針對(duì)ARMASM給出說(shuō)明。本文翻譯自:GNU ARM Assembler Quick Reference,本人水平有限,錯(cuò)誤難免,轉(zhuǎn)載隨意,請(qǐng)注明出處。英文原文地址不詳。


        GNU ARM 匯編快速入門(mén)

        任何匯編行都是如下結(jié)構(gòu):
        [
        GNU ARM匯編中,任何以冒號(hào)結(jié)尾的都被認(rèn)為是一個(gè)標(biāo)簽,而不一定非要在一行的開(kāi)始。下面是一個(gè)簡(jiǎn)單的例子,這段匯編程序定義了一個(gè)"add"的函數(shù),該函數(shù)返回兩個(gè)參數(shù)的和:
        .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匯編偽指令,并給出了相應(yīng)說(shuō)明。

        .ascii “” 在匯編中定義字符串并為之分配存儲(chǔ)空間(與armasm中的DCB功能類(lèi)似)。
        .asciz “” 和.ascii類(lèi)似,但不分配存儲(chǔ)空間。
        .balign {, {,} }
        以某種排列方式在內(nèi)存中填充數(shù)值。(該指令與armasm中的ALIGN類(lèi)似)。
        power_of_2表示排列方式,其值可為4,8,16或32,單位是byte;
        fill_value是要填充的值;
        max_padding最大的填充界限,請(qǐng)求填充的bytes數(shù)超過(guò)該值,將被忽略。
        .byte {,} … 定義一個(gè)或多個(gè)Byte,并為之分配空間(與armasm的DCB類(lèi)似)。
        .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)志。
        .exitm 宏跳出。
        .macro {} … {,}
        定義一段名為name的宏,arg_xxx為參數(shù)。
        必須有對(duì)應(yīng)的.endm結(jié)尾。
        可以使用.exitm從中間跳出宏。(與armasm中的MACRO, MEND, MEXIT相同)。
        在使用宏參數(shù)時(shí)必須這樣使用:“/”。
        例如:
        [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í)行的代碼段中必須以“/ ”表示參數(shù)。

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

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

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


        關(guān)鍵詞: ARM匯編快速入

        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 象州县| 九龙城区| 南木林县| 西城区| 大连市| 塔城市| 大渡口区| 手游| 平湖市| 称多县| 台东县| 突泉县| 闽侯县| 晋江市| 崇明县| 牡丹江市| 七台河市| 舒城县| 鸡东县| 台南县| 改则县| 平舆县| 黑龙江省| 定兴县| 怀集县| 六安市| 任丘市| 揭西县| 中方县| 彰化市| 滨州市| 青龙| 石狮市| 德昌县| 大洼县| 平原县| 赤水市| 墨竹工卡县| 嘉善县| 建德市| 乐安县|