体系结构对高级语言的支持_第1页
体系结构对高级语言的支持_第2页
体系结构对高级语言的支持_第3页
体系结构对高级语言的支持_第4页
体系结构对高级语言的支持_第5页
已阅读5页,还剩113页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

6CHAPTER体系结构对高级语言的支持主要内容1425软件设计中的抽象数据类型ARM浮点体系结构ARM体系结构对程序设计的支持3浮点数据类型6.1软件设计中的抽象汇编级的抽象在机器语言的级别上思考高级语言增加指令集的复杂度由编译器完成对高层次操作的支持抽象级的不同层次6.2数据类型计算机的数据可以用下列各项来表征:需要的位数位的顺序位的用途数是什么?“数”不过是一个抽象的概念,每个数用一个特定的符号或状态代表0123456789共十个符号,可以表示十个数ABCDEFGHIJKLMNOPQRSTUVWXYZ共二十六个符号,可以表示二十六个数世界上有六十亿人,需要定义六十亿个符号才能表示??用两个符号的排列可以表示比较多的数两个0~9的排列可以表示0~99共100个数0...9...11...33...78...99两个A~Z的排列可以表示A~ZZ共676个数A...Z...BB...EA...MP...ZZ用更多个的符号,可以表示更多的数基本符号集:少数几个表示数的基本符号当一个数大到不能用基本符号集表示时就用多个基本符号的排列表示进位制解决办法?进位制0个符号?没有这样的进位制一个符号:一进制?计算机不仅要表示数,还要运算:运算意味着变化,只有一个符号无法表示变化一进制在数学上不能与十进制等价如何表示0?进位制二个符号:二进制既可以表示数,也可以表示变化数学上可以与十进制等价计算机都用二进制计算机使用二进制并不意味着程序也必须使用二进制编译连接程序:用二进制、十进制、十六进制等工资报表程序:通常用十进制科学计算程序:可能用任意进制进位制及互相转化二进制

0,1两个状态易物理实现,运算规则简单

十进制特点:基数为十,逢十进一

其它进制八进制和十六进制互相转化十二进制的转化十六进制人类的阅读和记忆习惯“进制”很高:可接受很大数量的符号例:汉语短时记忆很小:仅可记忆几个到十几个字处理差异很小的符号时容易出错二进制不适合人们阅读和记忆00011001011110000000001000100110很长但类似的符号,不符合人们的习惯转换成十进制?麻烦更简单的表示:十六进制0x19780226十六进制和二进制的相互转换1010001000110110A236需要人处理的情况多用十六进制互相转化(二、八、十六进制化为十进制

)规则:按“权”展开

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

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

X21+1X20+1X2-1互相转化(二、八、十六进制化为十进制

)例1:将二进制数101.01转换成十进制数。

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

例2:将八进制数34.6转换成十进制数。

(34.6)8=3

X81+4

X80+6

X8-1=(28.75)10互相转化(二、八、十六进制化为十进制

)例3:将十六进制数2AB.6转换成十进制数

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

=(683.375)10互相转化(十进制化为二进制

)十进制整数化为二进制整数规则:除二取余,直到商为零为止,倒排例:将十进制数86转化为二进制

2|86 2|43……02|21……1 2|10……12|5……0 2|2……12|1……0所以,(86)10=(1010110)20……1互相转化(十进制化为二进制

)十进制小数化为二进制小数规则:乘二取整,直到小数部分为零或给定的精度为止,顺排例:将十进制数0.875转化为二进制数

0.875

╳2

1.750.75

╳2

1.50.5

╳2

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

互相转化(十六进制化为二进制

)规则:每一个位十六进制数改写成等值的四位二进制数,次序不变例:(3A8C.D6)16=(0011101010001100.11010110)2=

(11101010001100.1101011)2

互相转化(二进制化为十六进制

)规则:每四位二进制数改写成等值的一位十六进制数,次序不变例:

(11001111.01111)2

=(1100

1111.0111

1000)2

=(CF.78)16

