第5章 匯編語(yǔ)言程序設(shè)計(jì)_第1頁(yè)
第5章 匯編語(yǔ)言程序設(shè)計(jì)_第2頁(yè)
第5章 匯編語(yǔ)言程序設(shè)計(jì)_第3頁(yè)
第5章 匯編語(yǔ)言程序設(shè)計(jì)_第4頁(yè)
第5章 匯編語(yǔ)言程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩77頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第第5章章 基于基于ARM的匯編語(yǔ)言程序設(shè)計(jì)的匯編語(yǔ)言程序設(shè)計(jì) 匯編語(yǔ)言與C語(yǔ)言混合編程技術(shù)匯編語(yǔ)言源程序格式匯編語(yǔ)言上機(jī)過(guò)程ARM編譯開(kāi)發(fā)環(huán)境ADS編譯環(huán)境偽操作和宏指令GNU編譯環(huán)境偽操作和宏指令兩種常見(jiàn)的兩種常見(jiàn)的ARM編譯開(kāi)發(fā)環(huán)境編譯開(kāi)發(fā)環(huán)境ADS/SDT IDE開(kāi)發(fā)環(huán)境:它由ARM公司開(kāi)發(fā),使用了CodeWarrior公司的編譯器; (ADS 1.2)集成了自由軟件GNU開(kāi)發(fā)工具的IDE開(kāi)發(fā)環(huán)境:它由GNU的匯編器as、交叉編譯器gcc、和鏈接器ld等組成。(ADT IDE) ARM匯編語(yǔ)言構(gòu)成匯編語(yǔ)言構(gòu)成ARM/Thumb指令偽操作:由匯編器處理,用于完成程序準(zhǔn)備工作的特殊指令助記

2、符(反匯編看到的只是它的作用,看不到語(yǔ)句)偽指令:特殊指令助記符,在匯編時(shí)會(huì)被轉(zhuǎn)換成相應(yīng)的ARM/Thumb指令。宏指令:重復(fù)使用的程序代碼。ARM集成開(kāi)發(fā)環(huán)境中GNU和ARM使用的偽操作偽操作和宏指令和宏指令具有不同的名稱,而偽指令偽指令相同。第第5章章 基于基于ARM的匯編語(yǔ)言程序設(shè)計(jì)的匯編語(yǔ)言程序設(shè)計(jì) 匯編語(yǔ)言與C語(yǔ)言混合編程技術(shù)匯編語(yǔ)言源程序格式匯編語(yǔ)言上機(jī)過(guò)程ARM編譯開(kāi)發(fā)環(huán)境ADS編譯環(huán)境偽操作和宏指令GNU編譯環(huán)境偽操作和宏指令常用常用ARM源程序文件類型源程序文件類型 源程序文件文件名說(shuō) 明匯編程序文件*.S用ARM匯編語(yǔ)言編寫的ARM程序或Thumb程序。C程序文件*.C用C

3、語(yǔ)言編寫的程序代碼。頭文件*.H為了簡(jiǎn)化源程序,把程序中常用到的常量命名、宏定義、數(shù)據(jù)結(jié)構(gòu)定義等等單獨(dú)放在一個(gè)文件中,一般稱為頭文件。舉例說(shuō)明舉例說(shuō)明ARM匯編語(yǔ)言源程序的基本結(jié)構(gòu)匯編語(yǔ)言源程序的基本結(jié)構(gòu) AREA EXAMPLE,CODE,READONLYENTRYstart MOV r0,#10 MOV r1,#3 ADD r0,r0,r1END本程序的程序體部分實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的加法運(yùn)算。 匯編語(yǔ)言程序的結(jié)構(gòu)匯編語(yǔ)言程序的結(jié)構(gòu) ARMARM的匯編語(yǔ)言程序一般由幾個(gè)段組成,的匯編語(yǔ)言程序一般由幾個(gè)段組成,每個(gè)段均由每個(gè)段均由AREAAREA偽操作定義。偽操作定義。 段可以分為多種,如代碼段、

4、數(shù)據(jù)段、通段可以分為多種,如代碼段、數(shù)據(jù)段、通用段,每個(gè)段又有不同的屬性,如代碼段用段,每個(gè)段又有不同的屬性,如代碼段的默認(rèn)屬性為的默認(rèn)屬性為READONLYREADONLY,數(shù)據(jù)段的默認(rèn)屬,數(shù)據(jù)段的默認(rèn)屬性為性為READWRITEREADWRITE。匯編語(yǔ)言的行構(gòu)成匯編語(yǔ)言的行構(gòu)成1 格式:格式: 標(biāo)簽標(biāo)簽 指令指令/ /偽操作偽操作/ /偽指令偽指令 操作數(shù)操作數(shù) ;語(yǔ)句的注釋語(yǔ)句的注釋 所有的標(biāo)簽必須在一行的開(kāi)頭頂格寫,前面不能所有的標(biāo)簽必須在一行的開(kāi)頭頂格寫,前面不能留空格,后面也不能跟留空格,后面也不能跟C C語(yǔ)言中的標(biāo)簽一樣加上語(yǔ)言中的標(biāo)簽一樣加上“:”:”;(;(ADSADS與與

5、GNUGNU不同不同) ARMARM匯編器對(duì)標(biāo)識(shí)符的大小寫敏感,書(shū)寫標(biāo)號(hào)及匯編器對(duì)標(biāo)識(shí)符的大小寫敏感,書(shū)寫標(biāo)號(hào)及指令時(shí)字母的大小寫要一致;指令時(shí)字母的大小寫要一致; 注釋使用注釋使用“;”;”符號(hào),注釋的內(nèi)容從符號(hào),注釋的內(nèi)容從“;”;”開(kāi)始到開(kāi)始到該行的結(jié)尾結(jié)束。(該行的結(jié)尾結(jié)束。(GNU /GNU /* * * */ /)匯編語(yǔ)言的行構(gòu)成匯編語(yǔ)言的行構(gòu)成2標(biāo)簽標(biāo)簽 標(biāo)簽是一個(gè)符號(hào),可以代表指令的地址、標(biāo)簽是一個(gè)符號(hào),可以代表指令的地址、變量、數(shù)據(jù)的地址和常量。變量、數(shù)據(jù)的地址和常量。 一般以字母開(kāi)頭,由字母、數(shù)字、下劃線一般以字母開(kāi)頭,由字母、數(shù)字、下劃線組成。組成。 當(dāng)符號(hào)代表地址時(shí)又稱

6、標(biāo)號(hào),可以以數(shù)字當(dāng)符號(hào)代表地址時(shí)又稱標(biāo)號(hào),可以以數(shù)字開(kāi)頭,其作用范圍為當(dāng)前段或者在下一個(gè)開(kāi)頭,其作用范圍為當(dāng)前段或者在下一個(gè)ROUTROUT偽操作之前。偽操作之前。匯編語(yǔ)言的匯編語(yǔ)言的標(biāo)號(hào)標(biāo)號(hào)1 1 標(biāo)號(hào)代表地址。標(biāo)號(hào)代表地址。 標(biāo)號(hào)分為段內(nèi)標(biāo)號(hào)和段外標(biāo)號(hào)。段內(nèi)標(biāo)號(hào)的地址標(biāo)號(hào)分為段內(nèi)標(biāo)號(hào)和段外標(biāo)號(hào)。段內(nèi)標(biāo)號(hào)的地址值在匯編時(shí)確定,段外編號(hào)的地址值在鏈接時(shí)確值在匯編時(shí)確定,段外編號(hào)的地址值在鏈接時(shí)確定定 。 在程序段中,標(biāo)號(hào)代表其所在位置與段首地址的在程序段中,標(biāo)號(hào)代表其所在位置與段首地址的偏移量。根據(jù)程序計(jì)數(shù)器(偏移量。根據(jù)程序計(jì)數(shù)器(PCPC)和偏移量計(jì)算地)和偏移量計(jì)算地址即程序相對(duì)尋址。址

7、即程序相對(duì)尋址。 在映像中定義的標(biāo)號(hào)代表標(biāo)號(hào)到映像首地址的偏在映像中定義的標(biāo)號(hào)代表標(biāo)號(hào)到映像首地址的偏移量。映像的首地址通常被賦予一個(gè)寄存器,根移量。映像的首地址通常被賦予一個(gè)寄存器,根據(jù)該寄存器值與偏移量計(jì)算地址即寄存器相對(duì)尋據(jù)該寄存器值與偏移量計(jì)算地址即寄存器相對(duì)尋址。址。 例如:例如: loop SUBS r0,r0,#1;每次循環(huán)使每次循環(huán)使r0=r0-1 BNE loop;跳轉(zhuǎn)到跳轉(zhuǎn)到loop 標(biāo)號(hào)去執(zhí)行標(biāo)號(hào)去執(zhí)行 匯編語(yǔ)言的匯編語(yǔ)言的標(biāo)號(hào)標(biāo)號(hào)2 2 在宏中也可以使用局部符號(hào)。在宏中也可以使用局部符號(hào)。 局部標(biāo)號(hào)是局部標(biāo)號(hào)是099099的十進(jìn)位數(shù)開(kāi)始,可以重復(fù)定義。的十進(jìn)位數(shù)開(kāi)始,可

8、以重復(fù)定義。 局部標(biāo)號(hào)引用格式:局部標(biāo)號(hào)引用格式: F|BA|T NroutnameF|BA|T Nroutname %:局部標(biāo)號(hào)引用操作。:局部標(biāo)號(hào)引用操作。 F:編譯器只向前搜索。:編譯器只向前搜索。 B:編譯器只向后搜索。:編譯器只向后搜索。 A:編譯器搜索宏的所有嵌套層次。:編譯器搜索宏的所有嵌套層次。 T:編譯器搜索宏的當(dāng)前層。:編譯器搜索宏的當(dāng)前層。 例如:例如: 01SUBS r0,r0,#1;每次循環(huán)使每次循環(huán)使r0=r0-1BNE %B01;跳轉(zhuǎn)到跳轉(zhuǎn)到01標(biāo)號(hào)去執(zhí)行標(biāo)號(hào)去執(zhí)行 匯編語(yǔ)言的匯編語(yǔ)言的常量常量 常量:常量:其值在程序運(yùn)行過(guò)程中不能被改變的量。其值在程序運(yùn)行過(guò)程中

9、不能被改變的量。(1 1)數(shù)字常量:)數(shù)字常量:數(shù)字常量有數(shù)字常量有3 3種表示方式:種表示方式: 十進(jìn)制數(shù),如十進(jìn)制數(shù),如1 1、2 2、123123 十六進(jìn)制數(shù),如十六進(jìn)制數(shù),如 0 x123,0 xabc0 x123,0 xabc n n進(jìn)制數(shù),形式為進(jìn)制數(shù),形式為n_XXXn_XXX,n n的范圍是的范圍是2 2到到9 9,XXXXXX是是具體數(shù)字具體數(shù)字(2 2)字符常量:)字符常量:由單引號(hào)及中間的字符組成,包括由單引號(hào)及中間的字符組成,包括C C語(yǔ)言中的轉(zhuǎn)義字符,如語(yǔ)言中的轉(zhuǎn)義字符,如a,na,n(3 3)字符串常量:)字符串常量:由一對(duì)雙引號(hào)及中間的字符串表由一對(duì)雙引號(hào)及中間的

