<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM匯編偽指令介紹

ARM匯編偽指令介紹

作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò ) 收藏
ARM匯編語(yǔ)言程序里,有一些特殊指令助記符,這些助記符與指令系統的助記符不同,沒(méi)有相對應的操作碼,通常稱(chēng)這些特殊指令助記符為偽指令,他們所完成的操作稱(chēng)為偽操作。偽指令在源程序中的作用是為完成匯編程序作各種準備工作的,這些偽指令僅在匯編過(guò)程中起作用,一旦匯編結束,偽指令的使命就完成。

ARM的匯編程序中,有如下幾種偽指令:符號定義偽指令、數據定義偽指令、匯編控制偽指令、宏指令以及其他偽指令。
符號定義(SymbolDefinition)偽指令
符號定義偽指令用于定義ARM匯編程序中的變量、對變量賦值以及定義寄存器的別名等操作。
常見(jiàn)的符號定義偽指令有如下幾種:
用于定義全局變量的GBLA、GBLLGBLS。
用于定義局部變量的LCLA、LCLLLCLS。
用于對變量賦值的SETA、SETL、SETS。
為通用寄存器列表定義名稱(chēng)的RLIST。
1、GBLA、GBLL和GBLS
語(yǔ)法格式:
GBLAGBLLGBLS全局變量名
GBLA、GBLLGBLS偽指令用于定義一個(gè)ARM程序中的全局變量,并將其初始化。其中:
GBLA偽指令用于定義一個(gè)全局的數字變量,并初始化為0;
GBLL偽指令用于定義一個(gè)全局的邏輯變量,并初始化為F(假);
GBLS偽指令用于定義一個(gè)全局的字符串變量,并初始化為空;
由于以上三條偽指令用于定義全局變量,因此在整個(gè)程序范圍內變量名必須唯一。
使用示例:
GBLATest1;定義一個(gè)全局的數字變量,變量名為Test1
Test1SETA0xaa;將該變量賦值為0xaa
GBLLTest2;定義一個(gè)全局的邏輯變量,變量名為Test2
Test2SETL{TRUE};將該變量賦值為真
GBLSTest3;定義一個(gè)全局的字符串變量,變量名為Test3
Test3SETSTesting;將該變量賦值為Testing

本文引用地址:http://dyxdggzs.com/article/201611/322954.htm

2、LCLA、LCLL和LCLS
語(yǔ)法格式:
LCLALCLLLCLS局部變量名
LCLA、LCLLLCLS偽指令用于定義一個(gè)ARM程序中的局部變量,并將其初始化。其中:
LCLA偽指令用于定義一個(gè)局部的數字變量,并初始化為0;
LCLL偽指令用于定義一個(gè)局部的邏輯變量,并初始化為F(假);
LCLS偽指令用于定義一個(gè)局部的字符串變量,并初始化為空;
以上三條偽指令用于聲明局部變量,在其作用范圍內變量名必須唯一。
使用示例:
LCLATest4;聲明一個(gè)局部的數字變量,變量名為Test4
Test3SETA0xaa;將該變量賦值為0xaa
LCLLTest5;聲明一個(gè)局部的邏輯變量,變量名為Test5
Test4SETL{TRUE};將該變量賦值為真
LCLSTest6;定義一個(gè)局部的字符串變量,變量名為Test6
Test6SETSTesting;將該變量賦值為Testing
3、SETA、SETL和SETS
語(yǔ)法格式:
變量名SETASETLSETS表達式
偽指令SETA、SETL、SETS用于給一個(gè)已經(jīng)定義的全局變量或局部變量賦值。
SETA偽指令用于給一個(gè)數學(xué)變量賦值;
SETL偽指令用于給一個(gè)邏輯變量賦值;
SETS偽指令用于給一個(gè)字符串變量賦值;
其中,變量名為已經(jīng)定義過(guò)的全局變量或局部變量,表達式為將要賦給變量的值。
使用示例:
LCLATest3;聲明一個(gè)局部的數字變量,變量名為Test3
Test3SETA0xaa;將該變量賦值為0xaa
LCLLTest4;聲明一個(gè)局部的邏輯變量,變量名為Test4
Test4SETL{TRUE};將該變量賦值為真
4、RLIST
語(yǔ)法格式:
名稱(chēng)RLIST{寄存器列表}
RLIST偽指令可用于對一個(gè)通用寄存器列表定義名稱(chēng),使用該偽指令定義的名稱(chēng)可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器訪(fǎng)問(wèn)次序為根據寄存器的編號由低到高,而與列表中的寄存器排列次序無(wú)關(guān)。
使用示例:
RegListRLIST{R0-R5,R8,R10};將寄存器列表名稱(chēng)定義為RegList,可在ARM指令LDM/STM中通過(guò)該名稱(chēng)訪(fǎng)問(wèn)寄存器列表。