数的范围ARM安排32位来表示数量32位无符号整数取值范围为:0~4294967295(10)=0~FFFFFFFF(16)如果是负数呢?又该如何表示?范围是多少?如何表示一个有符号的整数?符号位?原码、反码、补码?实数(浮点数)?一般概念正整数(不带符号的整数)8位:0~255,16位:0~65535带符号整数符号位(0:正;1:负)最高位为符号位(原码表示法)8位:-127~127,16位:-32767~+32767补码机器数原码:将整数化为二进制数,符号位置0(正数)或1(负数)反码:负数的反码:符号位为1,绝对值部分与原码相反。负数的补码表示:符号位也是“1”,其余为反码的最低位加“1”。注意:-0与+0在补码表示法中相同,而在原码、反码表示却不同。相同位数的二进制补码,表示的范围比原码、反码多一个。正数的原码、反码、补码都相等,即表示方法只有一种。计算机内符号数的补码表示法 (1)引例一:钟表调时 如图:10点→6点,可以逆时针拨,也可顺时针拨: 逆拨:10–4=6(减) 顺拨:10+8=18=12+6=6(加)

在顺拨中,12可自然丢失,称为模;而8被称为是–4的补码。

显然钟表采用十二进制,系统所能表示的最大量程为12,称之为模(基)。∵8=12–4=12+(–4)∴(–4)补=12–4=12+(–4)=8

即:(X)补=模+XARM微处理器中支持三种数据类型:字节(8位有符号和无符号字节)半字(16位有符号和无符号半字)字(32位有符号和无符号字)其中,字需要4字节对齐(地址的低两位为0)、半字需要2字节对齐(地址的最低位为0)。

ASCII码AmericanStandardCodeforInformationInterchange(美国标准信息交换码)在计算机中,除要处理大量的数据信息外,还需处理一些字母、符号,它们也要用二进制编码来表示。目前,普遍采用的ASCII码用7位二进制编码来表示数符。共有27=128种组合状态。它们是

52大小写英文字母;

10个十进制数;

7个标点符号;

9个运算符号;

50个其他符号。ANSICbasicdatatypesANSICbasicdatatypesSignedandunsignedcharactersofatleasteightbitsSignedandunsignedshortintegersofatleast16bitsSignedandunsignedintegersofatleast16bitsSignedandunsignedlongintegersofatleast32bitsFloating-point,doubleandlongdoublefloating-pointnumbersEnumeratedtypesBitfieldsEnumeratedtypesthesmallestintegertypewiththenecessaryrangeofvalues.BitfieldtypesimplementedwithinintegersANSICDeriveddatatypes

ANSICStandardderiveddatatypesArraysofseveralobjectsofthesametype.FunctionswhichreturnanobjectofagiventypeStructurescontainingasequenceofobjectsofvarioustypes.Pointers(whichareusuallymachineaddresses)toobjectsofagiventypeUnionswhichallowobjectsofdifferenttypestooccupythesamespaceatdifferenttimesARMpointers32botslong,similartounsignedint,butdifferentarithmeticrulesARMsupportforarray/structureBaseplusscaledindexaddressingARM对字符的支持需要注意大小端的存储顺序问题6.3浮点数据类型对于定点数据来说,用带小数位的数字就可解决,但其范围还是有限使用二进制“科学表示法”例如:10.5infixedpoint1010.1bMovebinarypointtoleft1.0101bx2310.5=1.3125x8IEEE-754standardfloatingpoint32-bitsingleprecisionfloatingpoint:

★MSBissign-bit(sameasfixedpoint)★8-bitexponentinbias-127integerformat(i.e.store127+exponent)★23-bittorepresentonlythefractionalpartofthemantissa.TheMSBofthemantissaisALWAYS‘1’,thereforeitisnotstored浮点机器数定点表示:又称整数表示,小数点在数中的位置是固定不变的。浮点表示:又称实数表示,小数点在数中的位置是浮动的。1位1位q位p位mfefem注:mf为尾数的符号位,ef为阶码的符号位,e为阶码的值,m为尾数的值。浮点数的存储方式浮点机器数浮点表示法(浮点数):用指数(整数)和尾数(纯小数)来表示实数的方法。浮点数的表示方法不唯一,长度越长,范围越大,精度越高。IEEE的浮点数标准。PC中有:16位整数、短整数(32位)、长整数(64位),单精度(32位)、双精度(64位)和扩充精度(80位)浮点数。注意PC和ARM的区别!IEEE754singleprecisionrepresentationof‘1995’IEEE754doubleprecisionfloating-pointnumberformatIEEE754doubleextendedprecisionfloating-pointnumberformatIEEE754packeddecimalfloating-pointnumberformatIEEE754extendedpackeddecimalfloating-pointnumberformat6.4ARM浮点体系结构Loadandstorefloatingbinaryencoding

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