10、字符串表示,中間也可以使用示,中間也可以使用C C語(yǔ)言中的轉(zhuǎn)義字符,比如:語(yǔ)言中的轉(zhuǎn)義字符,比如:“abcdef0 xarn”abcdef0 xarn”(4 4)邏輯常量:)邏輯常量:TRUE,FALSE,TRUE,FALSE,注意帶大括號(hào)注意帶大括號(hào)第第5章章 基于基于ARM的匯編語(yǔ)言程序設(shè)計(jì)的匯編語(yǔ)言程序設(shè)計(jì) 匯編語(yǔ)言與C語(yǔ)言混合編程技術(shù)匯編語(yǔ)言源程序格式匯編語(yǔ)言上機(jī)過(guò)程ARM編譯開(kāi)發(fā)環(huán)境ADS編譯環(huán)境偽操作和宏指令GNU編譯環(huán)境偽操作和宏指令A(yù)DSADS編譯環(huán)境下的偽操作和宏指令編譯環(huán)境下的偽操作和宏指令 ADS編譯環(huán)境下的偽操作可分為以下幾類:符號(hào)定義(Symbol Definitio

11、n)偽操作 數(shù)據(jù)定義(Data Definition)偽操作 匯編控制(Assembly Control)偽操作 信息報(bào)告(Reporting)偽操作 其他(Miscellaneous)偽操作 (1)符號(hào)定義偽操作)符號(hào)定義偽操作 作用:作用:用于定義用于定義ARM匯編程序中的變量、對(duì)變量匯編程序中的變量、對(duì)變量賦值以及定義寄存器的別名等。賦值以及定義寄存器的別名等。符號(hào)定義有如下幾種偽操作符號(hào)定義有如下幾種偽操作 : 用于定義局部變量的用于定義局部變量的LCLA、LCLL和和LCLS。 用于定義全局變量的用于定義全局變量的GBLA、GBLL和和GBLS。 用于對(duì)變量賦值的用于對(duì)變量賦值的SE

12、TA、SETL和和SETS。 為通用寄存器列表定義名稱的為通用寄存器列表定義名稱的RLIST。 符號(hào)定義偽操作符號(hào)定義偽操作 1-1(1)LCLA、LCLL和和LCLS 格式:格式: LCLA/LCLL/LCLS局部變量名局部變量名 說(shuō)明:說(shuō)明:LCLA、LCLL和和LCLS偽操作偽操作 用于定義一用于定義一個(gè)匯編程序中的局部變量并初始化。個(gè)匯編程序中的局部變量并初始化。 其中:其中: LCLA定義一個(gè)局部的數(shù)字變量,初始化為定義一個(gè)局部的數(shù)字變量,初始化為0。 LCLL定義一個(gè)局部的邏輯變量,初始化為定義一個(gè)局部的邏輯變量,初始化為F。 LCLS定義一個(gè)局部的字符串變量,初始化為空定義一個(gè)局

13、部的字符串變量,初始化為空串。串。 這這3條偽操作條偽操作 用于聲明局部變量,在其局部作用用于聲明局部變量,在其局部作用范圍內(nèi)變量名必須惟一,例如在宏內(nèi)。范圍內(nèi)變量名必須惟一,例如在宏內(nèi)。 符號(hào)定義偽操作符號(hào)定義偽操作 1-2 例如:例如: MACRO TEST LCLAnum1 ;定義一個(gè)局部的數(shù)字變量,變量名為定義一個(gè)局部的數(shù)字變量,變量名為 ; num1 LCLLl2;定義一個(gè)局部的邏輯變量,變量名為定義一個(gè)局部的邏輯變量,變量名為l2 LCLSstr3;定義一個(gè)局部的字符串變量,變量名定義一個(gè)局部的字符串變量,變量名 ;為;為str3 num1SETA 0 xabcd;將該變量賦值為將

