新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM匯編常用偽操作總結

        ARM匯編常用偽操作總結

        作者: 時間:2016-11-29 來源:網絡 收藏

          首先使用 MACRO 和 MEND 等偽操作定義宏。包含在 MACRO 和 MEND 之間的代碼段稱為宏定義體,在 MACRO 偽操作之后的一行聲明宏的原型(包含宏名、所需的參數),然后就可以在匯編程序中通過宏名來調用它。在源程序被匯編時,匯編器將宏調用展開,用宏定義體代替源程序中的宏定義的名稱,并用實際參數值代替宏定義時的形式參數。

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

          宏定義中的 $label 是一個可選參數。當宏定義體中用到多個標號時,可以使用類似 $label.$internallabel 的標號命名規則使程序易讀。

          MACRO 、 MEND 偽操作可以嵌套使用。

          使用示例:

          MACRO

          $HandlerLabel HANDLER $HandleLabel ; 宏的名稱為 HANDLER ,有 1 個參數 $HandleLabel

          $HandlerLabel

          sub sp,sp,#4 ;decrement sp(to store jump address)

          stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to original address)

          ldr r0,=$HandleLabel ;load the address of HandleXXX to r0

          ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX

          str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack

          ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)

          MEND

          ;在程序中調用該宏

          HandlerFIQ HANDLER HandleFIQ ;通過宏的名稱 HANDLER 調用宏,其中宏的標號為 HandlerFIQ ,參數為 HandleFIQ

          HandlerIRQ HANDLER HandleIRQ

          HandlerUndef HANDLER HandleUndef

          HandlerSWI HANDLER HandleSWI

          HandlerDabort HANDLER HandleDabort

          HandlerPabort HANDLER HandlePabort

          ;程序被匯編后,宏展開的結果

          HandlerFIQ

          sub sp,sp,#4

          stmfd sp!,{r0}

          ldr r0,=HandleFIQ

          ldr r0,[r0]

          str r0,[sp,#4]

          ldmfd sp!,{r0,pc}

          IF 、 ELSE 、 ENDIF

          語法格式:

          IF 邏輯表達式

          指令序列 1

          ELSE

          指令序列 2

          ENDIF

          IF 、 ELSE 、 ENDIF 偽操作能根據條件把一段源代碼包括在匯編程序內或者將其排除在程序之外。 [ 是 IF 偽操作的同義詞, | 是 ELSE 偽操作的同義詞, ] 是 ENDIF 偽操作的同義詞。

          IF 、 ELSE 、 ENDIF 偽指令可以嵌套使用。

          使用示例:

          MACRO

          MOV_PC_LR

          [ THUMBCODE

          bx lr

          |

          mov pc,lr

          ]

          內存操作

          DCD “ & ”(或 DCDU )

          語法格式:

          標號 DCD ( 或 DCDU) 表達式

          用于分配一段字內存單元并用偽操作中指定的表達式初始化 。其中,表達式可以為程序中的標號或數字表達式。

          用 DCD 分配的字存儲單元是字對齊 的,而用 DCDU 分配的字存儲單元并不嚴格字對齊。

          使用示例:

          DataTest DCD 4,5,6 ; 其值分別為 4 , 5 和 6 。

          data2 DCD memaddr+4 ; 分配一個字單元,其值為程序中標號 memaddr 加 4 個字節

          MAP ( “ ^ ” )

          語法格式:

          MAP 表達式 { ,基址寄存器 }

          用于定義一個結構化的內存表的首地址 。

          表達式可以為程序中的標號或數字表達式,基址寄存器為可選項,當基址寄存器選項不存在時,表達式的值即為內存表的首地址,當該選項存在時,內存表的首地址為表達式的值與基址寄存器的和。

          MAP 偽操作通常與 FIELD 偽操作配合使用來定義結構化的內存表。

          使用示例:

          MAP 0x100 , R9 ; 定義結構化內存表首地址的值為 0x100 + R9 。

          FILED ( “ # ” )

          語法格式:

          標號 FIELD 表達式

          用于定義一個結構化內存表中的數據域 。

          表達式的值為當前數據域在內存表中所占的字節數。

          FIELD 偽操作常與 MAP 偽操作配合使用來定義結構化的內存表結構。 MAP 偽操作定義內存表的首地址, FIELD 偽操作定義內存表中的各數據域的字節長度,并可以為每個數據域指定一個標號供其他的指令引用。

          注意 MAP 和 FIELD 偽操作僅用于定義數據結構,并不實際分配存儲單元。

          示例 1 :

          下面的偽操作序列定義一個內存表,其首地址為固定地址 4096 ,該內存表中包括 5 個數據域: consta 長度為 4 個字節; constb 長度為 4 個字節; x 長度為 8 個字節; y 長度為 8 個字節; string 長度為 256 個字節。這種內存表稱為基于絕對地址的內存表。

          MAP 4096 ;內存表的首地址為 4096 ( 0x1000 )

          consta FIELD 4 ; consta 長度為 4 個字節,相對位置為 0

          constb FIELD 4 ; constb 長度為 4 個字節,相對位置為 5000

          constb FIELD 4 ; constb 長度為 4 個字節,相對位置為 5000

          x FIELD 8 ; x 長度為 4 個字節,相對位置為 5004

          y FIELD 8 ; y 長度為 4 個字節,相對位置為 5012

          string FIELD 256 ; string 長度為 256 字節,相對位置為 5020

          ; 在指令中可以這樣引用內存表中的數據域:

          LDR R6 , consta

          上面的指令僅僅可以訪問 LDR 指令前面(或后面) 4KB 地址范圍的數據域

          示例 2 :

          下面的偽操作序列定義一個內存表,其首地址為 0 ,該內存表中包括 5 個數據域: consta 長度為 4 個字節; constb 長度為 4 個字節; x 長度為 8 個字節; y 長度為 8 個字節; string 長度為 256 個字節。這種內存表稱為基于相對地址的內存表。

          MAP 4096 ;內存表的首地址為 0

          consta FIELD 4 ; consta 長度為 4 個字節,相對位置為 0

          constb FIELD 4 ; constb 長度為 4 個字節,相對位置為 4

          x FIELD 8 ; x 長度為 4 個字節,相對位置為 8

          y FIELD 8 ; y 長度為 4 個字節,相對位置為 16

          string FIELD 256 ; string 長度為 256 字節,相對位置為 24

          ; 可以通過下面的指令方便地訪問地址范圍超過 4KB 的數據

          MOV R9 , #4096

          LDR R5 , [R9,constb] ;將內存表中數據域 constb 讀取到 R5 中

          在這里,內存表中各數據域的實際內存地址不是基于一個固定地址,而是基于 LDR 指令執行時 R9 寄存器中的內容。這樣通過上面方法定義的內存表結構可以在程序中有多個實例(通過在 LDR 指令中指定不同的基址寄存器值來實現)。通常用 R9 作為靜態基址寄存器。


        上一頁 1 2 下一頁

        關鍵詞: ARM

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 正定县| 昌图县| 莆田市| 额敏县| 拜城县| 彰武县| 介休市| 宁强县| 吉隆县| 松阳县| 阳西县| 华安县| 渑池县| 浦北县| 平阴县| 河池市| 台北市| 香港 | 富源县| 和静县| 剑川县| 刚察县| 伽师县| 凭祥市| 汉川市| 开鲁县| 日喀则市| 盈江县| 济源市| 台中市| 信阳市| 翼城县| 合山市| 微博| 杨浦区| 林芝县| 嵊州市| 同德县| 邢台县| 广德县| 竹溪县|