體系結(jié)構(gòu)對(duì)高級(jí)語(yǔ)言的支持_第1頁(yè)
體系結(jié)構(gòu)對(duì)高級(jí)語(yǔ)言的支持_第2頁(yè)
體系結(jié)構(gòu)對(duì)高級(jí)語(yǔ)言的支持_第3頁(yè)
體系結(jié)構(gòu)對(duì)高級(jí)語(yǔ)言的支持_第4頁(yè)
體系結(jié)構(gòu)對(duì)高級(jí)語(yǔ)言的支持_第5頁(yè)
已閱讀5頁(yè),還剩113頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

6CHAPTER體系結(jié)構(gòu)對(duì)高級(jí)語(yǔ)言的支持主要內(nèi)容1425軟件設(shè)計(jì)中的抽象數(shù)據(jù)類(lèi)型ARM浮點(diǎn)體系結(jié)構(gòu)ARM體系結(jié)構(gòu)對(duì)程序設(shè)計(jì)的支持3浮點(diǎn)數(shù)據(jù)類(lèi)型6.1軟件設(shè)計(jì)中的抽象匯編級(jí)的抽象在機(jī)器語(yǔ)言的級(jí)別上思考高級(jí)語(yǔ)言增加指令集的復(fù)雜度由編譯器完成對(duì)高層次操作的支持抽象級(jí)的不同層次6.2數(shù)據(jù)類(lèi)型計(jì)算機(jī)的數(shù)據(jù)可以用下列各項(xiàng)來(lái)表征:需要的位數(shù)位的順序位的用途數(shù)是什么?“數(shù)”不過(guò)是一個(gè)抽象的概念,每個(gè)數(shù)用一個(gè)特定的符號(hào)或狀態(tài)代表0123456789共十個(gè)符號(hào),可以表示十個(gè)數(shù)ABCDEFGHIJKLMNOPQRSTUVWXYZ共二十六個(gè)符號(hào),可以表示二十六個(gè)數(shù)世界上有六十億人,需要定義六十億個(gè)符號(hào)才能表示??用兩個(gè)符號(hào)的排列可以表示比較多的數(shù)兩個(gè)0~9的排列可以表示0~99共100個(gè)數(shù)0...9...11...33...78...99兩個(gè)A~Z的排列可以表示A~ZZ共676個(gè)數(shù)A...Z...BB...EA...MP...ZZ用更多個(gè)的符號(hào),可以表示更多的數(shù)基本符號(hào)集:少數(shù)幾個(gè)表示數(shù)的基本符號(hào)當(dāng)一個(gè)數(shù)大到不能用基本符號(hào)集表示時(shí)就用多個(gè)基本符號(hào)的排列表示進(jìn)位制解決辦法?進(jìn)位制0個(gè)符號(hào)?沒(méi)有這樣的進(jìn)位制一個(gè)符號(hào):一進(jìn)制?計(jì)算機(jī)不僅要表示數(shù),還要運(yùn)算:運(yùn)算意味著變化,只有一個(gè)符號(hào)無(wú)法表示變化一進(jìn)制在數(shù)學(xué)上不能與十進(jìn)制等價(jià)如何表示0?進(jìn)位制二個(gè)符號(hào):二進(jìn)制既可以表示數(shù),也可以表示變化數(shù)學(xué)上可以與十進(jìn)制等價(jià)計(jì)算機(jī)都用二進(jìn)制計(jì)算機(jī)使用二進(jìn)制并不意味著程序也必須使用二進(jìn)制編譯連接程序:用二進(jìn)制、十進(jìn)制、十六進(jìn)制等工資報(bào)表程序:通常用十進(jìn)制科學(xué)計(jì)算程序:可能用任意進(jìn)制進(jìn)位制及互相轉(zhuǎn)化二進(jìn)制

0,1兩個(gè)狀態(tài)易物理實(shí)現(xiàn),運(yùn)算規(guī)則簡(jiǎn)單

十進(jìn)制特點(diǎn):基數(shù)為十,逢十進(jìn)一

其它進(jìn)制八進(jìn)制和十六進(jìn)制互相轉(zhuǎn)化十二進(jìn)制的轉(zhuǎn)化十六進(jìn)制人類(lèi)的閱讀和記憶習(xí)慣“進(jìn)制”很高:可接受很大數(shù)量的符號(hào)例:漢語(yǔ)短時(shí)記憶很?。簝H可記憶幾個(gè)到十幾個(gè)字處理差異很小的符號(hào)時(shí)容易出錯(cuò)二進(jìn)制不適合人們閱讀和記憶00011001011110000000001000100110很長(zhǎng)但類(lèi)似的符號(hào),不符合人們的習(xí)慣轉(zhuǎn)換成十進(jìn)制?麻煩更簡(jiǎn)單的表示:十六進(jìn)制0x19780226十六進(jìn)制和二進(jìn)制的相互轉(zhuǎn)換1010001000110110A236需要人處理的情況多用十六進(jìn)制互相轉(zhuǎn)化(二、八、十六進(jìn)制化為十進(jìn)制

)規(guī)則:按“權(quán)”展開(kāi)

例:(1999.8)10=1X103+9X102+9X101+9X100+8X10-1

(1101.1)2=1X23+1X22+0

X21+1X20+1X2-1互相轉(zhuǎn)化(二、八、十六進(jìn)制化為十進(jìn)制

)例1:將二進(jìn)制數(shù)101.01轉(zhuǎn)換成十進(jìn)制數(shù)。

(101.1)2=1X22+0X21+1X20+1X2-1=(5.5)10