14、該變量賦值為0 xabcd l2SETL FALSE;將該變量賦值為真將該變量賦值為真 str3SETS Hello!;將該變量賦值為將該變量賦值為“Hello!” MEND 符號(hào)定義偽操作符號(hào)定義偽操作 2-1(2)GBLA、GBLL和和GBLS 格式:格式: GBLA/GBLL/GBLS 變量名變量名 說(shuō)明:說(shuō)明:GBLA、GBLL和和GBLS偽操作定義一個(gè)匯偽操作定義一個(gè)匯編程序中的全局變量并初始化。編程序中的全局變量并初始化。 其中:其中: GBLA定義一個(gè)全局?jǐn)?shù)字變量,并初始化為定義一個(gè)全局?jǐn)?shù)字變量,并初始化為0。 GBLL定義一個(gè)全局邏輯變量,并初始化為定義一個(gè)全局邏輯變量,并初始

15、化為F。 GBLS定義一個(gè)全局字符串變量,并初始化為空定義一個(gè)全局字符串變量,并初始化為空串。串。 這這3條偽操作條偽操作 用于定義全局變量,因此在整個(gè)程用于定義全局變量,因此在整個(gè)程序范圍內(nèi)變量名必須惟一。序范圍內(nèi)變量名必須惟一。 符號(hào)定義偽操作符號(hào)定義偽操作 2-2 例如:例如: GBLAnum1;定義一個(gè)全局的數(shù)字變定義一個(gè)全局的數(shù)字變 ;量,變量名為;量,變量名為num1 num1SETA 0 xabcd;將該變量賦值為將該變量賦值為0 xabcd GBLLl2;定義一個(gè)全局的邏輯變定義一個(gè)全局的邏輯變 ;量,變量名為;量,變量名為l2 l2SETL FALSE;將該變量賦值為假將該變

16、量賦值為假 GBLSstr3;定義一個(gè)全局的字符串變定義一個(gè)全局的字符串變 ;量,變量名為;量,變量名為str3 str3 SETS Hello!;將該變量賦值為將該變量賦值為“Hello!” 符號(hào)定義偽操作符號(hào)定義偽操作 3-1(3)SETA、SETL和和SETS 格式:格式: 變量名變量名SETA/SETL/SETS 表達(dá)式表達(dá)式 說(shuō)明:說(shuō)明: SETA:給一個(gè)數(shù)字變量賦值。:給一個(gè)數(shù)字變量賦值。 SETL:給一個(gè)邏輯變量賦值。:給一個(gè)邏輯變量賦值。 SETS:給一個(gè)字符串變量賦值。:給一個(gè)字符串變量賦值。 格式中的變量名必須為已經(jīng)定義過(guò)的全局或局部格式中的變量名必須為已經(jīng)定義過(guò)的全局或局

17、部變量,表達(dá)式為將要賦給變量的值。變量,表達(dá)式為將要賦給變量的值。 符號(hào)定義偽操作符號(hào)定義偽操作 3-2 例如:例如: LCLAnum1 ;定義一個(gè)局部的數(shù)字定義一個(gè)局部的數(shù)字 ;變量,變量名為;變量,變量名為num1 num1SETA 0 x1234;將該變量賦值將該變量賦值 ;為;為0 x1234 LCLSstr3;定義一個(gè)局部的字符串變定義一個(gè)局部的字符串變 ;量,變量名為;量,變量名為str3 str3 SETS “Hello!”;將該變量賦值為將該變量賦值為 ;“Hello!” 符號(hào)定義偽操作符號(hào)定義偽操作 4(4)RLIST 格式:格式: 名稱名稱RLIST寄存器列表寄存器列表 說(shuō)

18、明:說(shuō)明:RLIST可用于對(duì)一個(gè)通用寄存器列表定義可用于對(duì)一個(gè)通用寄存器列表定義名稱,該名稱可在名稱,該名稱可在ARM指令指令LDM/ STM中使用。中使用。在在LDM/STM指令中,列表中的寄存器為根據(jù)寄指令中,列表中的寄存器為根據(jù)寄存器的編號(hào)由低到高訪問(wèn)次序,與列表中的寄存存器的編號(hào)由低到高訪問(wèn)次序,與列表中的寄存器排列次序無(wú)關(guān)。器排列次序無(wú)關(guān)。 例如:例如: pblockRLISTR0-R3,R7,R5,R9 ;將寄存器列表名稱定義為將寄存器列表名稱定義為pblock,可在,可在ARM指令指令 ;LDM/STM中通過(guò)該名稱訪問(wèn)寄存器列表中通過(guò)該名稱訪問(wèn)寄存器列表(2)數(shù)據(jù)定義偽操作)數(shù)據(jù)

19、定義偽操作 作用:作用:為數(shù)據(jù)分配存儲(chǔ)單元,同時(shí)初始化。為數(shù)據(jù)分配存儲(chǔ)單元,同時(shí)初始化。 有如下幾種:有如下幾種: DCB 字節(jié)分配字節(jié)分配 DCW/DCWU 半字(半字(2字節(jié))分配字節(jié))分配 DCD/DCDU 字(字(4字節(jié))分配字節(jié))分配 DCQ/DCQU 8個(gè)字節(jié)分配個(gè)字節(jié)分配 DCFS/DCFSU 單精度浮點(diǎn)數(shù)分配單精度浮點(diǎn)數(shù)分配 DCFD/DCFDU 雙精度浮點(diǎn)數(shù)分配雙精度浮點(diǎn)數(shù)分配 SPACE 分配一塊連續(xù)的存儲(chǔ)單元分配一塊連續(xù)的存儲(chǔ)單元 FIELD 定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域 MAP 定義一個(gè)結(jié)構(gòu)化的內(nèi)存表首地址定義一個(gè)結(jié)構(gòu)化的內(nèi)存表首地址 數(shù)

20、據(jù)定義偽操作數(shù)據(jù)定義偽操作 1(1)DCB 格式:格式: 標(biāo)號(hào)標(biāo)號(hào) DCB 表達(dá)式表達(dá)式 說(shuō)明:說(shuō)明:分配一塊字節(jié)單元并用偽操作分配一塊字節(jié)單元并用偽操作 中指定的表中指定的表達(dá)式進(jìn)行初始化。達(dá)式進(jìn)行初始化。 表達(dá)式可以為使用雙引號(hào)的字符串或表達(dá)式可以為使用雙引號(hào)的字符串或0255的數(shù)的數(shù)字。字。 DCB可用可用“=”代替。代替。 例如:例如: Array1DCB 1,2,3,4,5;數(shù)組數(shù)組 str1DCBYour are welcome! ;構(gòu)造字符串并分配空間構(gòu)造字符串并分配空間數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作 2(2)DCW/DCWU 格式:格式: 標(biāo)號(hào)標(biāo)號(hào)DCW/DCWU 表達(dá)式表達(dá)式

21、說(shuō)明:說(shuō)明: DCW分配一段半字存儲(chǔ)單元并用表達(dá)式分配一段半字存儲(chǔ)單元并用表達(dá)式值初始化,它定義的存儲(chǔ)空間是半字對(duì)齊的。值初始化,它定義的存儲(chǔ)空間是半字對(duì)齊的。 DCWU功能與功能與DCW類似,只是分配的字存儲(chǔ)單類似,只是分配的字存儲(chǔ)單元不嚴(yán)格半字對(duì)齊。元不嚴(yán)格半字對(duì)齊。 例如:例如: Arrayw1DCW0 xa,-0 xb,0 xc,-0 xd ;構(gòu)造固定數(shù)組并分配半字存儲(chǔ)單元構(gòu)造固定數(shù)組并分配半字存儲(chǔ)單元 數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作 3(3)DCD/DCDU 格式:格式: 標(biāo)號(hào)標(biāo)號(hào)DCD/DCDU 表達(dá)式表達(dá)式 說(shuō)明:說(shuō)明:DCD偽操作偽操作 用于分配一塊字存儲(chǔ)單元并用用于分配一塊字存