數據定義(DataDefinition)偽指令
數據定義偽指令一般用于為特定的數據分配存儲單元,同時(shí)可完成已分配存儲單元的初始化。
常見(jiàn)的數據定義偽指令有如下幾種:
DCB用于分配一片連續的字節存儲單元并用指定的數據初始化。
DCWDCWU用于分配一片連續的半字存儲單元并用指定的數據初始化。
DCDDCDU用于分配一片連續的字存儲單元并用指定的數據初始化。
DCFDDCFDU)用于為雙精度的浮點(diǎn)數分配一片連續的字存儲單元并用指定的數據初始
化。
DCFSDCFSU用于為單精度的浮點(diǎn)數分配一片連續的字存儲單元并用指定的數據初
始化。
DCQDCQU用于分配一片以8字節為單位的連續的存儲單元并用指定的數據初始
化。
SPACE用于分配一片連續的存儲單元
MAP用于定義一個(gè)結構化的內存表首地址
FIELD用于定義一個(gè)結構化的內存表的數據域
1、DCB
語(yǔ)法格式:
標號DCB表達式
DCB偽指令用于分配一片連續的字節存儲單元并用偽指令中指定的表達式初始化。其中,表達式可以為0255的數字或字符串。DCB也可用=代替。
使用示例:
StrDCBThisisatest!;分配一片連續的字節存儲單元并初始化。

