<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          ARM匯編偽指令詳解(3)

          作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏

          匯編控制( Assembly Control )偽指令
          匯編控制偽指令用于控制匯編程序的執(zhí)行流程,常用的匯編控制偽指令包括以下幾條:
          — IF 、 ELSE 、 ENDIF
          — WHILE 、 WEND
          — MACRO 、 MEND
          — MEXIT

          本文引用地址:http://www.ex-cimer.com/article/201611/319392.htm


          1、 IF、ELSE、ENDIF
          語(yǔ)法格式:
          IF 邏輯表達(dá)式
          指令序列 1
          ELSE
          指令序列 2
          ENDIF
          IF 、 ELSE 、 ENDIF 偽指令能根據(jù)條件的成立與否決定是否執(zhí)行某個(gè)指令序列。當(dāng) IF 后面的邏輯表

          達(dá)式為真,則執(zhí)行指令序列 1 ,否則執(zhí)行指令序列 2 。其中, ELSE 及指令序列 2 可以沒(méi)有,此時(shí),當(dāng)

          IF 后面的邏輯表達(dá)式為真,則執(zhí)行指令序列 1 ,否則繼續(xù)執(zhí)行后面的指令。
          IF 、 ELSE 、 ENDIF 偽指令可以嵌套使用。
          使用示例:
          GBLL Test ;聲明一個(gè)全局的邏輯變量,變量名為 Test……
          IF Test = TRUE
          指令序列 1
          ELSE
          指令序列 2
          ENDIF

          2、 WHILE、WEND
          語(yǔ)法格式:
          WHILE 邏輯表達(dá)式
          指令序列
          WEND
          WHILE 、 WEND 偽指令能根據(jù)條件的成立與否決定是否循環(huán)執(zhí)行某個(gè)指令序列。當(dāng) WHILE 后面的邏輯

          表達(dá)式為真,則執(zhí)行指令序列,該指令序列執(zhí)行完畢后,再判斷邏輯表達(dá)式的值,若為真則繼續(xù)執(zhí)行,一直

          到邏輯表達(dá)式的值為假。
          WHILE 、 WEND 偽指令可以嵌套使用。
          使用示例:
          GBLA Counter ;聲明一個(gè)全局的數(shù)學(xué)變量,變量名為 Counter
          Counter SETA 3 ;由變量Counter 控制循環(huán)次數(shù)
          ……
          WHILE Counter < 10
          指令序列
          WEND

          3、 MACRO、MEND
          語(yǔ)法格式:
          $ 標(biāo)號(hào) 宏名 $ 參數(shù) 1 , $ 參數(shù) 2 ,……
          指令序列
          MEND
          MACRO 、 MEND 偽指令可以將一段代碼定義為一個(gè)整體,稱為宏指令,然后就可以在程序中通過(guò)宏指令

          多次調(diào)用該段代碼。其中, $ 標(biāo)號(hào)在宏指令被展開(kāi)時(shí),標(biāo)號(hào)會(huì)被替換為用戶定義的符號(hào),宏指令可以使用

          一個(gè)或多個(gè)參數(shù),當(dāng)宏指令被展開(kāi)時(shí),這些參數(shù)被相應(yīng)的值替換。
          宏指令的使用方式和功能與子程序有些相似,子程序可以提供模塊化的程序設(shè)計(jì)、節(jié)省存儲(chǔ)空間并提高

          運(yùn)行速度。但在使用子程序結(jié)構(gòu)時(shí)需要保護(hù)現(xiàn)場(chǎng),從而增加了系統(tǒng)的開(kāi)銷,因此,在代碼較短且需要傳遞的

          參數(shù)較多時(shí),可以使用宏指令代替子程序。
          包含在 MACRO 和 MEND 之間的指令序列稱為宏定義體,在宏定義體的第一行應(yīng)聲明宏的原型(包含宏

          名、所需的參數(shù)),然后就可以在匯編程序中通過(guò)宏名來(lái)調(diào)用該指令序列。在源程序被編譯時(shí),匯編器將宏

          調(diào)用展開(kāi),用宏定義中的指令序列代替程序中的宏調(diào)用,并將實(shí)際參數(shù)的值傳遞給宏定義中的形式參數(shù)。


          MACRO 、 MEND 偽指令可以嵌套使用。

          4、 MEXIT
          語(yǔ)法格式:
          MEXIT
          MEXIT 用于從宏定義中跳轉(zhuǎn)出去。

          其他常用的偽指令
          還有一些其他的偽指令,在匯編程序中經(jīng)常會(huì)被使用,包括以下幾條:
          — AREA
          — ALIGN
          — CODE16 、 CODE32
          — ENTRY
          — END
          — EQU
          — EXPORT (或 GLOBAL )
          — IMPORT
          — EXTERN
          — GET (或 INCLUDE )
          — INCBIN
          — RN
          — ROUT


          1、 AREA
          語(yǔ)法格式:
          AREA 段名屬性 1 ,屬性 2 ,……
          AREA 偽指令用于定義一個(gè)代碼段或數(shù)據(jù)段。其中,段名若以數(shù)字開(kāi)頭,則該段名需用 “ | ” 括起來(lái)

          ,如 |1_test| 。
          屬性字段表示該代碼段(或數(shù)據(jù)段)的相關(guān)屬性,多個(gè)屬性用逗號(hào)分隔。常用的屬性如下:
          — CODE 屬性:用于定義代碼段,默認(rèn)為 READONLY 。
          — DATA 屬性:用于定義數(shù)據(jù)段,默認(rèn)為 READWRITE 。
          — READONLY 屬性:指定本段為只讀,代碼段默認(rèn)為 READONLY 。
          — READWRITE 屬性:指定本段為可讀可寫,數(shù)據(jù)段的默認(rèn)屬性為 READWRITE 。
          — ALIGN 屬性:使用方式為 ALIGN 表達(dá)式。在默認(rèn)時(shí), ELF (可執(zhí)行連接文件)的代碼段和數(shù)據(jù)段

          是按字對(duì)齊的,表達(dá)式的取值范圍為 0 ~ 31 ,相應(yīng)的對(duì)齊方式為 2 表達(dá)式次方。
          — COMMON 屬性:該屬性定義一個(gè)通用的段,不包含任何的用戶代碼和數(shù)據(jù)。各源文件中同名的

          COMMON 段共享同一段存儲(chǔ)單元。
          一個(gè)匯編語(yǔ)言程序至少要包含一個(gè)段,當(dāng)程序太長(zhǎng)時(shí),也可以將程序分為多個(gè)代碼段和數(shù)據(jù)段。
          使用示例:
          AREA Init , CODE , READONLY
          該偽指令定義了一個(gè)代碼段,段名為 Init ,屬性為只讀

          2、 ALIGN
          語(yǔ)法格式:
          ALIGN { 表達(dá)式 { ,偏移量 }}
          ALIGN 偽指令可通過(guò)添加填充字節(jié)的方式,使當(dāng)前位置滿足一定的對(duì)其方式 | 。其中,表達(dá)式的值用

          于指定對(duì)齊方式,可能的取值為 2 的冪,如 1 、 2 、 4 、 8 、 16 等。若未指定表達(dá)式,則將當(dāng)前位

          置對(duì)齊到下一個(gè)字的位置。偏移量也為一個(gè)數(shù)字表達(dá)式,若使用該字段,則當(dāng)前位置的對(duì)齊方式為: 2 的

          表達(dá)式次冪+偏移量。
          使用示例:
          AREA Init , CODE , READONLY , ALIEN = 3 ;指定后面的指令為 8 字節(jié)對(duì)齊。
          指令序列
          END

          3、 CODE16、CODE32
          語(yǔ)法格式:
          CODE16 (或 CODE32 )
          CODE16 偽指令通知編譯器,其后的指令序列為 16 位的 Thumb 指令。
          CODE32 偽指令通知編譯器,其后的指令序列為 32 位的 ARM 指令。
          若在匯編源程序中同時(shí)包含 ARM 指令和 Thumb 指令時(shí),可用 CODE16 偽指令通知編譯器其后的指令序

          列為 16 位的 Thumb 指令, CODE32 偽指令通知編譯器其后的指令序列為 32 位的 ARM 指令。因此,在使

          用 ARM 指令和 Thumb 指令混合編程的代碼里,可用這兩條偽指令進(jìn)行切換,但注意他們只通知編譯器其后

          指令的類型,并不能對(duì)處理器進(jìn)行狀態(tài)的切換。
          使用示例:
          AREA Init , CODE , READONLY
          ……
          CODE32 ;通知編譯器其后的指令為 32 位的 ARM 指令
          LDR R0 ,= NEXT + 1 ;將跳轉(zhuǎn)地址放入寄存器 R0
          BX R0 ;程序跳轉(zhuǎn)到新的位置執(zhí)行,并將處理器切換到 Thumb 工作狀態(tài)
          ……
          CODE16 ;通知編譯器其后的指令為 16 位的 Thumb 指令
          NEXT LDR R3,=0x3FF
          ……
          END ;程序結(jié)束

          4、 ENTRY
          語(yǔ)法格式:
          ENTRY
          ENTRY 偽指令用于指定匯編程序的入口點(diǎn)。在一個(gè)完整的匯編程序中至少要有一個(gè) ENTRY (也可以有

          多個(gè),當(dāng)有多個(gè) ENTRY 時(shí),程序的真正入口點(diǎn)由鏈接器指定),但在一個(gè)源文件里最多只能有一個(gè) ENTRY

          (可以沒(méi)有)。
          使用示例:
          AREA Init , CODE , READONLY
          ENTRY ;指定應(yīng)用程序的入口點(diǎn)
          ……

          5、 END
          語(yǔ)法格式:
          END
          END 偽指令用于通知編譯器已經(jīng)到了源程序的結(jié)尾。
          使用示例:
          AREA Init , CODE , READONLY
          ……
          END ;指定應(yīng)用程序的結(jié)尾

          6、 EQU
          語(yǔ)法格式:
          名稱 EQU 表達(dá)式 { ,類型 }
          EQU 偽指令用于為程序中的常量、標(biāo)號(hào)等定義一個(gè)等效的字符名稱,類似于 C 語(yǔ)言中的# define 。


          其中 EQU 可用 “ * ” 代替。
          名稱為 EQU 偽指令定義的字符名稱,當(dāng)表達(dá)式為 32 位的常量時(shí),可以指定表達(dá)式的數(shù)據(jù)類型,可以

          有以下三種類型:
          CODE16 、 CODE32 和 DATA
          使用示例:
          Test EQU 50 ;定義標(biāo)號(hào) Test 的值為 50
          Addr EQU 0x55 , CODE32 ;定義 Addr 的值為 0x55 ,且該處為 32 位的 ARM 指令。

          7、 EXPORT(或GLOBAL)
          語(yǔ)法格式:
          EXPORT 標(biāo)號(hào) {[WEAK]}
          EXPORT 偽指令用于在程序中聲明一個(gè)全局的標(biāo)號(hào),該標(biāo)號(hào)可在其他的文件中引用。 EXPORT可用

          GLOBAL 代替。標(biāo)號(hào)在程序中區(qū)分大小寫, [WEAK] 選項(xiàng)聲明其他的同名標(biāo)號(hào)優(yōu)先于該標(biāo)號(hào)被引用。
          使用示例:
          AREA Init , CODE , READONLY
          EXPORT Stest ;聲明一個(gè)可全局引用的標(biāo)號(hào)Stest……
          END

          8、 IMPORT
          語(yǔ)法格式:
          IMPORT 標(biāo)號(hào) {[WEAK]}
          IMPORT 偽指令用于通知編譯器要使用的標(biāo)號(hào)在其他的源文件中定義,但要在當(dāng)前源文件中引用,而且

          無(wú)論當(dāng)前源文件是否引用該標(biāo)號(hào),該標(biāo)號(hào)均會(huì)被加入到當(dāng)前源文件的符號(hào)表中。
          標(biāo)號(hào)在程序中區(qū)分大小寫, [WEAK] 選項(xiàng)表示當(dāng)所有的源文件都沒(méi)有定義這樣一個(gè)標(biāo)號(hào)時(shí),編譯器也不

          給出錯(cuò)誤信息,在多數(shù)情況下將該標(biāo)號(hào)置為 0 ,若該標(biāo)號(hào)為 B 或 BL 指令引用,則將 B 或 BL指令置為

          NOP 操作。
          使用示例:
          AREA Init , CODE , READONLY
          IMPORT Main ;通知編譯器當(dāng)前文件要引用標(biāo)號(hào)Main,但Main 在其他源文件中定義……
          END

          9、 EXTERN
          語(yǔ)法格式:
          EXTERN 標(biāo)號(hào) {[WEAK]}
          EXTERN 偽指令用于通知編譯器要使用的標(biāo)號(hào)在其他的源文件中定義,但要在當(dāng)前源文件中引用,如果

          當(dāng)前源文件實(shí)際并未引用該標(biāo)號(hào),該標(biāo)號(hào)就不會(huì)被加入到當(dāng)前源文件的符號(hào)表中。標(biāo)號(hào)在程序中區(qū)分大小寫

          , [WEAK] 選項(xiàng)表示當(dāng)所有的源文件都沒(méi)有定義這樣一個(gè)標(biāo)號(hào)時(shí),編譯器也不給出錯(cuò)誤信息,在多數(shù)情況下

          將該標(biāo)號(hào)置為 0 ,若該標(biāo)號(hào)為 B 或 BL 指令引用,則將 B 或 BL指令置為 NOP 操作。
          使用示例:
          AREA Init , CODE , READONLY
          EXTERN Main ;通知編譯器當(dāng)前文件要引用標(biāo)號(hào)Main,但Main 在其他源文件中定義……
          END

          10、 GET(或INCLUDE)
          語(yǔ)法格式:
          GET 文件名
          GET 偽指令用于將一個(gè)源文件包含到當(dāng)前的源文件中,并將被包含的源文件在當(dāng)前位置進(jìn)行匯編處理。

          可以使用 INCLUDE 代替 GET 。
          匯編程序中常用的方法是在某源文件中定義一些宏指令,用 EQU 定義常量的符號(hào)名稱,用 MAP和

          FIELD 定義結(jié)構(gòu)化的數(shù)據(jù)類型,然后用 GET 偽指令將這個(gè)源文件包含到其他的源文件中。使用方法與 C 語(yǔ)

          言中的 “ include ” 相似。
          GET 偽指令只能用于包含源文件,包含目標(biāo)文件需要使用 INCBIN 偽指令
          使用示例:
          AREA Init , CODE , READONLY
          GET a1.s ;通知編譯器當(dāng)前源文件包含源文件a1.s
          GE T C:a2.s ;通知編譯器當(dāng)前源文件包含源文件C: a2.s ……
          END

          11、 INCBIN
          語(yǔ)法格式:
          INCBIN 文件名
          INCBIN 偽指令用于將一個(gè)目標(biāo)文件或數(shù)據(jù)文件包含到當(dāng)前的源文件中,被包含的文件不作任何變動(dòng)的

          存放在當(dāng)前文件中,編譯器從其后開(kāi)始繼續(xù)處理。
          使用示例:
          AREA Init , CODE , READONLY
          INCBIN a1.dat ;通知編譯器當(dāng)前源文件包含文件a1.dat
          INCBIN C:a2.txt ;通知編譯器當(dāng)前源文件包含文件C:a2.txt……
          END

          12、 RN
          語(yǔ)法格式:
          名稱 RN 表達(dá)式
          RN 偽指令用于給一個(gè)寄存器定義一個(gè)別名。采用這種方式可以方便程序員記憶該寄存器的功能。其中

          ,名稱為給寄存器定義的別名,表達(dá)式為寄存器的編碼。
          使用示例:
          Temp RN R0 ;將R0 定義一個(gè)別名Temp

          13、 ROUT
          語(yǔ)法格式:
          { 名稱 } ROUT
          ROUT 偽指令用于給一個(gè)局部變量定義作用范圍。在程序中未使用該偽指令時(shí),局部變量的作用范圍為

          所在的 AREA ,而使用 ROUT 后,局部變量的作為范圍為當(dāng)前 ROUT 和下一個(gè) ROUT 之間。




          關(guān)鍵詞: ARM匯編偽指

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();