22、儲(chǔ)單元并用偽操作偽操作 中指定的表達(dá)式初始化,它定義的存儲(chǔ)空中指定的表達(dá)式初始化,它定義的存儲(chǔ)空間是字對(duì)齊的。間是字對(duì)齊的。 DCD也可用也可用“&”代替。代替。 DCDU功能與功能與DCD類似,只是分配的存儲(chǔ)單元不類似,只是分配的存儲(chǔ)單元不嚴(yán)格字對(duì)齊。嚴(yán)格字對(duì)齊。 例如:例如: Arrayd1 DCD1334,234,345435 ;構(gòu)造固定數(shù)組并分配字為單元的存儲(chǔ)單元構(gòu)造固定數(shù)組并分配字為單元的存儲(chǔ)單元 LabelDCDstr1;該字單元存放該字單元存放str1的地址的地址 數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作 4(4)DCQ/DCQU 格式:格式: 標(biāo)號(hào)標(biāo)號(hào)DCQ/DCQU 表達(dá)式表達(dá)式

23、 說(shuō)明:說(shuō)明:DCQ用于分配一塊以用于分配一塊以8個(gè)字節(jié)為單位的存?zhèn)€字節(jié)為單位的存儲(chǔ)區(qū)域并用偽操作儲(chǔ)區(qū)域并用偽操作 中指定的表達(dá)式初始化,它定中指定的表達(dá)式初始化,它定義的存儲(chǔ)空間是字對(duì)齊的。義的存儲(chǔ)空間是字對(duì)齊的。 DCQU功能與功能與DCQ類似,只是分配的存儲(chǔ)單元不類似,只是分配的存儲(chǔ)單元不嚴(yán)格字對(duì)齊。嚴(yán)格字對(duì)齊。 例如:例如: Arrayd1DCQ234234,98765541 ;構(gòu)造固定數(shù)組并分配字為單元的存儲(chǔ)空間。構(gòu)造固定數(shù)組并分配字為單元的存儲(chǔ)空間。 ;注意:;注意:DCQ不能給字符串分配空間不能給字符串分配空間 數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作 5(5)DCFD/DCFDU 格式:格

24、式: 標(biāo)號(hào)標(biāo)號(hào) DCFD/DCFDU表達(dá)式表達(dá)式 說(shuō)明:說(shuō)明:DCFD用于為雙精度的浮點(diǎn)數(shù)分配一片連用于為雙精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元并用偽操作續(xù)的字存儲(chǔ)單元并用偽操作 中指定的表達(dá)式初始中指定的表達(dá)式初始化,它定義的存儲(chǔ)空間是字對(duì)齊的?;?,它定義的存儲(chǔ)空間是字對(duì)齊的。 每個(gè)雙精度的浮點(diǎn)數(shù)每個(gè)雙精度的浮點(diǎn)數(shù)占據(jù)兩個(gè)字占據(jù)兩個(gè)字單元。單元。 DCFDU功能與功能與DCFD類似,只是分配的存儲(chǔ)單元類似,只是分配的存儲(chǔ)單元不嚴(yán)格字對(duì)齊。不嚴(yán)格字對(duì)齊。 例如:例如: Arrayf1DCFD 6E2 Arrayf2DCFD 1.23,1.45數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作 6(6)DCFS/DC

25、FSU 格式:格式: 標(biāo)號(hào)標(biāo)號(hào) DCFS/DCFSU 表達(dá)式表達(dá)式 說(shuō)明:說(shuō)明:DCFS用于為單精度的浮點(diǎn)數(shù)分配一片連用于為單精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元并用表達(dá)式初始化,它定義的存續(xù)的字存儲(chǔ)單元并用表達(dá)式初始化,它定義的存儲(chǔ)空間是字對(duì)齊的。儲(chǔ)空間是字對(duì)齊的。 每個(gè)單精度浮點(diǎn)數(shù)每個(gè)單精度浮點(diǎn)數(shù)使用一個(gè)字使用一個(gè)字單元。單元。 DCFSU功能與功能與DCFS類似,只是分配的存儲(chǔ)單元類似,只是分配的存儲(chǔ)單元不嚴(yán)格字對(duì)齊。不嚴(yán)格字對(duì)齊。 例如:例如: Arrayf1DCFS 6E2,-9E-2,-.3 Arrayf2DCFSU1.23,6.8E9 數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作 7(7)SPA

26、CE 格式:格式: 標(biāo)號(hào)標(biāo)號(hào) SPACE表達(dá)式表達(dá)式 說(shuō)明:說(shuō)明:SPACE用于分配一片連續(xù)的存儲(chǔ)區(qū)域并初用于分配一片連續(xù)的存儲(chǔ)區(qū)域并初始化為始化為0,表達(dá)式為要分配的字節(jié)數(shù)。,表達(dá)式為要分配的字節(jié)數(shù)。 SPACE也可用也可用“%”代替。代替。 例如:例如: freespaceSPACE1000 ;分配分配1000字節(jié)的存儲(chǔ)空間字節(jié)的存儲(chǔ)空間 數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作 8(8)MAP 格式:格式: MAP 表達(dá)式表達(dá)式 ,基址寄存器,基址寄存器 說(shuō)明:說(shuō)明:MAP定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的首地址。定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的首地址。 “”可以用來(lái)代替可以用來(lái)代替MAP。 表達(dá)式可以為程序中的標(biāo)號(hào)

27、或數(shù)學(xué)表達(dá)式,基址表達(dá)式可以為程序中的標(biāo)號(hào)或數(shù)學(xué)表達(dá)式,基址寄存器為可選項(xiàng),當(dāng)基址寄存器選項(xiàng)不存在時(shí),寄存器為可選項(xiàng),當(dāng)基址寄存器選項(xiàng)不存在時(shí),表達(dá)式的值即為內(nèi)存表的首地址,當(dāng)該選項(xiàng)存在表達(dá)式的值即為內(nèi)存表的首地址,當(dāng)該選項(xiàng)存在時(shí),內(nèi)存表的首地址為表達(dá)式的值與基址寄存器時(shí),內(nèi)存表的首地址為表達(dá)式的值與基址寄存器的和。的和。 MAP可以與可以與FIELD偽操作配合使用來(lái)定義結(jié)構(gòu)化偽操作配合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存表。的內(nèi)存表。 例如:例如: MAP 0 x130,R2 ;內(nèi)存表首地址為內(nèi)存表首地址為0 x130R2 數(shù)據(jù)定義偽操作數(shù)據(jù)定義偽操作 9(9)FIELD格式:格式: 標(biāo)號(hào)標(biāo)號(hào)FIELD

28、字節(jié)數(shù)字節(jié)數(shù)說(shuō)明:說(shuō)明:FIELD用于用于定義定義一個(gè)結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域。一個(gè)結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域。“#”可用來(lái)代替可用來(lái)代替FIELD。FIELD常與常與MAP配合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存表:配合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存表:FIELD偽操作偽操作 定義內(nèi)存表中的各個(gè)數(shù)據(jù)域,定義內(nèi)存表中的各個(gè)數(shù)據(jù)域,MAP則定義內(nèi)存表的則定義內(nèi)存表的首地址,并為每個(gè)數(shù)據(jù)域指定一個(gè)標(biāo)號(hào)以供其他的指令引首地址,并為每個(gè)數(shù)據(jù)域指定一個(gè)標(biāo)號(hào)以供其他的指令引用。用。需要注意的是需要注意的是MAP和和FIELD偽操作偽操作 僅用于定義數(shù)據(jù)結(jié)構(gòu),僅用于定義數(shù)據(jù)結(jié)構(gòu),并不分配并不分配存儲(chǔ)單元。存儲(chǔ)單元。例如:例如:MAP0