2、DCW(或DCWU)
語(yǔ)法格式:
標號DCW(或DCWU表達式
DCW(或DCWU)偽指令用于分配一片連續的半字存儲單元并用偽指令中指定的表達式初始化。
其中,表達式可以為程序標號或數字表達式。。
DCW分配的字存儲單元是半字對齊的,而用DCWU分配的字存儲單元并不嚴格半字對齊。
使用示例:
DataTestDCW1,2,3;分配一片連續的半字存儲單元并初始化。

3、DCD(或DCDU)
語(yǔ)法格式:
標號DCD(或DCDU表達式
DCD(或DCDU)偽指令用于分配一片連續的字存儲單元并用偽指令中指定的表達式初始化。其中,表達式可以為程序標號或數字表達式。DCD也可用&代替。
DCD分配的字存儲單元是字對齊的,而用DCDU分配的字存儲單元并不嚴格字對齊。
使用示例:
DataTestDCD4,5,6;分配一片連續的字存儲單元并初始化。

4、DCFD(或DCFDU)
語(yǔ)法格式:
標號DCFD(或DCFDU表達式
DCFD(或DCFDU)偽指令用于為雙精度的浮點(diǎn)數分配一片連續的字存儲單元并用偽指令中指定的表達式初始化。每個(gè)雙精度的浮點(diǎn)數占據兩個(gè)字單元。用DCFD分配的字存儲單元是字對齊的,而用DCFDU分配的字存儲單元并不嚴格字對齊。
使用示例:
FDataTestDCFD2E115,-5E7;分配一片連續的字存儲單元并初始化為指定的雙精度數。

5、DCFS(或DCFSU)
語(yǔ)法格式:
標號DCFS(或DCFSU表達式
DCFS(或DCFSU)偽指令用于為單精度的浮點(diǎn)數分配一片連續的字存儲單元并用偽指令中指定的表達式初始化。每個(gè)單精度的浮點(diǎn)數占據一個(gè)字單元。DCFS分配的字存儲單元是字對齊的,而用DCFSU分配的字存儲單元并不嚴格字對齊。
使用示例:
FDataTestDCFS2E5,-5E7;分配一片連續的字存儲單元并初始化為指定的單精度數。

6、DCQ(或DCQU)
語(yǔ)法格式:
標號DCQ(或DCQU表達式
DCQ(或DCQU)偽指令用于分配一片以8個(gè)字節為單位的連續存儲區域并用偽指令中指定的表達式初始化。
DCQ分配的存儲單元是字對齊的,而用DCQU分配的存儲單元并不嚴格字對齊。
使用示例:
DataTestDCQ100;分配一片連續的存儲單元并初始化為指定的值。

7、SPACE
語(yǔ)法格式:
標號SPACE表達式
SPACE偽指令用于分配一片連續的存儲區域并初始化為0。其中,表達式為要分配的字節數。
SPACE也可用代替。
使用示例:
DataSpaceSPACE100;分配連續100字節的存儲單元并初始化為0。

8、MAP
語(yǔ)法格式:
MAP表達式{,基址寄存器}
MAP偽指令用于定義一個(gè)結構化的內存表的首地址。MAP也可用代替。
表達式可以為程序中的標號或數學(xué)表達式,基址寄存器為可選項,當基址寄存器選項不存在時(shí),表達式的值即為內存表的首地址,當該選項存在時(shí),內存表的首地址為表達式的值與基址寄存器的和。
MAP偽指令通常與FIELD偽指令配合使用來(lái)定義結構化的內存表。
使用示例:
MAP0x100,R0;定義結構化內存表首地址的值為0x100R0。

9、FILED
語(yǔ)法格式:
標號FIELD表達式
FIELD偽指令用于定義一個(gè)結構化內存表中的數據域。FILED也可用#代替。
表達式的值為當前數據域在內存表中所占的字節數。
FIELD偽指令常與MAP偽指令配合使用來(lái)定義結構化的內存表。MAP偽指令定義內存表的首地址,FIELD偽指令定義內存表中的各個(gè)數據域,并可以為每個(gè)數據域指定一個(gè)標號供其他的指令引用。
注意MAPFIELD偽指令僅用于定義數據結構,并不實(shí)際分配存儲單元。
使用示例:
MAP0x100;定義結構化內存表首地址的值為0x100。
AFIELD16;定義A的長(cháng)度為16字節,位置為0x100
BFIELD32;定義B的長(cháng)度為32字節,位置為0x110
SFIELD256;定義S的長(cháng)度為256字節,位置為0x130

匯編控制(AssemblyControl)偽指令
匯編控制偽指令用于控制匯編程序的執行流程,常用的匯編控制偽指令包括以下幾條:
IF、ELSE、ENDIF
WHILE、WEND
MACRO、MEND
MEXIT
1、IF、ELSE、ENDIF
語(yǔ)法格式:
IF邏輯表達式
指令序列1
ELSE
指令序列2
ENDIF
IF、ELSE、ENDIF偽指令能根據條件的成立與否決定是否執行某個(gè)指令序列。當IF后面的邏輯表達式為真,則執行指令序列1,否則執行指令序列2。其中,ELSE及指令序列2可以沒(méi)有,此時(shí),當IF后面的邏輯表達式為真,則執行指令序列1,否則繼續執行后面的指令。
IF、ELSE、ENDIF偽指令可以嵌套使用。
使用示例:
GBLLTest;聲明一個(gè)全局的邏輯變量,變量名為Test……
IFTest=TRUE
指令序列1
ELSE
指令序列2
ENDIF

2、WHILE、WEND
語(yǔ)法格式:
WHILE邏輯表達式
指令序列
WEND
WHILE、WEND偽指令能根據條件的成立與否決定是否循環(huán)執行某個(gè)指令序列。當WHILE后面的邏輯表達式為真,則執行指令序列,該指令序列執行完畢后,再判斷邏輯表達式的值,若為真則繼續執行,一直到邏輯表達式的值為假。
WHILE、WEND偽指令可以嵌套使用。
使用示例:
GBLACounter;聲明一個(gè)全局的數學(xué)變量,變量名為Counter
CounterSETA3;由變量Counter控制循環(huán)次數
……
WHILECounter<10
指令序列
WEND

3、MACRO、MEND
語(yǔ)法格式:
$標號宏名$參數1,$參數2,……
指令序列
MEND
MACRO、MEND偽指令可以將一段代碼定義為一個(gè)整體,稱(chēng)為宏指令,然后就可以在程序中通過(guò)宏指令多次調用該段代碼。其中,$標號在宏指令被展開(kāi)時(shí),標號會(huì )被替換為用戶(hù)定義的符號,宏指令可以使用一個(gè)或多個(gè)參數,當宏指令被展開(kāi)時(shí),這些參數被相應的值替換。
宏指令的使用方式和功能與子程序有些相似,子程序可以提供模塊化的程序設計、節省存儲空間并提高運行速度。但在使用子程序結構時(shí)需要保護現場(chǎng),從而增加了系統的開(kāi)銷(xiāo),因此,在代碼較短且需要傳遞的參數較多時(shí),可以使用宏指令代替子程序。
包含在MACROMEND之間的指令序列稱(chēng)為宏定義體,在宏定義體的第一行應聲明宏的原型(包含宏名、所需的參數),然后就可以在匯編程序中通過(guò)宏名來(lái)調用該指令序列。在源程序被編譯時(shí),匯編器將宏調用展開(kāi),用宏定義中的指令序列代替程序中的宏調用,并將實(shí)際參數的值傳遞給宏定義中的形式參數。
MACRO、MEND偽指令可以嵌套使用。


上一頁(yè) 1 2 下一頁(yè)

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

評論


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

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>