例2:將八進(jìn)制數(shù)34.6轉(zhuǎn)換成十進(jìn)制數(shù)。

(34.6)8=3

X81+4

X80+6

X8-1=(28.75)10互相轉(zhuǎn)化(二、八、十六進(jìn)制化為十進(jìn)制

)例3:將十六進(jìn)制數(shù)2AB.6轉(zhuǎn)換成十進(jìn)制數(shù)

(2AB.6)8=2X162+10X161+11X160+6X16-1

=(683.375)10互相轉(zhuǎn)化(十進(jìn)制化為二進(jìn)制

)十進(jìn)制整數(shù)化為二進(jìn)制整數(shù)規(guī)則:除二取余,直到商為零為止,倒排例:將十進(jìn)制數(shù)86轉(zhuǎn)化為二進(jìn)制

2|86 2|43……02|21……1 2|10……12|5……0 2|2……12|1……0所以,(86)10=(1010110)20……1互相轉(zhuǎn)化(十進(jìn)制化為二進(jìn)制

)十進(jìn)制小數(shù)化為二進(jìn)制小數(shù)規(guī)則:乘二取整,直到小數(shù)部分為零或給定的精度為止,順排例:將十進(jìn)制數(shù)0.875轉(zhuǎn)化為二進(jìn)制數(shù)

0.875

╳2

1.750.75

╳2

1.50.5

╳2

1.0所以(0.875)10=(0.111)2

互相轉(zhuǎn)化(十六進(jìn)制化為二進(jìn)制

)規(guī)則:每一個(gè)位十六進(jìn)制數(shù)改寫(xiě)成等值的四位二進(jìn)制數(shù),次序不變例:(3A8C.D6)16=(0011101010001100.11010110)2=

(11101010001100.1101011)2

互相轉(zhuǎn)化(二進(jìn)制化為十六進(jìn)制

)規(guī)則:每四位二進(jìn)制數(shù)改寫(xiě)成等值的一位十六進(jìn)制數(shù),次序不變例:

(11001111.01111)2

=(1100

1111.0111

1000)2

=(CF.78)16

數(shù)的范圍ARM安排32位來(lái)表示數(shù)量32位無(wú)符號(hào)整數(shù)取值范圍為:0~4294967295(10)=0~FFFFFFFF(16)如果是負(fù)數(shù)呢?又該如何表示?范圍是多少?如何表示一個(gè)有符號(hào)的整數(shù)?符號(hào)位?原碼、反碼、補(bǔ)碼?實(shí)數(shù)(浮點(diǎn)數(shù))?一般概念正整數(shù)(不帶符號(hào)的整數(shù))8位:0~255,16位:0~65535帶符號(hào)整數(shù)符號(hào)位(0:正;1:負(fù))最高位為符號(hào)位(原碼表示法)8位:-127~127,16位:-32767~+32767補(bǔ)碼機(jī)器數(shù)原碼:將整數(shù)化為二進(jìn)制數(shù),符號(hào)位置0(正數(shù))或1(負(fù)數(shù))反碼:負(fù)數(shù)的反碼:符號(hào)位為1,絕對(duì)值部分與原碼相反。負(fù)數(shù)的補(bǔ)碼表示:符號(hào)位也是“1”,其余為反碼的最低位加“1”。注意:-0與+0在補(bǔ)碼表示法中相同,而在原碼、反碼表示卻不同。相同位數(shù)的二進(jìn)制補(bǔ)碼,表示的范圍比原碼、反碼多一個(gè)。正數(shù)的原碼、反碼、補(bǔ)碼都相等,即表示方法只有一種。計(jì)算機(jī)內(nèi)符號(hào)數(shù)的補(bǔ)碼表示法 (1)引例一:鐘表調(diào)時(shí) 如圖:10點(diǎn)→6點(diǎn),可以逆時(shí)針撥,也可順時(shí)針撥: 逆撥:10–4=6(減) 順撥:10+8=18=12+6=6(加)

在順撥中,12可自然丟失,稱(chēng)為模;而8被稱(chēng)為是–4的補(bǔ)碼。

顯然鐘表采用十二進(jìn)制,系統(tǒng)所能表示的最大量程為12,稱(chēng)之為模(基)?!?=12–4=12+(–4)∴(–4)補(bǔ)=12–4=12+(–4)=8

即:(X)補(bǔ)=模+XARM微處理器中支持三種數(shù)據(jù)類(lèi)型:字節(jié)(8位有符號(hào)和無(wú)符號(hào)字節(jié))半字(16位有符號(hào)和無(wú)符號(hào)半字)字(32位有符號(hào)和無(wú)符號(hào)字)其中,字需要4字節(jié)對(duì)齊(地址的低兩位為0)、半字需要2字節(jié)對(duì)齊(地址的最低位為0)。

ASCII碼AmericanStandardCodeforInformationInterchange(美國(guó)標(biāo)準(zhǔn)信息交換碼)在計(jì)算機(jī)中,除要處理大量的數(shù)據(jù)信息外,還需處理一些字母、符號(hào),它們也要用二進(jìn)制編碼來(lái)表示。目前,普遍采用的ASCII碼用7位二進(jìn)制編碼來(lái)表示數(shù)符。共有27=128種組合狀態(tài)。它們是

52大小寫(xiě)英文字母;

10個(gè)十進(jìn)制數(shù);

7個(gè)標(biāo)點(diǎn)符號(hào);

9個(gè)運(yùn)算符號(hào);