29、 xF10000;定義結(jié)構(gòu)化內(nèi)存表首地址為定義結(jié)構(gòu)化內(nèi)存表首地址為0 xF10000countFIELD 4;定義定義count的長(zhǎng)度為的長(zhǎng)度為4字節(jié),位置為字節(jié),位置為0 xF1000+0 xFIELD 4;定義定義x的長(zhǎng)度為的長(zhǎng)度為4字節(jié),位置為字節(jié),位置為0 xF1004yFIELD 4;定義定義y的長(zhǎng)度為的長(zhǎng)度為4字節(jié),位置為字節(jié),位置為0 xF1008 (3 3)匯編控制偽操作)匯編控制偽操作 作用:作用:指引匯編程序的執(zhí)行流程。指引匯編程序的執(zhí)行流程。 常用的偽操作包括:常用的偽操作包括:(1)MACRO和和MEND:宏定義的開(kāi)始與結(jié)束。:宏定義的開(kāi)始與結(jié)束。 (2)IF、ELSE

30、和和ENDIF:根據(jù)邏輯表達(dá)式的成立:根據(jù)邏輯表達(dá)式的成立與否決定是否在編譯時(shí)加入某個(gè)指令序列。與否決定是否在編譯時(shí)加入某個(gè)指令序列。 (3)WHILE和和WEND:根據(jù)邏輯表達(dá)式的成立與:根據(jù)邏輯表達(dá)式的成立與否決定是否循環(huán)執(zhí)行這個(gè)代碼段。否決定是否循環(huán)執(zhí)行這個(gè)代碼段。 (4)MEXIT:從宏中退出。:從宏中退出。 (4)其他偽操作)其他偽操作 在匯編程序中經(jīng)常會(huì)使用一些其他的偽操作在匯編程序中經(jīng)常會(huì)使用一些其他的偽操作 ,包括以下包括以下14條:條: ASSERTAREA ALIGNCODE16/CODE32 ENTRYEND EQUIMPORT EXPORT/GLOBALEXTERN I

31、NCBINGET/INCLUDE RNROUT 其他偽操作其他偽操作 1 (1)ASSERT 格式:格式: ASSERT 邏輯表達(dá)式邏輯表達(dá)式 說(shuō)明:說(shuō)明:ASSERT用來(lái)表示程序的編譯必須滿足一用來(lái)表示程序的編譯必須滿足一定的條件,如果邏輯表達(dá)式不滿足,則編譯器會(huì)定的條件,如果邏輯表達(dá)式不滿足,則編譯器會(huì)報(bào)錯(cuò)。報(bào)錯(cuò)。 例如:例如: ASSERT ver7;保證保證ver7 其他偽操作其他偽操作 2(2)AREA格式:格式: AREA 段名段名屬性,屬性,說(shuō)明:說(shuō)明:AREA用于定義一個(gè)代碼段、數(shù)據(jù)段或者特定屬性的用于定義一個(gè)代碼段、數(shù)據(jù)段或者特定屬性的段。如果段名以數(shù)字開(kāi)頭,那么該段名需用段

32、。如果段名以數(shù)字開(kāi)頭,那么該段名需用“|”字符括起來(lái),字符括起來(lái),如如|7wolf|,用,用C的編譯器產(chǎn)生的代碼一般也用的編譯器產(chǎn)生的代碼一般也用“|”括括 起起來(lái)。來(lái)。屬性部分表示該代碼段屬性部分表示該代碼段/數(shù)據(jù)段的相關(guān)屬性,多個(gè)屬性可以數(shù)據(jù)段的相關(guān)屬性,多個(gè)屬性可以用用“,”分隔。分隔。常見(jiàn)屬性如下:常見(jiàn)屬性如下: DATA:定義數(shù)據(jù)段。:定義數(shù)據(jù)段。 CODE:定義代碼段。:定義代碼段。 READONLY:表示本段為只讀。:表示本段為只讀。 READWRITE:表示本段可讀寫。:表示本段可讀寫。 ALIGN=表達(dá)式,對(duì)齊方式為表達(dá)式,對(duì)齊方式為2的表達(dá)式次方,例如:表的表達(dá)式次方,例如

33、:表達(dá)式達(dá)式=3,則對(duì)齊方式為,則對(duì)齊方式為8字節(jié)對(duì)齊。表達(dá)式的取值范圍為字節(jié)對(duì)齊。表達(dá)式的取值范圍為031。 COMMON屬性:定義一個(gè)通用段,這個(gè)段不包含用戶屬性:定義一個(gè)通用段,這個(gè)段不包含用戶代碼和數(shù)據(jù)。代碼和數(shù)據(jù)。其他偽操作其他偽操作 3(3)ALIGN 格式:格式: ALIGN表達(dá)式表達(dá)式,偏移量,偏移量 說(shuō)明:說(shuō)明:ALIGN偽操作可以通過(guò)填充字節(jié)使當(dāng)前的偽操作可以通過(guò)填充字節(jié)使當(dāng)前的位置滿足一定的對(duì)齊方式。位置滿足一定的對(duì)齊方式。 表達(dá)式的值為表達(dá)式的值為2的冪,如的冪,如1、2、4、8、16等,用于等,用于指定對(duì)齊方式。指定對(duì)齊方式。 如果偽操作中沒(méi)有指定表達(dá)式,則編譯器會(huì)將

34、當(dāng)如果偽操作中沒(méi)有指定表達(dá)式,則編譯器會(huì)將當(dāng)前位置對(duì)齊到下一個(gè)字的位置。偏移量也是個(gè)數(shù)前位置對(duì)齊到下一個(gè)字的位置。偏移量也是個(gè)數(shù)字表達(dá)式,如果存在偏移量,則當(dāng)前位置自動(dòng)對(duì)字表達(dá)式,如果存在偏移量,則當(dāng)前位置自動(dòng)對(duì)齊到齊到2的表達(dá)式值次方偏移量。的表達(dá)式值次方偏移量。 例如:例如:AREA|.data|,DATA,READWRITE,ALIGN=2 其他偽操作其他偽操作 4(4)CODE16/CODE32格式:格式: CODE16/CODE32說(shuō)明:說(shuō)明:CODE16偽操作指示編譯器后面的代碼為偽操作指示編譯器后面的代碼為16位的位的Thumb指令。指令。CODE32偽操作指示編譯器后面的代碼為

35、偽操作指示編譯器后面的代碼為32位的位的ARM指令。指令。如果在匯編源代碼中同時(shí)包含如果在匯編源代碼中同時(shí)包含Thumb和和ARM指令時(shí),可以指令時(shí),可以用用“CODE32”通知編譯器后的指令序列為通知編譯器后的指令序列為32位的位的ARM指令,指令,用用“CODE16”偽操作偽操作 通知編譯器后的指令序列為通知編譯器后的指令序列為16位的位的Thumb指令。指令。CODE16/CODE32不能對(duì)處理器進(jìn)行狀態(tài)的切換。不能對(duì)處理器進(jìn)行狀態(tài)的切換。例如:例如:CODE32; 32位的位的ARM指令指令A(yù)REA|.text|,CODE,READONLYLDRR0,0 x8500;BXR0;程序跳轉(zhuǎn)

36、,并將處理器切換到程序跳轉(zhuǎn),并將處理器切換到Thumb狀態(tài)狀態(tài)CODE16;16位的位的Thumb指令指令A(yù)DD R3,R3,1END;源文件結(jié)束源文件結(jié)束 其他偽操作其他偽操作 5-1(5)ENTRY 格式:格式: ENTRY 說(shuō)明:說(shuō)明:ENTRY用于指定匯編程序的入口。用于指定匯編程序的入口。 在一個(gè)完整的匯編程序中至少要有一個(gè)在一個(gè)完整的匯編程序中至少要有一個(gè)ENTRY,程序中也可以有多個(gè),此時(shí),程序的真正入口點(diǎn)程序中也可以有多個(gè),此時(shí),程序的真正入口點(diǎn)可在鏈接時(shí)指定,但在一個(gè)源文件里最多只能有可在鏈接時(shí)指定,但在一個(gè)源文件里最多只能有一個(gè)一個(gè)ENTRY或者沒(méi)有或者沒(méi)有ENTRY。 其