LDC{条件}{L}协处理器编码,目的寄存器,[源寄存器]LDC指令用于将源寄存器所指向的一系列连续的存储单元中的字数据传送到协处理器的寄存器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,{L}选项表示指令为长读取操作,如用于双精度数据的传输。指令示例:

LDC

P3,C4,[R0]

;将ARM处理器的寄存器R0所指向的存储器中的字数据传送到协处理器P3的寄存器C4中。指令操作的伪代码:

STC指令STC指令的格式为:

STC{条件}{L}协处理器编码,源寄存器,[目的寄存器]STC指令用于将协处理器中的寄存器中的字数据传送到目的寄存器所指向一系列连续的存储单元中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,{L}选项表示指令为长读取操作,如用于双精度数据的传输。指令示例:

STC

P3,C4,[R0]

;将协处理器P3的寄存器C4中的字 数据传送到ARM处理器的寄存器R0所指向的存储器中。指令操作的伪代码:Floating-pointdataprocessingbinaryencoding

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

CDP{条件}协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2CDP指令用于ARM处理器通知ARM协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作,目的寄存器和源寄存器均为协处理器的寄存器,指令不涉及ARM处理器的寄存器和存储器。指令示例:

CDP

P3,2,C12,C10,C3,4

;该指令完成协处理器P3的初始化指令操作的伪代码:Floating-pointregistertransferbinaryencodingMCR指令MCR指令的格式为:

MCR{条件}协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,协处理器操作码2MCR指令用于将ARM处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作,源寄存器为ARM处理器的寄存器,目的寄存器1和目的寄存器2均为协处理器的寄存器。指令示例:

MCR

P3,3,R0,C4,C5,6

;该指令将ARM处理器寄存器R0中的数据传送到协处理器P3的寄存器C4和C5中。

指令操作的伪代码:MRC指令MRC指令的格式为:MRC{条件}协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2MRC指令用于将协处理器寄存器中的数据传送到ARM处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作,目的寄存器为ARM处理器的寄存器,源寄存器1和源寄存器2均为协处理器的寄存器。指令示例:

MRC

P3,3,R0,C4,C5,6

;该指令将协处理器P3的寄存器中的数据传送到ARM处理器寄存器中。指令操作的伪代码:Floating-pointinstructionfrequenciesFPA10internalorganizationVFP10

Amuchhigherperformancefloating-pointunit,theVFP10,hasbeendesignedtooperatewiththeARM10TDMIprocessorcore(seeSection12.6onpage288).TheVFP10supportsadifferentfloating-pointinstructionsetfromtheFPA10thatincludessupportforvectorfloating-pointoperations.6.5表达式访问操作数通过寄存器传送的参数通过堆栈传递的参数文字池中的常量局部变量全局变量指针运算数组符号定义(SymbolDefinition)伪指令

符号定义伪指令用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。常见的符号定义伪指令有如下几种:用于定义全局变量的GBLA、GBLL和GBLS。用于定义局部变量的LCLA、LCLL和LCLS。用于对变量赋值的SETA、SETL、SETS。为通用寄存器列表定义名称的RLIST。1.GBLA、GBLL和GBLS语法格式:

GBLA(GBLL或GBLS) 全局变量名GBLA、GBLL和GBLS伪指令用于定义一个ARM程序中的全局变量,并将其初始化。其中:GBLA伪指令用于定义一个全局的数字变量,并初始化为0;GBLL伪指令用于定义一个全局的逻辑变量,并初始化为F(假);GBLS伪指令用于定义一个全局的字符串变量,并初始化为空;由于以上三条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。使用示例:

GBLA Test1 ;定义一个全局的数字变量,