50個(gè)其他符號(hào)。ANSICbasicdatatypesANSICbasicdatatypesSignedandunsignedcharactersofatleasteightbitsSignedandunsignedshortintegersofatleast16bitsSignedandunsignedintegersofatleast16bitsSignedandunsignedlongintegersofatleast32bitsFloating-point,doubleandlongdoublefloating-pointnumbersEnumeratedtypesBitfieldsEnumeratedtypesthesmallestintegertypewiththenecessaryrangeofvalues.BitfieldtypesimplementedwithinintegersANSICDeriveddatatypes

ANSICStandardderiveddatatypesArraysofseveralobjectsofthesametype.FunctionswhichreturnanobjectofagiventypeStructurescontainingasequenceofobjectsofvarioustypes.Pointers(whichareusuallymachineaddresses)toobjectsofagiventypeUnionswhichallowobjectsofdifferenttypestooccupythesamespaceatdifferenttimesARMpointers32botslong,similartounsignedint,butdifferentarithmeticrulesARMsupportforarray/structureBaseplusscaledindexaddressingARM對(duì)字符的支持需要注意大小端的存儲(chǔ)順序問(wèn)題6.3浮點(diǎn)數(shù)據(jù)類(lèi)型對(duì)于定點(diǎn)數(shù)據(jù)來(lái)說(shuō),用帶小數(shù)位的數(shù)字就可解決,但其范圍還是有限使用二進(jìn)制“科學(xué)表示法”例如:10.5infixedpoint1010.1bMovebinarypointtoleft1.0101bx2310.5=1.3125x8IEEE-754standardfloatingpoint32-bitsingleprecisionfloatingpoint:

★MSBissign-bit(sameasfixedpoint)★8-bitexponentinbias-127integerformat(i.e.store127+exponent)★23-bittorepresentonlythefractionalpartofthemantissa.TheMSBofthemantissaisALWAYS‘1’,thereforeitisnotstored浮點(diǎn)機(jī)器數(shù)定點(diǎn)表示:又稱(chēng)整數(shù)表示,小數(shù)點(diǎn)在數(shù)中的位置是固定不變的。浮點(diǎn)表示:又稱(chēng)實(shí)數(shù)表示,小數(shù)點(diǎn)在數(shù)中的位置是浮動(dòng)的。1位1位q位p位mfefem注:mf為尾數(shù)的符號(hào)位,ef為階碼的符號(hào)位,e為階碼的值,m為尾數(shù)的值。浮點(diǎn)數(shù)的存儲(chǔ)方式浮點(diǎn)機(jī)器數(shù)浮點(diǎn)表示法(浮點(diǎn)數(shù)):用指數(shù)(整數(shù))和尾數(shù)(純小數(shù))來(lái)表示實(shí)數(shù)的方法。浮點(diǎn)數(shù)的表示方法不唯一,長(zhǎng)度越長(zhǎng),范圍越大,精度越高。IEEE的浮點(diǎn)數(shù)標(biāo)準(zhǔn)。PC中有:16位整數(shù)、短整數(shù)(32位)、長(zhǎng)整數(shù)(64位),單精度(32位)、雙精度(64位)和擴(kuò)充精度(80位)浮點(diǎn)數(shù)。注意PC和ARM的區(qū)別!IEEE754singleprecisionrepresentationof‘1995’IEEE754doubleprecisionfloating-pointnumberformatIEEE754doubleextendedprecisionfloating-pointnumberformatIEEE754packeddecimalfloating-pointnumberformatIEEE754extendedpackeddecimalfloating-pointnumberformat6.4ARM浮點(diǎn)體系結(jié)構(gòu)Loadandstorefloatingbinaryencoding

LDC|STC{<cond>}{L}<CP#>,CRd,[Rn,<offset>]{!}Ex.LDCp1,C0,[r1]LoadandstoremultiplefloatingbinaryencodingLDC指令LDC指令的格式為:

LDC{條件}{L}協(xié)處理器編碼,目的寄存器,[源寄存器]LDC指令用于將源寄存器所指向的一系列連續(xù)的存儲(chǔ)單元中的字?jǐn)?shù)據(jù)傳送到協(xié)處理器的寄存器中,若協(xié)處理器不能成功完成傳送操作,則產(chǎn)生未定義指令異常。其中,{L}選項(xiàng)表示指令為長(zhǎng)讀取操作,如用于雙精度數(shù)據(jù)的傳輸。指令示例:

LDC

P3,C4,[R0]

;將ARM處理器的寄存器R0所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到協(xié)處理器P3的寄存器C4中。指令操作的偽代碼:

STC指令STC指令的格式為:

STC{條件}{L}協(xié)處理器編碼,源寄存器,[目的寄存器]STC指令用于將協(xié)處理器中的寄存器中的字?jǐn)?shù)據(jù)傳送到目的寄存器所指向一系列連續(xù)的存儲(chǔ)單元中,若協(xié)處理器不能成功完成傳送操作,則產(chǎn)生未定義指令異常。其中,{L}選項(xiàng)表示指令為長(zhǎng)讀取操作,如用于雙精度數(shù)據(jù)的傳輸。指令示例:

STC

P3,C4,[R0]

;將協(xié)處理器P3的寄存器C4中的字 數(shù)據(jù)傳送到ARM處理器的寄存器R0所指向的存儲(chǔ)器中。指令操作的偽代碼:Floating-pointdataprocessingbinaryencoding

CDP{<cond>}<CP#>,<Cop1>,Crd,Crn,CRm{,<Cop2>}Ex.CDPp1,3,C0,C1,C21、CDP指令CDP指令的格式為:

CDP{條件}協(xié)處理器編碼,協(xié)處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協(xié)處理器操作碼2CDP指令用于ARM處理器通知ARM協(xié)處理器執(zhí)行特定的操作,若協(xié)處理器不能成功完成特定的操作,則產(chǎn)生未定義指令異常。其中協(xié)處理器操作碼1和協(xié)處理器操作碼2為協(xié)處理器將要執(zhí)行的操作,目的寄存器和源寄存器均為協(xié)處理器的寄存器,指令不涉及ARM處理器的寄存器和存儲(chǔ)器。指令示例:

CDP

P3,2,C12,C10,C3,4

;該指令完成協(xié)處理器P3的初始化指令操作的偽代碼:Floating-pointregistertransferbinaryencodingMCR指令MCR指令的格式為:

MCR{條件}協(xié)處理器編碼,協(xié)處理器操作碼1,源寄存器,目的寄存器1,目的寄存器2,協(xié)處理器操作碼2MCR指令用于將ARM處理器寄存器中的數(shù)據(jù)傳送到協(xié)處理器寄存器中,若協(xié)處理器不能成功完成操作,則產(chǎn)生未定義指令異常。其中協(xié)處理器操作碼1和協(xié)處理器操作碼2為協(xié)處理器將要執(zhí)行的操作,源寄存器為ARM處理器的寄存器,目的寄存器1和目的寄存器2均為協(xié)處理器的寄存器。指令示例:

MCR

P3,3,R0,C4,C5,6

;該指令將ARM處理器寄存器R0中的數(shù)據(jù)傳送到協(xié)處理器P3的寄存器C4和C5中。

指令操作的偽代碼:MRC指令MRC指令的格式為:MRC{條件}協(xié)處理器編碼,協(xié)處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協(xié)處理器操作碼2MRC指令用于將協(xié)處理器寄存器中的數(shù)據(jù)傳送到ARM處理器寄存器中,若協(xié)處理器不能成功完成操作,則產(chǎn)生未定義指令異常。其中協(xié)處理器操作碼1和協(xié)處理器操作碼2為協(xié)處理器將要執(zhí)行的操作,目的寄存器為ARM處理器的寄存器,源寄存器1和源寄存器2均為協(xié)處理器的寄存器。指令示例:

MRC

P3,3,R0,C4,C5,6

;該指令將協(xié)處理器P3的寄存器中的數(shù)據(jù)傳送到ARM處理器寄存器中。指令操作的偽代碼:Floating-pointinstructionfrequenciesFPA10internalorganizationVFP10

Amuchhigherperformancefloating-pointunit,theVFP10,hasbeendesignedtooperatewiththeARM10TDMIprocessorcore(seeSection12.6onpage288).TheVFP10supportsadifferentfloating-pointinstructionsetfromtheFPA10thatincludessupportforvectorfloating-pointoperations.6.5表達(dá)式訪問(wèn)操作數(shù)通過(guò)寄存器傳送的參數(shù)通過(guò)堆棧傳遞的參數(shù)文字池中的常量局部變量全局變量指針運(yùn)算數(shù)組符號(hào)定義(SymbolDefinition)偽指令

符號(hào)定義偽指令用于定義ARM匯編程序中的變量、對(duì)變量賦值以及定義寄存器的別名等操作。常見(jiàn)的符號(hào)定義偽指令有如下幾種:用于定義全局變量的GBLA、GBLL和GBLS。用于定義局部變量的LCLA、LCLL和LCLS。用于對(duì)變量賦值的SETA、SETL、SETS。為通用寄存器列表定義名稱(chēng)的RLIST。1.GBLA、GBLL和GBLS語(yǔ)法格式:

GBLA(GBLL或GBLS) 全局變量名GBLA、GBLL和GBLS偽指令用于定義一個(gè)ARM程序中的全局變量,并將其初始化。其中:GBLA偽指令用于定義一個(gè)全局的數(shù)字變量,并初始化為0;GBLL偽指令用于定義一個(gè)全局的邏輯變量,并初始化為F(假);GBLS偽指令用于定義一個(gè)全局的字符串變量,并初始化為空;由于以上三條偽指令用于定義全局變量,因此在整個(gè)程序范圍內(nèi)變量名必須唯一。使用示例:

GBLA Test1 ;定義一個(gè)全局的數(shù)字變量,

;變量名為T(mén)est1 Test1 SETA 0xaa ;將該變量賦值為0xaa GBLL Test2 ;定義一個(gè)全局的邏輯變量,

;變量名為T(mén)est2 Test2 SETL {TRUE};將該變量賦值為真

GBLS Test3 ;定義一個(gè)全局的字符串變量,

;變量名為T(mén)est3 Test3 SETS “Testing”;將該變量賦值為“Testing”2.LCLA、LCLL和LCLS語(yǔ)法格式:

LCLA(LCLL或LCLS) 局部變量名LCLA、LCLL和LCLS偽指令用于定義一個(gè)ARM程序中的局部變量,并將其初始化。其中:LCLA偽指令用于定義一個(gè)局部的數(shù)字變量,并初始化為0;LCLL偽指令用于定義一個(gè)局部的邏輯變量,并初始化為F(假);LCLS偽指令用于定義一個(gè)局部的字符串變量,并初始化為空;以上三條偽指令用于聲明局部變量,在其作用范圍內(nèi)變量名必須唯一。使用示例:

LCLA Test4 ;聲明一個(gè)局部的數(shù)字變量,

;變量名為T(mén)est4 Test3 SETA 0xaa ;將該變量賦值為0xaa LCLL Test5 ;聲明一個(gè)局部的邏輯變量,

;變量名為T(mén)est5 Test4 SETL {TRUE};將該變量賦值為真

LCLS Test6 ;定義一個(gè)局部的字符串變量,