37、他偽操作其他偽操作 5-2下面的代碼使用了下面的代碼使用了ENTRY: AREA subrout, CODE, READONLY ; name this block of code mar k ENTRY ; first instruction to executestart MOV r0, #10 ; Set up parameters MOV r1, #3 BL doadd ; Call subroutinestop MOV r0, #0 x18 ; angel_SWIreason_ReportException LDR r1, =0 x20026 ; ADP_Stopped_Applic

38、ationExit SWI 0 x123456 ; ARM semihosting SWIdoadd ADD r0, r0, r1 ; Subroutine code MOV pc, lr ; Return from subroutine END ; Mark end of file 其他偽操作其他偽操作 6(6)END 格式:格式: END 說(shuō)明:說(shuō)明:END告訴編譯器已經(jīng)到了源程序的結(jié)尾。告訴編譯器已經(jīng)到了源程序的結(jié)尾。 例如:例如: AREAconstdata,DATA,READONLY END;結(jié)尾結(jié)尾 其他偽操作其他偽操作 7 (7)EQU 格式:格式: 名稱名稱 EQU表達(dá)式表達(dá)式

39、 ,類型,類型 說(shuō)明:說(shuō)明:EQU用于將程序中的數(shù)字常量、標(biāo)號(hào)、基用于將程序中的數(shù)字常量、標(biāo)號(hào)、基于寄存器的值賦予一個(gè)等效的名稱,這一點(diǎn)類似于寄存器的值賦予一個(gè)等效的名稱,這一點(diǎn)類似于于C語(yǔ)言中的語(yǔ)言中的define. 可用可用“*”代替代替EQU。 如果表達(dá)式為如果表達(dá)式為32位的常量,我們可以指定表達(dá)式位的常量,我們可以指定表達(dá)式的數(shù)據(jù)類型,類型域可以有以下的數(shù)據(jù)類型,類型域可以有以下3種:種:CODE16/CODE32/DATA 例如:例如: num1EQU1234;定義定義num1為為1234 addr5EQUstr1+0 x50 d1EQU0 x2400,CODE32;定義定義d1的

40、的為為0 x2400,且該處為,且該處為32位的位的ARM指令指令 其他偽操作其他偽操作 8(8)EXPORT/GLOBAL 格式:格式: EXPORT/GLOBAL標(biāo)號(hào)標(biāo)號(hào) ,WEAK 說(shuō)明:說(shuō)明:EXPORT在程序中聲明一個(gè)全局標(biāo)號(hào),其在程序中聲明一個(gè)全局標(biāo)號(hào),其他文件中的代碼可以被該標(biāo)號(hào)引用。用戶也可以他文件中的代碼可以被該標(biāo)號(hào)引用。用戶也可以用用GLOBAL代替代替EXPORT。 ,WEAK可選項(xiàng)聲明其他文件有同名的標(biāo)號(hào),則可選項(xiàng)聲明其他文件有同名的標(biāo)號(hào),則該同名標(biāo)號(hào)優(yōu)先于該標(biāo)號(hào)被引用。該同名標(biāo)號(hào)優(yōu)先于該標(biāo)號(hào)被引用。 例如:例如: AREA|.text|,CODE,READONLY m

41、ain PROC ENDP EXPORT main;聲明一個(gè)可全局引用的函數(shù)聲明一個(gè)可全局引用的函數(shù)main END 其他偽操作其他偽操作 9 (9)IMPORT 格式:格式: IMPORT標(biāo)號(hào)標(biāo)號(hào) ,WEAK 說(shuō)明:說(shuō)明:告訴編譯器,這個(gè)標(biāo)號(hào)要在當(dāng)前源文件中告訴編譯器,這個(gè)標(biāo)號(hào)要在當(dāng)前源文件中使用,但標(biāo)號(hào)是在其他的源文件中定義的。使用,但標(biāo)號(hào)是在其他的源文件中定義的。 ,WEAK:如果所有的源文件都沒(méi)有找到這個(gè)標(biāo):如果所有的源文件都沒(méi)有找到這個(gè)標(biāo)號(hào)的定義,編譯器也不會(huì)提示錯(cuò)誤信息。號(hào)的定義,編譯器也不會(huì)提示錯(cuò)誤信息。 例如:例如: AREAmycode,CODE,READONLY IMPOR

42、T_ printf ;通知編譯器當(dāng)前文件要引用函數(shù)通知編譯器當(dāng)前文件要引用函數(shù)_ printf END 其他偽操作其他偽操作 10(10)EXTERN 格式:格式: EXTERN標(biāo)號(hào)標(biāo)號(hào) ,WEAK 說(shuō)明:說(shuō)明:告訴編譯器,標(biāo)號(hào)要在當(dāng)前源文件中引用,告訴編譯器,標(biāo)號(hào)要在當(dāng)前源文件中引用,但是該標(biāo)號(hào)是在其他的源文件中定義的。但是該標(biāo)號(hào)是在其他的源文件中定義的。 與與IMPORT不同的是,如果當(dāng)前源文件實(shí)際上沒(méi)不同的是,如果當(dāng)前源文件實(shí)際上沒(méi)有引用該標(biāo)號(hào),該標(biāo)號(hào)就不會(huì)被加入到當(dāng)前文件有引用該標(biāo)號(hào),該標(biāo)號(hào)就不會(huì)被加入到當(dāng)前文件的符號(hào)表中。的符號(hào)表中。 ,WEAK:即使所有的源文件都沒(méi)有找到這個(gè)標(biāo):即

43、使所有的源文件都沒(méi)有找到這個(gè)標(biāo)號(hào)的定義,編譯器也不給出錯(cuò)誤信息。號(hào)的定義,編譯器也不給出錯(cuò)誤信息。 例如:例如: AREA|.text|,CODE,READONLY EXTERN _ printf,WEAK;告訴編譯器當(dāng)前告訴編譯器當(dāng)前文件要引用標(biāo)號(hào),如果找不到,則不提示錯(cuò)誤文件要引用標(biāo)號(hào),如果找不到,則不提示錯(cuò)誤 END 其他偽操作其他偽操作 11 (11)GET/INCLUDE格式:格式: GET文件名文件名說(shuō)明:說(shuō)明:GET將一個(gè)源文件包含到當(dāng)前的源文件中,并將被將一個(gè)源文件包含到當(dāng)前的源文件中,并將被包含的源文件在當(dāng)前位置展開(kāi)進(jìn)行匯編處理。包含的源文件在當(dāng)前位置展開(kāi)進(jìn)行匯編處理。INC

44、LUDE和和GET的作用是等效的。的作用是等效的。使用方法:使用方法:在某源文件中定義一些宏指令,用在某源文件中定義一些宏指令,用MAP和和FIELD定義結(jié)構(gòu)化的數(shù)據(jù)類型,用定義結(jié)構(gòu)化的數(shù)據(jù)類型,用EQU定義常量的符號(hào)名定義常量的符號(hào)名稱,然后用稱,然后用GET/INCLUDE將這個(gè)源文件包含到其他的源將這個(gè)源文件包含到其他的源文件中。文件中。使用方法與使用方法與C語(yǔ)言中的語(yǔ)言中的“#include”相似。相似。GET/INCLUDE只能用于包含源文件,包含其他文件則需只能用于包含源文件,包含其他文件則需要使用要使用INCBIN偽操作偽操作 。例如:例如:AREAmycode,DATA,REA