;变量名为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伪指令用于定义一个局部的数字变量,并初始化为0;LCLL伪指令用于定义一个局部的逻辑变量,并初始化为F(假);LCLS伪指令用于定义一个局部的字符串变量,并初始化为空;以上三条伪指令用于声明局部变量,在其作用范围内变量名必须唯一。使用示例:

LCLA Test4 ;声明一个局部的数字变量,

;变量名为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)表达式伪指令SETA、SETL、SETS用于给一个已经定义的全局变量或局部变量赋值。SETA伪指令用于给一个数学变量赋值;SETL伪指令用于给一个逻辑变量赋值;SETS伪指令用于给一个字符串变量赋值;其中,变量名为已经定义过的全局变量或局部变量,表达式为将要赋给变量的值。使用示例:

LCLA Test3 ;声明一个局部的数字变量,

;变量名为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指令中,列表中的寄存器访问次序为根据寄存器的编号由低到高,而与列表中的寄存器排列次序无关。 使用示例:

RegListRLIST{R0-R5,R8,R10} ;将寄存器列表名称定义为RegList,

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

;该名称访问寄存器列表。数据定义(DataDefinition)伪指令 数据定义伪指令一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。常见的数据定义伪指令有如下几种:DCB 用于分配一片连续的字节存储单元并用指定 的数据初始化。DCW(DCWU)用于分配一片连续的半字存储单元并用指定的 数据初始化。DCD(DCDU) 用于分配一片连续的字存储单元并用指定的数 据初始化。DCFD(DCFDU)用于为双精度的浮点数分配一片连续的字存 储单元并用指定的数据初始化。DCFS(DCFSU)用于为单精度的浮点数分配一片连续的字存 储单元并用指定的数据初始化。DCQ(DCQU)用于分配一片以8字节为单位的连续的存储单元 并用指定的数据初始化。SPACE 用于分配一片连续的存储单元MAP 用于定义一个结构化的内存表首地址FIELD 用于定义一个结构化的内存表的数据域1.DCB语法格式:

标号 DCB 表达式{,表达式}……DCB伪指令用于分配一片连续的字节存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为0~255的数字或字符串。DCB也可用“=”代替。使用示例:

string DCB “Thisisatest!”

string = “Thisisatest!”

;分配一片连续的字节存储单元并初始化。2.DCW(或DCWU)语法格式:

标号 DCW(或DCWU) 表达式{,表达式}…..DCW(或DCWU)伪指令用于分配一片连续的半字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。用DCW分配的字存储单元是半字对齐的,而用DCWU分配的字存储单元并不严格半字对齐。使用示例:

DataTest DCW 1,2,3 ;分配一片连续的半字存储单元并初始化。3.DCD(或DCDU)语法格式:

标号DCD(或DCDU) 表达式{,表达式}…..DCD(或DCDU)伪指令用于分配一片连续的字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。DCD也可用“&”代替。用DCD分配的字存储单元是字对齐的,而用DCDU分配的字存储单元并不严格字对齐。使用示例:

DataTest DCD 4,5,6

DataTest & 4,5,6 ;分配一片连续的字存储单元并初始化。4.DCFD(或DCFDU)语法格式:

标号 DCFD(或DCFDU)表达式{,表达式}…..DCFD(或DCFDU)伪指令用于为双精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。每个双精度的浮点数占据两个字单元。用DCFD分配的字存储单元是字对齐的,而用DCFDU分配的字存储单元并不严格字对齐。使用示例:

FDataTest DCFD 2E115,-5E7 ;分配一片连续的字存储单元并初始化为指定的双精度数。5.DCFS(或DCFSU)语法格式:

标号 DCFS(或DCFSU)表达式{,表达式}…..DCFS(或DCFSU)伪指令用于为单精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。每个单精度的浮点数占据一个字单元。用DCFS分配的字存储单元是字对齐的,而用DCFSU分配的字存储单元并不严格字对齐。使用示例:

FDataTest DCFS 2E5,-5E-7 ;分配一片连续的字存储单元并初始化为指定的单精度数。6.DCQ(或DCQU)语法格式:

标号 DCQ(或DCQU) 表达式{,表达式}…..DCQ(或DCQU)伪指令用于分配一片以8个字节为单位的连续存储区域并用伪指令中指定的表达式初始化。用DCQ分配的存储单元是字对齐的,而用DCQU分配的存储单元并不严格字对齐。使用示例:

DataTest DCQ 100 ;分配一片连续的存储单元并初始化为指定的值。7.SPACE语法格式:

标号 SPACE 表达式SPACE伪指令用于分配一片连续的存储区域并初始化为0。其中,表达式为要分配的字节数。SPACE也可用“%”代替。使用示例:

DataSpace SPACE 100

DataSpace % 100 ;分配连续100字节的存储单元并初始化为0。8.MAP语法格式:

MAP 表达式{,基址寄存器}MAP伪指令用于定义一个结构化的内存表的首地址。MAP也可用“^”代替。表达式可以为程序中的标号或数学表达式,基址寄存器为可选项。当基址寄存器选项不存在时,表达式的值即为内存表的首地址;当该选项存在时,内存表的首地址为表达式的值与基址寄存器的和。MAP伪指令通常与FIELD伪指令配合使用来定义结构化的内存表。使用示例:

MAP 0x100,R0 ^ 0x100,R0 ;定义结构化内存表首地址的值为0x100+R0。9.FILED语法格式:

标号 FIELD 表达式FIELD伪指令用于定义一个结构化内存表中的数据域。FILED也可用“#”代替。表达式的值为当前数据域在内存表中所占的字节数。FIELD伪指令常与MAP伪指令配合使用来定义结构化的内存表。MAP伪指令定义内存表的首地址,FIELD伪指令定义内存表中的各个数据域,并可以为每个数据域指定一个标号供其他的指令引用。注意MAP和FIELD伪指令仅用于定义数据结构,并不实际分配存储单元。使用示例:

MAP 0x100 ;定义结构化内存表首地址的值为0x100。

A FIELD 16;定义A的长度为16字节,位置为0x100 B # 32;定义B的长度为32字节,位置为0x110 S FIELD 256;定义S的长度为256字节,位置为0x130举例1.链表操作在链表中搜索与某一个数据相等的元素。链表中的每个元素包括两个字,第一个字中包含一个字节数据;第二个字中包含指向下一个链表元素的指令,当这个指针为0时表示链表结束。llsearch CMPR0,#0 ;R0是nextpointer LDRNEBR2,[R0] CMPNER1,R2 ;R1存放要搜索的数据