;變量名為T(mén)est6 Test6 SETS “Testing”;將該變量賦值為“Testing”3.SETA、SETL和SETS語(yǔ)法格式:

變量名SETA(SETL或SETS)表達(dá)式偽指令SETA、SETL、SETS用于給一個(gè)已經(jīng)定義的全局變量或局部變量賦值。SETA偽指令用于給一個(gè)數(shù)學(xué)變量賦值;SETL偽指令用于給一個(gè)邏輯變量賦值;SETS偽指令用于給一個(gè)字符串變量賦值;其中,變量名為已經(jīng)定義過(guò)的全局變量或局部變量,表達(dá)式為將要賦給變量的值。使用示例:

LCLA Test3 ;聲明一個(gè)局部的數(shù)字變量,

;變量名為T(mén)est3 Test3 SETA 0xaa ;將該變量賦值為0xaa LCLL Test4;聲明一個(gè)局部的邏輯變量,

;變量名為T(mén)est4 Test4 SETL {TRUE};將該變量賦值為真

LCLS Test6 ;定義一個(gè)局部的字符串變量, ;變量名為T(mén)est6 Test5 SETS “Testing”;將該變量賦值為“Testing”4.RLIST語(yǔ)法格式:

名稱(chēng) RLIST{寄存器列表}RLIST偽指令可用于對(duì)一個(gè)通用寄存器列表定義名稱(chēng),使用該偽指令定義的名稱(chēng)可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器訪問(wèn)次序?yàn)楦鶕?jù)寄存器的編號(hào)由低到高,而與列表中的寄存器排列次序無(wú)關(guān)。 使用示例:

RegListRLIST{R0-R5,R8,R10} ;將寄存器列表名稱(chēng)定義為RegList,

;可在ARM指令LDM/STM中通過(guò)

;該名稱(chēng)訪問(wèn)寄存器列表。數(shù)據(jù)定義(DataDefinition)偽指令 數(shù)據(jù)定義偽指令一般用于為特定的數(shù)據(jù)分配存儲(chǔ)單元,同時(shí)可完成已分配存儲(chǔ)單元的初始化。常見(jiàn)的數(shù)據(jù)定義偽指令有如下幾種:DCB 用于分配一片連續(xù)的字節(jié)存儲(chǔ)單元并用指定 的數(shù)據(jù)初始化。DCW(DCWU)用于分配一片連續(xù)的半字存儲(chǔ)單元并用指定的 數(shù)據(jù)初始化。DCD(DCDU) 用于分配一片連續(xù)的字存儲(chǔ)單元并用指定的數(shù) 據(jù)初始化。DCFD(DCFDU)用于為雙精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存 儲(chǔ)單元并用指定的數(shù)據(jù)初始化。DCFS(DCFSU)用于為單精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存 儲(chǔ)單元并用指定的數(shù)據(jù)初始化。DCQ(DCQU)用于分配一片以8字節(jié)為單位的連續(xù)的存儲(chǔ)單元 并用指定的數(shù)據(jù)初始化。SPACE 用于分配一片連續(xù)的存儲(chǔ)單元MAP 用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表首地址FIELD 用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)域1.DCB語(yǔ)法格式:

標(biāo)號(hào) DCB 表達(dá)式{,表達(dá)式}……DCB偽指令用于分配一片連續(xù)的字節(jié)存儲(chǔ)單元并用偽指令中指定的表達(dá)式初始化。其中,表達(dá)式可以為0~255的數(shù)字或字符串。DCB也可用“=”代替。使用示例:

string DCB “Thisisatest!”

string = “Thisisatest!”

;分配一片連續(xù)的字節(jié)存儲(chǔ)單元并初始化。2.DCW(或DCWU)語(yǔ)法格式:

標(biāo)號(hào) DCW(或DCWU) 表達(dá)式{,表達(dá)式}…..DCW(或DCWU)偽指令用于分配一片連續(xù)的半字存儲(chǔ)單元并用偽指令中指定的表達(dá)式初始化。其中,表達(dá)式可以為程序標(biāo)號(hào)或數(shù)字表達(dá)式。用DCW分配的字存儲(chǔ)單元是半字對(duì)齊的,而用DCWU分配的字存儲(chǔ)單元并不嚴(yán)格半字對(duì)齊。使用示例:

DataTest DCW 1,2,3 ;分配一片連續(xù)的半字存儲(chǔ)單元并初始化。3.DCD(或DCDU)語(yǔ)法格式:

標(biāo)號(hào)DCD(或DCDU) 表達(dá)式{,表達(dá)式}…..DCD(或DCDU)偽指令用于分配一片連續(xù)的字存儲(chǔ)單元并用偽指令中指定的表達(dá)式初始化。其中,表達(dá)式可以為程序標(biāo)號(hào)或數(shù)字表達(dá)式。DCD也可用“&”代替。用DCD分配的字存儲(chǔ)單元是字對(duì)齊的,而用DCDU分配的字存儲(chǔ)單元并不嚴(yán)格字對(duì)齊。使用示例:

DataTest DCD 4,5,6

DataTest & 4,5,6 ;分配一片連續(xù)的字存儲(chǔ)單元并初始化。4.DCFD(或DCFDU)語(yǔ)法格式:

標(biāo)號(hào) DCFD(或DCFDU)表達(dá)式{,表達(dá)式}…..DCFD(或DCFDU)偽指令用于為雙精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元并用偽指令中指定的表達(dá)式初始化。每個(gè)雙精度的浮點(diǎn)數(shù)占據(jù)兩個(gè)字單元。用DCFD分配的字存儲(chǔ)單元是字對(duì)齊的,而用DCFDU分配的字存儲(chǔ)單元并不嚴(yán)格字對(duì)齊。使用示例:

FDataTest DCFD 2E115,-5E7 ;分配一片連續(xù)的字存儲(chǔ)單元并初始化為指定的雙精度數(shù)。5.DCFS(或DCFSU)語(yǔ)法格式:

標(biāo)號(hào) DCFS(或DCFSU)表達(dá)式{,表達(dá)式}…..DCFS(或DCFSU)偽指令用于為單精度的浮點(diǎn)數(shù)分配一片連續(xù)的字存儲(chǔ)單元并用偽指令中指定的表達(dá)式初始化。每個(gè)單精度的浮點(diǎn)數(shù)占據(jù)一個(gè)字單元。用DCFS分配的字存儲(chǔ)單元是字對(duì)齊的,而用DCFSU分配的字存儲(chǔ)單元并不嚴(yán)格字對(duì)齊。使用示例:

FDataTest DCFS 2E5,-5E-7 ;分配一片連續(xù)的字存儲(chǔ)單元并初始化為指定的單精度數(shù)。6.DCQ(或DCQU)語(yǔ)法格式:

標(biāo)號(hào) DCQ(或DCQU) 表達(dá)式{,表達(dá)式}…..DCQ(或DCQU)偽指令用于分配一片以8個(gè)字節(jié)為單位的連續(xù)存儲(chǔ)區(qū)域并用偽指令中指定的表達(dá)式初始化。用DCQ分配的存儲(chǔ)單元是字對(duì)齊的,而用DCQU分配的存儲(chǔ)單元并不嚴(yán)格字對(duì)齊。使用示例:

DataTest DCQ 100 ;分配一片連續(xù)的存儲(chǔ)單元并初始化為指定的值。7.SPACE語(yǔ)法格式:

標(biāo)號(hào) SPACE 表達(dá)式SPACE偽指令用于分配一片連續(xù)的存儲(chǔ)區(qū)域并初始化為0。其中,表達(dá)式為要分配的字節(jié)數(shù)。SPACE也可用“%”代替。使用示例:

DataSpace SPACE 100

DataSpace % 100 ;分配連續(xù)100字節(jié)的存儲(chǔ)單元并初始化為0。8.MAP語(yǔ)法格式:

MAP 表達(dá)式{,基址寄存器}MAP偽指令用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的首地址。MAP也可用“^”代替。表達(dá)式可以為程序中的標(biāo)號(hào)或數(shù)學(xué)表達(dá)式,基址寄存器為可選項(xiàng)。當(dāng)基址寄存器選項(xiàng)不存在時(shí),表達(dá)式的值即為內(nèi)存表的首地址;當(dāng)該選項(xiàng)存在時(shí),內(nèi)存表的首地址為表達(dá)式的值與基址寄存器的和。MAP偽指令通常與FIELD偽指令配合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存表。使用示例:

MAP 0x100,R0 ^ 0x100,R0 ;定義結(jié)構(gòu)化內(nèi)存表首地址的值為0x100+R0。9.FILED語(yǔ)法格式:

標(biāo)號(hào) FIELD 表達(dá)式FIELD偽指令用于定義一個(gè)結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域。FILED也可用“#”代替。表達(dá)式的值為當(dāng)前數(shù)據(jù)域在內(nèi)存表中所占的字節(jié)數(shù)。FIELD偽指令常與MAP偽指令配合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存表。MAP偽指令定義內(nèi)存表的首地址,F(xiàn)IELD偽指令定義內(nèi)存表中的各個(gè)數(shù)據(jù)域,并可以為每個(gè)數(shù)據(jù)域指定一個(gè)標(biāo)號(hào)供其他的指令引用。注意MAP和FIELD偽指令僅用于定義數(shù)據(jù)結(jié)構(gòu),并不實(shí)際分配存儲(chǔ)單元。使用示例:

MAP 0x100 ;定義結(jié)構(gòu)化內(nèi)存表首地址的值為0x100。

A FIELD 16;定義A的長(zhǎng)度為16字節(jié),位置為0x100 B # 32;定義B的長(zhǎng)度為32字節(jié),位置為0x110 S FIELD 256;定義S的長(zhǎng)度為256字節(jié),位置為0x130舉例1.鏈表操作在鏈表中搜索與某一個(gè)數(shù)據(jù)相等的元素。鏈表中的每個(gè)元素包括兩個(gè)字,第一個(gè)字中包含一個(gè)字節(jié)數(shù)據(jù);第二個(gè)字中包含指向下一個(gè)鏈表元素的指令,當(dāng)這個(gè)指針為0時(shí)表示鏈表結(jié)束。llsearch CMPR0,#0 ;R0是nextpointer LDRNEBR2,[R0] CMPNER1,R2 ;R1存放要搜索的數(shù)據(jù)