45、DONLYGET E:codeprog1.s;通知編譯器在當(dāng)前源文件包通知編譯器在當(dāng)前源文件包含源文件含源文件E:code prog1.sGET prog2.s ;通知編譯器當(dāng)前源通知編譯器當(dāng)前源文件包含可搜索目錄下的文件包含可搜索目錄下的prog2.sEND 其他偽操作其他偽操作 12(12)INCBIN 格式:格式: INCBIN文件名文件名 說(shuō)明:說(shuō)明:INCBIN將一個(gè)數(shù)據(jù)文件或者目標(biāo)文件包將一個(gè)數(shù)據(jù)文件或者目標(biāo)文件包含到當(dāng)前的源文件中,編譯時(shí)被包含的文件不作含到當(dāng)前的源文件中,編譯時(shí)被包含的文件不作任何變動(dòng)地存放在當(dāng)前文件中,編譯器從后面開(kāi)任何變動(dòng)地存放在當(dāng)前文件中,編譯器從后面開(kāi)始

46、繼續(xù)處理。始繼續(xù)處理。 例如:例如: AREAconstdata,DATA,READONLY INCBINdata1.dat;源文件包含文件源文件包含文件data1.dat INCBIN E:DATAdata2.bin ;源文件包含文件源文件包含文件E:DATAdata2.bin END 其他偽操作其他偽操作 13 (13)RN 格式:格式: 名稱名稱RN表達(dá)式表達(dá)式 說(shuō)明:說(shuō)明:RN用于給一個(gè)寄存器定義一個(gè)別名,以便用于給一個(gè)寄存器定義一個(gè)別名,以便程序員記憶該寄存器的功能。程序員記憶該寄存器的功能。 名稱為給寄存器定義的別名,表達(dá)式為寄存器的名稱為給寄存器定義的別名,表達(dá)式為寄存器的編碼。

47、編碼。 例如:例如: countRNR1;給給R1定義一個(gè)別名定義一個(gè)別名count 其他偽操作其他偽操作 14(14)ROUT 格式:格式: 名稱名稱ROUT 說(shuō)明:說(shuō)明:ROUT可以給一個(gè)局部變量定義作用范圍??梢越o一個(gè)局部變量定義作用范圍。 在程序中未使用該偽操作在程序中未使用該偽操作 時(shí),局部變量的作用范時(shí),局部變量的作用范圍為所在的圍為所在的AREA,而使用,而使用ROUT后,局部變量后,局部變量的作用范圍為當(dāng)前的作用范圍為當(dāng)前ROUT和下一個(gè)和下一個(gè)ROUT之間。之間。 ADSADS編譯環(huán)境下的偽指令編譯環(huán)境下的偽指令 ADR 小范圍地址讀取小范圍地址讀取ADRL 中等范圍地址讀取

48、中等范圍地址讀取LDR 大范圍地址讀取大范圍地址讀取NOP 空操作空操作偽指令偽指令1 (1)ADR 小范圍地址讀取小范圍地址讀取格式:格式: ADR ,;說(shuō)明:說(shuō)明:將基于將基于PC相對(duì)偏移的地址值或基于寄存器相對(duì)偏移相對(duì)偏移的地址值或基于寄存器相對(duì)偏移的地址值(的地址值(expr 地址表達(dá)式)讀取到目標(biāo)寄存器地址表達(dá)式)讀取到目標(biāo)寄存器Rd中。中。當(dāng)?shù)刂分凳欠亲謱?duì)齊時(shí),取值范圍在當(dāng)?shù)刂分凳欠亲謱?duì)齊時(shí),取值范圍在-255255字節(jié)字節(jié)之間;之間;當(dāng)?shù)刂分凳亲謱?duì)齊時(shí),取值范圍在當(dāng)?shù)刂分凳亲謱?duì)齊時(shí),取值范圍在-1 0201 020字節(jié)字節(jié)之間。之間。在匯編編譯源程序時(shí)在匯編編譯源程序時(shí),ADR偽

49、指令被編譯器替換成偽指令被編譯器替換成一條合適一條合適的指令的指令。通常通常,編譯器用一條編譯器用一條ADD指令或指令或SUB指令來(lái)實(shí)現(xiàn)該指令來(lái)實(shí)現(xiàn)該ADR偽指?jìng)沃噶畹墓δ?。若不能用一條指令實(shí)現(xiàn)令的功能。若不能用一條指令實(shí)現(xiàn),則產(chǎn)生錯(cuò)誤則產(chǎn)生錯(cuò)誤,編譯失敗。編譯失敗。 對(duì)于基于對(duì)于基于PC相對(duì)偏移的地址值時(shí),給定范圍是相對(duì)當(dāng)前指相對(duì)偏移的地址值時(shí),給定范圍是相對(duì)當(dāng)前指令地址后兩個(gè)字處令地址后兩個(gè)字處(因?yàn)橐驗(yàn)锳RM7TDMI為三級(jí)流水線為三級(jí)流水線)??梢杂每梢杂肁DR加載地址實(shí)現(xiàn)查表。加載地址實(shí)現(xiàn)查表。例如:例如:LOOP MOV R1,#0 xF0 ADR R2,LOOP ;將;將LOOP

50、的地址放入的地址放入R2 ADR R3,LOOP + 4偽指令偽指令2(2)ADRL 中等范圍地址讀取中等范圍地址讀取格式:格式: ADRL ,;說(shuō)明:說(shuō)明:類似于類似于ADR, 但比但比ADR讀取更大范圍的地址。讀取更大范圍的地址。當(dāng)?shù)刂分凳欠亲謱?duì)齊時(shí),取值范圍在當(dāng)?shù)刂分凳欠亲謱?duì)齊時(shí),取值范圍在-64KB64 KB之間;之間;地址值是字對(duì)齊時(shí),取值范圍在地址值是字對(duì)齊時(shí),取值范圍在-256KB256 KB之間。之間。在匯編編譯源程序時(shí),在匯編編譯源程序時(shí),ADRL偽指令被編譯器替換成偽指令被編譯器替換成兩條合兩條合適的指令適的指令。若不能用兩條指令實(shí)現(xiàn)若不能用兩條指令實(shí)現(xiàn)ADRL偽指令功能,

51、則產(chǎn)生錯(cuò)誤,編偽指令功能,則產(chǎn)生錯(cuò)誤,編譯失敗。譯失敗??梢杂每梢杂肁DRL加載地址,實(shí)現(xiàn)程序跳轉(zhuǎn)。加載地址,實(shí)現(xiàn)程序跳轉(zhuǎn)。例如:例如:ADRL R0,DATA_BUFADRL R1,DATA_BUF+80DATA_BUFSPACE 100 ;定義;定義100字節(jié)緩沖區(qū)字節(jié)緩沖區(qū)偽指令偽指令3 (3)LDR 大范圍地址讀取大范圍地址讀取格式:格式: LDR ,;說(shuō)明:說(shuō)明:加載加載32位的立即數(shù)或一個(gè)地址值到目標(biāo)寄存器位的立即數(shù)或一個(gè)地址值到目標(biāo)寄存器Rd。在匯編編譯源程序時(shí),在匯編編譯源程序時(shí),LDR偽指令被編譯器替換成偽指令被編譯器替換成一條合適的一條合適的指令指令。若加載的常數(shù)未超出若加

