新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > ARM匯編程序設計之:匯編語言文件格式

        ARM匯編程序設計之:匯編語言文件格式

        作者: 時間:2013-09-30 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/257046.htm

        下面的兩個例子說明了變量替換的過程。

        ;直接的變量替換

        GBLSadd4ff

        ;

        add4ffSETSADDr4,r4,#0xFF ;給變量add4ff賦值

        $add4ff.00 ;引用變量

        ;codes

        ADDr4,r4,#0xFF00

        ;有特殊符號的變量替換

        GBLSs1

        GBLSs2

        GBLSfixup

        GBLAcount

        ;

        countSETA14

        s1SETSa$$b$count ;s1=a$b0000000E

        s2SETSabc

        fixupSETS|xy$s2.z| ;fixup=|xyabcz|

        |C$$code|MOVr4,#16 ;label=C$$code

        4.程序標號(label)

        匯編中,標號代表一個地址,段內標號的地址在匯編時確定,而段外標號地址值在鏈接時確定。根據(jù)標號的生成方式,程序標號分為以下三種。

        ·程序相關標號(Program-relativelabels)。

        ·寄存器相關標號(Register-relativelabels)。

        ·絕對地址(Absoluteaddress)。

        (1)程序相關標號

        程序相關標號指位于目標指令前的標號或程序中的數(shù)據(jù)定義偽操作前的標號。這種標號在匯編時將被處理成PC值加上或減去一個數(shù)字常量。它常用于表示跳轉指令的目標地址或代碼段中所嵌入的少量數(shù)據(jù)。

        (2)寄存器相關地址

        這種標號在匯編時將被處理成寄存器的值加上或減去一個數(shù)字常量。它常被用于訪問數(shù)據(jù)段中的數(shù)據(jù)。這種基于寄存器的標號通常用MAP和FIELD偽操作定義,也可以用EQU偽操作定義。

        (3)絕對地址

        絕對地址是一個32位的數(shù)字量,使用它可以直接尋址整個內存空間。

        5.局部標號

        局部標號是一個0~99之間的十進制數(shù)字,可重復定義。局部標號后面可以緊接一個通常表示該局部變量作用范圍的符號。局部變量的作用范圍為當前段,也可以用偽操作ROUT來定義局部標號的作用范圍。

        局部標號在子程序或程序循環(huán)中常被用到,也可以配合宏定義偽操作(MACRO和MEND)來使程序結構更加合理。

        在同一個段中,可以使用相同的數(shù)字命名不同的局部變量。默認情況下,匯編器會尋址最近的變量。也可以通過匯編器命令選項來改變搜索順序。

        局部變量命名語法如下。

        n{routname}

        局部變量引用的語法格式如下。

        %{F|B}{A|T}n{routname}

        其中,routname為變量作用范圍名稱;%表示引用操作;F指示匯編器只向前搜索;B指示匯編器只向后搜索;A指示匯編器搜索所有宏的嵌套。T指示匯編器只搜索宏的當前層。

        如果在引用過程中,沒有指定F和B,則匯編器先向后搜索,再向前搜索。

        如果A和T沒有指定,匯編器搜索所有從當前層次到宏最高層次,比當前層次低的層次不再搜索。

        如果指定了routname,匯編器向前搜索最近的ROUT操作,若routname與該ROUT偽操作定義的名稱不匹配,匯編器報告錯誤并結束匯編。

        10.3.3匯編語言程序中的表達式和運算符

        在匯編語言程序設計中經常使用各種表達式,表達式一般由變量、常量、運算符和括號構成。常用的表達式有數(shù)字表達式、邏輯表達式和字符串表達式。

        下面分別介紹表達式中各元素。

        1.字符串表達式

        字符串表達式一般由字符串常量、字符串變量、運算符和括號構成。字符串由包含在雙引號內的一系列字符組成。編譯器所支持的字符串最大長度為512字節(jié)。

        當在字符串中包含“$”或引號時,可以用“$$”表示“$”,用兩個雙引號表示一個雙引號。

        例如:

        abcSETSonedoublequote

        defSETSone$$dollar

        上面的例子分別將字符串abc和def賦值為“onedoublequote”和“one$dollar”。

        字符串可以通過SETA、SETL、SETS偽操作對其賦值。

        常用的與字符串表達式相關的運算符如下。

        ·LEN:計算字符串長度運算符。

        ·CHR:ASCII碼轉換運算符。

        ·STR:字符串轉換運算符。

        ·LEFT:字符串取左運算符。

        ·RIGHT:字符串取右運算符。

        ·CC:字符串連接運算符。

        詳見后面操作符一節(jié)。

        下面的例子說明了如何使用字符串操作符給字符串變量賦值。

        improbSETSliteral:CC:(strvar2:LEFT:4)

        這個例子將字符串賦值為“literalatrv”。

        2.整數(shù)表達式

        整數(shù)表達式一般由數(shù)字常量、數(shù)字變量、數(shù)字運算符和括號構成。

        整數(shù)表示式可以包含寄存器相關(register-relative)或程序相關(program-relative)表達式,這些表達式在編譯時被匯編器翻譯為地址無關數(shù)字常量。

        整數(shù)表達式一般被計算為32位的整數(shù),當此整數(shù)被定義為無符號數(shù)時,其取值范圍為0~232-1,當被定義為有符號數(shù)時,其取值范圍為-231~231-1。匯編器認為-n和232-n是相等的。對于關系操作,如比較兩個數(shù)的大小,匯編器將其操作數(shù)看作無符號的數(shù),也就是說“0>-1”對匯編器來說取值為“假({FLASE})”。

        下面的例子說明了在程序中,如何對整數(shù)表達式進行操作。

        aSETA256*256;將數(shù)字變量賦值為256*256

        MOVr1,#(a*22);將數(shù)字表達式(a*22)的值放入r1

        匯編語言中,整數(shù)數(shù)字量有以下幾種形式。

        ·十進制數(shù)(decimal-digis)

        ·“0x”+十六進制數(shù)(0xhexadecimal-digits)

        ·“”+十六進制數(shù)(hexadecimal-digits)

        ·n進制數(shù)(n_base-n-digits)

        ·字符(character)

        其中,十進制數(shù)(decimal-digis)可以是“0”到“9”數(shù)字的任意組合;十六進制數(shù)(hexadecimal-digits)可以是“0”到“9”數(shù)字和字母“A”到“F”的任意組合;“n_”可以取2到9,“base-n-digits”是在n進制下合法的任意數(shù)值;字符(character)可以是除單引號以外的所有字符。

        下面的例子說明了整數(shù)表達式的基本用法。

        aSETA34906

        addrDCD0xA10E

        LDRr4,=1000000F

        DCD2_11001010

        c3SETA8_74007

        DCQ0x0123456789abcdef

        LDRr1,='A' ;偽指令將整數(shù)65(A的ASCII碼)存入寄存器

        ADDr3,r2,#' ;將整數(shù)39(字符“/”的ASCII碼)加到r2,結果存入r3



        評論


        相關推薦

        技術專區(qū)

        關閉
        主站蜘蛛池模板: 余姚市| 乐清市| 砚山县| 保定市| 武清区| 远安县| 祁连县| 扬州市| 莆田市| 徐汇区| 遂昌县| 闵行区| 肥乡县| 故城县| 体育| 库尔勒市| 彰化县| 湘潭县| 平阴县| 农安县| 宁陕县| 应城市| 大同县| 榆林市| 梁山县| 禄劝| 隆回县| 肃北| 苏尼特右旗| 乌海市| 界首市| 米脂县| 上栗县| 贡觉县| 哈密市| 临漳县| 珲春市| 义马市| 原阳县| 利津县| 安溪县|