LDRNER0,[R0,#4] BNEllsearch MOVPC,LR2.簡(jiǎn)單的串比較比較兩個(gè)串的大小:R0指向第一個(gè)串,R1指向第二個(gè)串。strcmp LDRBR2,[R0],#1 ;注意字符尋址的偏移量

LDRBR3,[R1],#1 CMPR2,#0 CMPNER3,#0 BEQreturn CMPR2,R3 BEQstrcmpreturn SUBR0,R2,R3 ;比較兩字符的大小

MOVPC,LR6.6條件語(yǔ)句if…elseif(a>b)c=a;elsec=b;CMPr0,r1;if(a>b)MOVGTr2,r0;..c=a..MOVLEr2,r1;..elsec=bif(a>b){A;B;C;}else{D;E;}CMPr0,r1BLEELSEAssemblyforA;B;C:BENDIFELSEAssemblyforD;E;ENDIF條件執(zhí)行-最大公約數(shù)最大公約數(shù)C語(yǔ)言代碼:int

gcd(inta,intb){while(a!=b) if(a>b) a=a-b; else b=b-a;returna;}最大公約數(shù)ARM匯編代碼:gcd

cmpr0,r1 ;reachedtheend?

beqstop

bltless ;ifr0>r1 subr0,r0,r1 ;subtractr1fromr0 bgcdless subr1,r1,r0 ;subtractr0fromr1 bgcdstop ;……最大公約數(shù)ARM匯編代碼(條件執(zhí)行):代碼執(zhí)行前r0中存放a,r1中存放b;代碼執(zhí)行后r0中存放a和b的最大公約數(shù):gcd CMPR0,R1 SUBGTR0,R0,R1 SUBLTR1,R1,R0 BNEgcd MOVPC,LRgcd

cmpr0,r1

beqstop

bltless subr0,r0,r1 bgcdless subr1,r1,r0 bgcdstop ;……條件判斷語(yǔ)句(C語(yǔ)言代碼)

if(a==0||b==1) c=d+e;代碼執(zhí)行前r0中存放a,r1中存放b;代碼執(zhí)行后r2中存放d和e的和:

CMPR0,#0 CMPNER1,#1 ADDEQR2,R3,R4注意:兩個(gè)條件按順序進(jìn)行判斷,如果第一個(gè)條件不成立,則后面的條件無(wú)需進(jìn)行判斷。switchesswitch(expression){caseconstant-expression1:statementS1;caseconstant-expression2:statementS2;…caseconstant-expression3:statementSn;default:statementSD};rocontainsvalueofexpression代碼根據(jù)maxindex的不同值跳轉(zhuǎn)不同的代碼段,這里要求各目標(biāo)代碼段的大小都為2RoutineSizeLog2:ADRr1,JUMPTABLECMPr0,#TABLEMAX;LDRLSpc,[r1,r0,LSL#2];;statementSDBEXITL1…;statementsS1BEXIT…LN…;statementSNEXIT…6.7循環(huán)語(yǔ)句對(duì)于一個(gè)for或while循環(huán):

MOVR0,#loopcount;初始化計(jì)數(shù)器loop ;…… SUBSR0,R0,#1 ;計(jì)數(shù)器的更新及CPSR的更新

BNEloop ;……注意:此時(shí)SUB指令必需帶后綴S。

forloopsfor(i=0;i<10;i++){a[i]=0;}MOVr1,#0;valuetostoreina[i]ADRr2,a[0];r2pointstoa[0]MOVr0,#0;i=0LOOPCMPr0,#10;i<10?BGEEXIT;ifi>=10finishSTRr1,[r2,r0,LSL#2];a[i]=0ADDr0,r0,#1;i++BLOOPEXIT….whileloopswhile(e1){…}(version1)LOOP…;evaluateexpressionBEQEXIT….;loopbodyBLOOPEXIT….

(version2)BTESTLOOP…;loopbodyTEST…;evaluateexpressionBNELOOPEXIT….(version3)…;evaluateexpressionBEQEXIT;skiploopifnecessaryLOOP…;loopbodyTEST…;evaluateexpressionBNELOOPEXIT…

do…whileloopsdo{…}while(e1)LOOP…;loopbody…;evaluateexpressionBNELOOPEXIT….

6.7函數(shù)與過(guò)程Typicalhierarchicalprogramstructure1.子程序調(diào)用BL指令在指令跳轉(zhuǎn)操作的同時(shí)保存當(dāng)前PC寄存器值,用于從被調(diào)用的子程序中返回。

;…… BLfunction_name SUBR2,R1,R0 ;……function_name ;…… MOVPC,LR當(dāng)前PC值是多少?注意:B與BL指令的區(qū)別。2.子程序進(jìn)入和退出時(shí)數(shù)據(jù)的保存和恢復(fù)在調(diào)用子程序時(shí),通常利用寄存器r0-r3傳遞參數(shù)和返回結(jié)果,這幾個(gè)參數(shù)由子程序的調(diào)用者來(lái)保存,其他的子程序?qū)⒁玫降募拇嫫髟谧映绦蛉肟谔幈4?,在子程序返回前恢?fù)這些寄存器。function STMFDR13!,{R4-R12,R14} ;函數(shù)入口

;…… ;functionbody ;…… LDMFDR13!,{R4-R12,PC} ;函數(shù)出口ATPCS概述ATPCS規(guī)定了一些ARM程序和Thumb程序中子程序間調(diào)用的基本規(guī)則,包括子程序調(diào)用過(guò)程中寄存器的使用規(guī)則,數(shù)據(jù)棧的使用規(guī)則,參數(shù)的傳遞規(guī)則。支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS支持只讀段位置無(wú)關(guān)(ROPI)的ATPCS支持可讀寫(xiě)段位置無(wú)關(guān)(RWPI)的ATPCS支持ARM程序和Thumb程序混合使用的ATPCS處理浮點(diǎn)運(yùn)算的ATPCS使用ADS的C語(yǔ)言編譯器編譯的C語(yǔ)言子程序滿足用戶(hù)指定的ATPCS類(lèi)型,匯編子程序必須滿足下面3個(gè)條件:在子程序編寫(xiě)時(shí)必須遵守相應(yīng)的ATPCS規(guī)則數(shù)據(jù)棧的使用要遵守相應(yīng)的ATPCS規(guī)則在匯編編譯器中使用-apcs選項(xiàng)基本ATPCS基本ATPCS規(guī)定了在子程序調(diào)用時(shí)的一些基本規(guī)則,支持:各寄存器的使用規(guī)則及其相應(yīng)的名稱(chēng)數(shù)據(jù)棧的使用規(guī)則參數(shù)傳遞的規(guī)則不支持ARM程序和Thumb程序相互調(diào)用數(shù)據(jù)以及代碼的位置無(wú)關(guān)的支持子程序的可重入性數(shù)據(jù)棧檢查的支持寄存器的使用規(guī)則子程序間通過(guò)寄存器r0-r3來(lái)傳遞參數(shù)在子程序中,使用寄存器r4-r11來(lái)保存局部變量寄存器r12用作子程序間scratch寄存器,記作ip寄存器r13用作數(shù)據(jù)棧指針,記作sp寄存器r14用作連接寄存器,記作lr寄存器r15用作程序計(jì)數(shù)器,記作pc