52、載的常數(shù)未超出MOV或或MVN的范圍,則使用的范圍,則使用MOV或或MVN指令代替該指令代替該LDR偽指令;否則匯編器將常量放入文字池,偽指令;否則匯編器將常量放入文字池,并使用一條程序相對(duì)偏移的并使用一條程序相對(duì)偏移的LDR指令從文字池讀出常量。指令從文字池讀出常量。 LDR用于加載芯片外圍功能部件的寄存器地址用于加載芯片外圍功能部件的寄存器地址(32位立即數(shù)位立即數(shù)),以實(shí)現(xiàn)各種控制操作。從以實(shí)現(xiàn)各種控制操作。從PC到文字池的偏移量必須小于到文字池的偏移量必須小于4 KB。與與ARM指令的指令的LDR相比,相比,偽指令的偽指令的LDR的參數(shù)有的參數(shù)有“”符號(hào)符號(hào)。例如:例如:LDR R0,

53、=0 x12345678 ;加載;加載32位立即數(shù)位立即數(shù)0 x12345678LDR R0,=DATA_BUF+60 ;加載;加載DATA_BUF地址地址+60LTORG ;聲明文字池;聲明文字池偽指令偽指令4(4)NOP 空操作空操作 格式:格式: NOP ; 說(shuō)明:說(shuō)明:不產(chǎn)生任何有意義的操作,只是占用一個(gè)不產(chǎn)生任何有意義的操作,只是占用一個(gè)機(jī)器時(shí)間。機(jī)器時(shí)間。 NOP偽指令在匯編時(shí)將會(huì)被替代成偽指令在匯編時(shí)將會(huì)被替代成ARM中的空中的空操作,比如可能為操作,比如可能為“MOV R0,R0”指令等。指令等。第第5章章 基于基于ARM的匯編語(yǔ)言程序設(shè)計(jì)的匯編語(yǔ)言程序設(shè)計(jì) 匯編語(yǔ)言與C語(yǔ)言混

54、合編程技術(shù)匯編語(yǔ)言源程序格式匯編語(yǔ)言上機(jī)過(guò)程ARM編譯開(kāi)發(fā)環(huán)境ADS編譯環(huán)境偽操作和宏指令GNU編譯環(huán)境偽操作和宏指令GNU編譯環(huán)境下的偽操作和宏指令編譯環(huán)境下的偽操作和宏指令 GNU編譯環(huán)境下的偽操作可分為以下幾類:常量編譯控制偽操作匯編程序代碼控制偽操作宏及條件編譯控制偽操作其他偽操作常量編譯控制偽操作常量編譯控制偽操作 :偽操作語(yǔ)法格式作 用.byte.byte expr ,expr 分配一段字節(jié)內(nèi)存單元,并用expr初始化。.hword/.short.hword expr ,expr 分配一段半字內(nèi)存單元,并用expr初始化。.ascii.ascii expr ,expr 定義字符串e

55、xpr(非零結(jié)束符)。.asciz /.string.asciz expr ,expr 定義字符串expr(以/0為結(jié)束符)。.float/.single.float expr ,expr 定義一個(gè)32bit IEEE 浮點(diǎn)數(shù)expr。.double.double expr ,expr 定義64bit IEEE浮點(diǎn)數(shù)expr。word/.long /.int.word expr ,expr 分配一段字內(nèi)存單元,并用expr初始化。.fill.fill repeat ,size,value分配一段字節(jié)內(nèi)存單元,用size長(zhǎng)度value填充repeat次。.zero.zero size分配一段字節(jié)

56、內(nèi)存單元,并用0填充內(nèi)存。.space/.skip.space size , value分配一段內(nèi)存單元,用value將內(nèi)存單元初始化。匯編程序代碼控制偽操作匯編程序代碼控制偽操作 偽操作語(yǔ)法格式作 用.section.section expr定義域中包含的段。.text.text subsection將操作符開(kāi)始的代碼編譯到代碼段或代碼段子段。.data.data subsection將操作符開(kāi)始的數(shù)據(jù)編譯到數(shù)據(jù)段或數(shù)據(jù)段子段。.bss.bss subsection將變量存放到.bss段或.bss段的子段。.code 16/.thumb.code 16.thumb表明當(dāng)前匯編指令的指令集選擇

57、Thumb指令集。.code 32/.arm.code 32.arm表明當(dāng)前匯編指令的指令集選擇ARM指令集。.end.end標(biāo)記匯編文件的結(jié)束行,即標(biāo)號(hào)后的代碼不作處理。.include.include “filename”將一個(gè)源文件包含到當(dāng)前源文件中。.align/.balign.align alignment ,fill ,max通過(guò)添加填充字節(jié)使當(dāng)前位置滿足一定的對(duì)齊方式。宏及條件編譯控制偽操作宏及條件編譯控制偽操作 偽操作語(yǔ)法格式作 用.macro、.e x i t m及.endm.macro acronameparameter, parameter.endm. m a c r o

58、 偽 操 作 標(biāo) 識(shí) 宏 定 義 的 開(kāi)始,.endm標(biāo)識(shí)宏定義的結(jié)束。用.macro及.endm定義一段代碼,稱為宏定義體。.exitm偽操作用于提前退出宏。. ifdef,.else及.endif.ifdef condition.else.endif當(dāng)滿足某條件時(shí)對(duì)一組語(yǔ)句進(jìn)行編譯,而當(dāng)條件不滿足時(shí)則編譯另一組語(yǔ)句。其中else可以缺省。其他偽操作其他偽操作 偽操作語(yǔ)法格式作 用.eject.eject在匯編符號(hào)列表文件中插入一分頁(yè)符。.list.list產(chǎn)生匯編列表(從 .list 到 .nolist)。.nolist.nolist表示匯編列表結(jié)束處。.title.title “head

59、ing”使用“heading ”作為標(biāo)題。.sbttl.sbttl “heading”使用“heading”作為子標(biāo)題。.ltorg.ltorg在當(dāng)前段的當(dāng)前地址(字對(duì)齊)產(chǎn)生一個(gè)文字池。.req.req name,expr為一個(gè)特定的寄存器定義名稱。.err.err使編譯時(shí)產(chǎn)生錯(cuò)誤報(bào)告。.print.print string打印信息到標(biāo)準(zhǔn)輸出。.fail.fail expr編譯匯編文件時(shí)產(chǎn)生警告。ARM和和GNU集成開(kāi)發(fā)環(huán)境程序的互移植集成開(kāi)發(fā)環(huán)境程序的互移植 ADS編譯環(huán)境下的匯編代碼與GNU編譯環(huán)境下有較多不同點(diǎn),主要是符號(hào)及偽操作的不同。第第5章章 基于基于ARM的匯編語(yǔ)言程序設(shè)計(jì)的匯

60、編語(yǔ)言程序設(shè)計(jì) 匯編語(yǔ)言與C語(yǔ)言混合編程技術(shù)匯編語(yǔ)言源程序格式匯編語(yǔ)言上機(jī)過(guò)程ARM編譯開(kāi)發(fā)環(huán)境ADS編譯環(huán)境偽操作和宏指令GNU編譯環(huán)境偽操作和宏指令匯編語(yǔ)言上機(jī)過(guò)程匯編語(yǔ)言上機(jī)過(guò)程 用用ARMARM匯編語(yǔ)言編寫的源程序,要使之運(yùn)行必須經(jīng)匯編語(yǔ)言編寫的源程序,要使之運(yùn)行必須經(jīng)過(guò)以下幾個(gè)步驟:過(guò)以下幾個(gè)步驟:1.1.編輯匯編源程序,保存為文件名后綴是編輯匯編源程序,保存為文件名后綴是“.s”.s”的的文件;文件;2.2.調(diào)用匯編程序?qū)υ闯绦蜻M(jìn)行匯編,生成目標(biāo)文件;調(diào)用匯編程序?qū)υ闯绦蜻M(jìn)行匯編,生成目標(biāo)文件;3.3.連接目標(biāo)文件,生成可以放進(jìn)連接目標(biāo)文件,生成可以放進(jìn)ARMARM軟件仿真器進(jìn)行軟件仿真器

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論