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

下載本文檔

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

文檔簡介

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

0,1兩個狀態(tài)易物理實現(xiàn),運算規(guī)則簡單

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

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

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

例:(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ī)則:每一個位十六進(jìn)制數(shù)改寫成等值的四位二進(jìn)制數(shù),次序不變例:(3A8C.D6)16=(0011101010001100.11010110)2=

(11101010001100.1101011)2

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

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

(11001111.01111)2

=(1100

1111.0111

1000)2

=(CF.78)16

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

在順撥中,12可自然丟失,稱為模;而8被稱為是–4的補碼。

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

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

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

52大小寫英文字母;

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

7個標(biāo)點符號;

9個運算符號;

50個其他符號。ANSICbasicdatatypesANSICbasicdatatypesSignedandunsignedcharactersofatleasteightbitsSignedandunsignedshortintegersofatleast16bitsSignedandunsignedintegersofatleast16bitsSignedandunsignedlongintegersofatleast32bitsFloating-point,doubleandlongdoublefloating-pointnumbersEnumeratedtypesBitfieldsEnumeratedtypesthesmallestintegertypewiththenecessaryrangeofvalues.BitfieldtypesimplementedwithinintegersANSICDeriveddatatypes

ANSICStandardderiveddatatypesArraysofseveralobjectsofthesametype.FunctionswhichreturnanobjectofagiventypeStructurescontainingasequenceofobjectsofvarioustypes.Pointers(whichareusuallymachineaddresses)toobjectsofagiventypeUnionswhichallowobjectsofdifferenttypestooccupythesamespaceatdifferenttimesARMpointers32botslong,similartounsignedint,butdifferentarithmeticrulesARMsupportforarray/structureBaseplusscaledindexaddressingARM對字符的支持需要注意大小端的存儲順序問題6.3浮點數(shù)據(jù)類型對于定點數(shù)據(jù)來說,用帶小數(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浮點機器數(shù)定點表示:又稱整數(shù)表示,小數(shù)點在數(shù)中的位置是固定不變的。浮點表示:又稱實數(shù)表示,小數(shù)點在數(shù)中的位置是浮動的。1位1位q位p位mfefem注:mf為尾數(shù)的符號位,ef為階碼的符號位,e為階碼的值,m為尾數(shù)的值。浮點數(shù)的存儲方式浮點機器數(shù)浮點表示法(浮點數(shù)):用指數(shù)(整數(shù))和尾數(shù)(純小數(shù))來表示實數(shù)的方法。浮點數(shù)的表示方法不唯一,長度越長,范圍越大,精度越高。IEEE的浮點數(shù)標(biāo)準(zhǔn)。PC中有:16位整數(shù)、短整數(shù)(32位)、長整數(shù)(64位),單精度(32位)、雙精度(64位)和擴充精度(80位)浮點數(shù)。注意PC和ARM的區(qū)別!IEEE754singleprecisionrepresentationof‘1995’IEEE754doubleprecisionfloating-pointnumberformatIEEE754doubleextendedprecisionfloating-pointnumberformatIEEE754packeddecimalfloating-pointnumberformatIEEE754extendedpackeddecimalfloating-pointnumberformat6.4ARM浮點體系結(jié)構(gòu)Loadandstorefloatingbinaryencoding

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

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

LDC

P3,C4,[R0]

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

STC指令STC指令的格式為:

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

STC

P3,C4,[R0]

;將協(xié)處理器P3的寄存器C4中的字 數(shù)據(jù)傳送到ARM處理器的寄存器R0所指向的存儲器中。指令操作的偽代碼: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處理器的寄存器和存儲器。指令示例:

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á)式訪問操作數(shù)通過寄存器傳送的參數(shù)通過堆棧傳遞的參數(shù)文字池中的常量局部變量全局變量指針運算數(shù)組符號定義(SymbolDefinition)偽指令

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

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

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

;變量名為Test1 Test1 SETA 0xaa ;將該變量賦值為0xaa GBLL Test2 ;定義一個全局的邏輯變量,

;變量名為Test2 Test2 SETL {TRUE};將該變量賦值為真

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

;變量名為Test3 Test3 SETS “Testing”;將該變量賦值為“Testing”2.LCLA、LCLL和LCLS語法格式:

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

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

;變量名為Test4 Test3 SETA 0xaa ;將該變量賦值為0xaa LCLL Test5 ;聲明一個局部的邏輯變量,

;變量名為Test5 Test4 SETL {TRUE};將該變量賦值為真

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

;變量名為Test6 Test6 SETS “Testing”;將該變量賦值為“Testing”3.SETA、SETL和SETS語法格式:

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

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

;變量名為Test3 Test3 SETA 0xaa ;將該變量賦值為0xaa LCLL Test4;聲明一個局部的邏輯變量,

;變量名為Test4 Test4 SETL {TRUE};將該變量賦值為真

LCLS Test6 ;定義一個局部的字符串變量, ;變量名為Test6 Test5 SETS “Testing”;將該變量賦值為“Testing”4.RLIST語法格式:

名稱 RLIST{寄存器列表}RLIST偽指令可用于對一個通用寄存器列表定義名稱,使用該偽指令定義的名稱可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器訪問次序為根據(jù)寄存器的編號由低到高,而與列表中的寄存器排列次序無關(guān)。 使用示例:

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

;可在ARM指令LDM/STM中通過

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

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

string DCB “Thisisatest!”

string = “Thisisatest!”

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

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

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

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

DataTest DCD 4,5,6

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

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

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

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

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

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

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

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

DataSpace SPACE 100

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

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

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

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

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

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

LDRNER0,[R0,#4] BNEllsearch MOVPC,LR2.簡單的串比較比較兩個串的大?。篟0指向第一個串,R1指向第二個串。strcmp LDRBR2,[R0],#1 ;注意字符尋址的偏移量

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

MOVPC,LR6.6條件語句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語言代碼: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 ;……條件判斷語句(C語言代碼)

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

CMPR0,#0 CMPNER1,#1 ADDEQR2,R3,R4注意:兩個條件按順序進(jìn)行判斷,如果第一個條件不成立,則后面的條件無需進(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)語句對于一個for或while循環(huán):

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

BNEloop ;……注意:此時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ù)與過程Typicalhierarchicalprogramstructure1.子程序調(diào)用BL指令在指令跳轉(zhuǎn)操作的同時保存當(dāng)前PC寄存器值,用于從被調(diào)用的子程序中返回。

;…… BLfunction_name SUBR2,R1,R0 ;……function_name ;…… MOVPC,LR當(dāng)前PC值是多少?注意:B與BL指令的區(qū)別。2.子程序進(jìn)入和退出時數(shù)據(jù)的保存和恢復(fù)在調(diào)用子程序時,通常利用寄存器r0-r3傳遞參數(shù)和返回結(jié)果,這幾個參數(shù)由子程序的調(diào)用者來保存,其他的子程序?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ī)則,數(shù)據(jù)棧的使用規(guī)則,參數(shù)的傳遞規(guī)則。支持?jǐn)?shù)據(jù)棧限制檢查的ATPCS支持只讀段位置無關(guān)(ROPI)的ATPCS支持可讀寫段位置無關(guān)(RWPI)的ATPCS支持ARM程序和Thumb程序混合使用的ATPCS處理浮點運算的ATPCS使用ADS的C語言編譯器編譯的C語言子程序滿足用戶指定的ATPCS類型,匯編子程序必須滿足下面3個條件:在子程序編寫時必須遵守相應(yīng)的ATPCS規(guī)則數(shù)據(jù)棧的使用要遵守相應(yīng)的ATPCS規(guī)則在匯編編譯器中使用-apcs選項基本ATPCS基本ATPCS規(guī)定了在子程序調(diào)用時的一些基本規(guī)則,支持:各寄存器的使用規(guī)則及其相應(yīng)的名稱數(shù)據(jù)棧的使用規(guī)則參數(shù)傳遞的規(guī)則不支持ARM程序和Thumb程序相互調(diào)用數(shù)據(jù)以及代碼的位置無關(guān)的支持子程序的可重入性數(shù)據(jù)棧檢查的支持寄存器的使用規(guī)則子程序間通過寄存器r0-r3來傳遞參數(shù)在子程序中,使用寄存器r4-r11來保存局部變量寄存器r12用作子程序間scratch寄存器,記作ip寄存器r13用作數(shù)據(jù)棧指針,記作sp寄存器r14用作連接寄存器,記作lr寄存器r15用作程序計數(shù)器,記作pc

表6.1ATPCS中各寄存器的使用規(guī)則及其名稱寄存器別名特殊名稱使用規(guī)則R15pc程序計數(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ù)棧的增長方向也可以不同,有4種數(shù)據(jù)棧:FDFullDescendingEDEmptyDescendingFAFullAscendingEAEmptyAscendingATPCS規(guī)定數(shù)據(jù)棧為FD類型,并且對數(shù)據(jù)棧的操作是8字節(jié)對齊的。數(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ī)則對于參數(shù)個數(shù)可變的子程序,當(dāng)參數(shù)不超過4個時,可以使用寄存器r0-r3來傳遞參數(shù)當(dāng)參數(shù)超過4個時,可以使用數(shù)據(jù)棧來傳遞參數(shù)在參數(shù)傳遞時,將所有參數(shù)看作時存放在連續(xù)的內(nèi)存字單元中的字?jǐn)?shù)據(jù),然后,依次將各字?jǐn)?shù)據(jù)傳送到寄存器r0、r1、r2、r3中,如果參數(shù)多于4個,將剩余的字?jǐn)?shù)據(jù)傳送到數(shù)據(jù)棧中,入棧的順序與參數(shù)順序相反,即最后一個字?jǐn)?shù)據(jù)先入棧.對于浮點參數(shù)遵守:第一個整數(shù)參數(shù)通過寄存器r0-r3來傳遞,其它參數(shù)通過數(shù)據(jù)棧傳遞。參數(shù)傳遞開始四個字大小的參數(shù)直接使用寄存器的R0-R3來傳遞(快速且高效的)更多的信息可參看ATPCS如果需要更多的參數(shù),將使用堆棧。(需要額外的指令和慢速的存儲器操作)

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

評論

0/150

提交評論