表6.1ATPCS中各寄存器的使用規(guī)則及其名稱(chēng)寄存器別名特殊名稱(chēng)使用規(guī)則R15pc程序計(jì)數(shù)器R14lr連接寄存器R13sp數(shù)據(jù)棧指針R12ip子程序內(nèi)部調(diào)用的scratch寄存器R11V8ARM狀態(tài)局部變量寄存器8R10V7slARM狀態(tài)局部變量寄存器7,在支持?jǐn)?shù)據(jù)棧檢查的ATPCS中為數(shù)據(jù)棧限制指針R9V6sbARM狀態(tài)局部變量寄存器6,在支持RWPI的ATPCS中為靜態(tài)基址寄存器R8V5ARM狀態(tài)局部變量寄存器5R7V4wr局部變量寄存器4,Thumb狀態(tài)工作寄存器R6V3局部變量寄存器3R5V2局部變量寄存器2R4V1局部變量寄存器1R3A4參數(shù)/結(jié)果/scratch寄存器4R2A3參數(shù)/結(jié)果/scratch寄存器3R1A2參數(shù)/結(jié)果/scratch寄存器2R0A1參數(shù)/結(jié)果/scratch寄存器1數(shù)據(jù)棧使用規(guī)則棧指針可以指向不同的位置,數(shù)據(jù)棧的增長(zhǎng)方向也可以不同,有4種數(shù)據(jù)棧:FDFullDescendingEDEmptyDescendingFAFullAscendingEAEmptyAscendingATPCS規(guī)定數(shù)據(jù)棧為FD類(lèi)型,并且對(duì)數(shù)據(jù)棧的操作是8字節(jié)對(duì)齊的。數(shù)據(jù)棧的名詞數(shù)據(jù)棧棧指針stackpointer數(shù)據(jù)棧的基地址stackbase數(shù)據(jù)棧界限stacklimit已占用的數(shù)據(jù)棧usedstack未占用的數(shù)據(jù)棧unusedstack數(shù)據(jù)棧中的數(shù)據(jù)幀stackframes6.2.3參數(shù)傳遞規(guī)則1、子程序參數(shù)傳遞規(guī)則對(duì)于參數(shù)個(gè)數(shù)可變的子程序,當(dāng)參數(shù)不超過(guò)4個(gè)時(shí),可以使用寄存器r0-r3來(lái)傳遞參數(shù)當(dāng)參數(shù)超過(guò)4個(gè)時(shí),可以使用數(shù)據(jù)棧來(lái)傳遞參數(shù)在參數(shù)傳遞時(shí),將所有參數(shù)看作時(shí)存放在連續(xù)的內(nèi)存字單元中的字?jǐn)?shù)據(jù),然后,依次將各字?jǐn)?shù)據(jù)傳送到寄存器r0、r1、r2、r3中,如果參數(shù)多于4個(gè),將剩余的字?jǐn)?shù)據(jù)傳送到數(shù)據(jù)棧中,入棧的順序與參數(shù)順序相反,即最后一個(gè)字?jǐn)?shù)據(jù)先入棧.對(duì)于浮點(diǎn)參數(shù)遵守:第一個(gè)整數(shù)參數(shù)通過(guò)寄存器r0-r3來(lái)傳遞,其它參數(shù)通過(guò)數(shù)據(jù)棧傳遞。參數(shù)傳遞開(kāi)始四個(gè)字大小的參數(shù)直接使用寄存器的R0-R3來(lái)傳遞(快速且高效的)更多的信息可參看ATPCS如果需要更多的參數(shù),將使用堆棧。(需要額外的指令和慢速的存儲(chǔ)器操作)

所以通常限制參數(shù)的個(gè)數(shù),使它為4或更少。如果不可避免,把常用的參數(shù)前4個(gè)放在R0-R3中ParameterPassing(4parameters)intfunc1(inta,intb,

intc,intd){returna+b+c+d;}intcaller1(void){returnfunc1(1,2,3,4);}func10x000000:ADDr0,r0,r10x000004:ADDr0,r0,r20x000008:ADDr0,r0,r30x00000c:MOVpc,lr

caller10x000014:MOVr3,#40x000018:MOVr2,#30x00001c:MOVr1,#20x000020:MOVr0,#10x000024:BLfunc1ParameterPassing(4parameters)ParameterPassing(6parameters)ParameterPassing(6parameters)func20x000000:STRlr,[sp,#-4]!0x000004:ADDr0,r0,r10x000008:ADDr0,r0,r20x00000C:ADDr0,r0,r30x000010:LDMIBsp,{r12,r14}0x000014:ADD

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論