LDRNER0,[R0,#4] BNEllsearch MOVPC,LR2.简单的串比较比较两个串的大小:R0指向第一个串,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条件执行-最大公约数最大公约数C语言代码:int

gcd(inta,intb){while(a!=b) if(a>b) a=a-b; else b=b-a;returna;}最大公约数ARM汇编代码:gcd

cmpr0,r1 ;reachedtheend?

beqstop

bltless ;ifr0>r1 subr0,r0,r1 ;subtractr1fromr0 bgcdless subr1,r1,r0 ;subtractr0fromr1 bgcdstop ;……最大公约数ARM汇编代码(条件执行):代码执行前r0中存放a,r1中存放b;代码执行后r0中存放a和b的最大公约数: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;代码执行前r0中存放a,r1中存放b;代码执行后r2中存放d和e的和:

CMPR0,#0 CMPNER1,#1 ADDEQR2,R3,R4注意:两个条件按顺序进行判断,如果第一个条件不成立,则后面的条件无需进行判断。switchesswitch(expression){caseconstant-expression1:statementS1;caseconstant-expression2:statementS2;…caseconstant-expression3:statementSn;default:statementSD};rocontainsvalueofexpression代码根据maxindex的不同值跳转不同的代码段,这里要求各目标代码段的大小都为2RoutineSizeLog2:ADRr1,JUMPTABLECMPr0,#TABLEMAX;LDRLSpc,[r1,r0,LSL#2];;statementSDBEXITL1…;statementsS1BEXIT…LN…;statementSNEXIT…6.7循环语句对于一个for或while循环:

MOVR0,#loopcount;初始化计数器loop ;…… SUBSR0,R0,#1 ;计数器的更新及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函数与过程Typicalhierarchicalprogramstructure1.子程序调用BL指令在指令跳转操作的同时保存当前PC寄存器值,用于从被调用的子程序中返回。

;…… BLfunction_name SUBR2,R1,R0 ;……function_name ;…… MOVPC,LR当前PC值是多少?注意:B与BL指令的区别。2.子程序进入和退出时数据的保存和恢复在调用子程序时,通常利用寄存器r0-r3传递参数和返回结果,这几个参数由子程序的调用者来保存,其他的子程序将要用到的寄存器在子程序入口处保存,在子程序返回前恢复这些寄存器。function STMFDR13!,{R4-R12,R14} ;函数入口

;…… ;functionbody ;…… LDMFDR13!,{R4-R12,PC} ;函数出口ATPCS概述ATPCS规定了一些ARM程序和Thumb程序中子程序间调用的基本规则,包括子程序调用过程中寄存器的使用规则,数据栈的使用规则,参数的传递规则。支持数据栈限制检查的ATPCS支持只读段位置无关(ROPI)的ATPCS支持可读写段位置无关(RWPI)的ATPCS支持ARM程序和Thumb程序混合使用的ATPCS处理浮点运算的ATPCS使用ADS的C语言编译器编译的C语言子程序满足用户指定的ATPCS类型,汇编子程序必须满足下面3个条件:在子程序编写时必须遵守相应的ATPCS规则数据栈的使用要遵守相应的ATPCS规则在汇编编译器中使用-apcs选项基本ATPCS基本ATPCS规定了在子程序调用时的一些基本规则,支持:各寄存器的使用规则及其相应的名称数据栈的使用规则参数传递的规则不支持ARM程序和Thumb程序相互调用数据以及代码的位置无关的支持子程序的可重入性数据栈检查的支持寄存器的使用规则子程序间通过寄存器r0-r3来传递参数在子程序中,使用寄存器r4-r11来保存局部变量寄存器r12用作子程序间scratch寄存器,记作ip寄存器r13用作数据栈指针,记作sp寄存器r14用作连接寄存器,记作lr寄存器r15用作程序计数器,记作pc

表6.1ATPCS中各寄存器的使用规则及其名称寄存器别名特殊名称使用规则R15pc程序计数器R14lr连接寄存器R13sp数据栈指针R12ip子程序内部调用的scratch寄存器R11V8ARM状态局部变量寄存器8R10V7slARM状态局部变量寄存器7,在支持数据栈检查的ATPCS中为数据栈限制指针R9V6sbARM状态局部变量寄存器6,在支持RWPI的ATPCS中为静态基址寄存器R8V5ARM状态局部变量寄存器5R7V4wr局部变量寄存器4,Thumb状态工作寄存器R6V3局部变量寄存器3R5V2局部变量寄存器2R4V1局部变量寄存器1R3A4参数/结果/scratch寄存器4R2A3参数/结果/scratch寄存器3R1A2参数/结果/scratch寄存器2R0A1参数/结果/scratch寄存器1数据栈使用规则栈指针可以指向不同的位置,数据栈的增长方向也可以不同,有4种数据栈:FDFullDescendingEDEmptyDescendingFAFullAscendingEAEmptyAscendingATPCS规定数据栈为FD类型,并且对数据栈的操作是8字节对齐的。数据栈的名词数据栈栈指针stackpointer数据栈的基地址stackbase数据栈界限stacklimit已占用的数据栈usedstack未占用的数据栈unusedstack数据栈中的数据帧stackframes6.2.3参数传递规则1、子程序参数传递规则对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器r0-r3来传递参数当参数超过4个时,可以使用数据栈来传递参数在参数传递时,将所有参数看作时存放在连续的内存字单元中的字数据,然后,依次将各字数据传送到寄存器r0、r1、r2、r3中,如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈.对于浮点参数遵守:第一个整数参数通过寄存器r0-r3来传递,其它参数通过数据栈传递。参数传递开始四个字大小的参数直接使用寄存器的R0-R3来传递(快速且高效的)更多的信息可参看ATPCS如果需要更多的参数,将使用堆栈。(需要额外的指令和慢速的存储器操作)

所以通常限制参数的个数,使它为4或更少。如果不可避免,把常用的参数前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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论