1、1嵌入式系统开发中汇编语言设计的意义嵌入式系统开发中汇编语言设计的意义n汇编语言程序设计更能充分发挥处理器的硬件汇编语言程序设计更能充分发挥处理器的硬件特性特性n两个优势两个优势n操作系统移植需要编写几百行底层硬件的操作系统移植需要编写几百行底层硬件的汇编语言程序,这是汇编语言程序,这是C语言不可取代的。语言不可取代的。n优化算法的时空效率,优化算法的时空效率,C语言的目标代码优语言的目标代码优化是编译器完成的,而汇编语言的目标代化是编译器完成的,而汇编语言的目标代码优化是人工完成的。人是算法的创造者,码优化是人工完成的。人是算法的创造者,也是编译器的设计者,人工优化比编译器也是编译器的设计者
2、,人工优化比编译器质量高。质量高。n弱点弱点n编程效率低,开发周期长,经济代价大。编程效率低,开发周期长,经济代价大。25.1 ARM汇编语言程序格式汇编语言程序格式n两种两种ARM汇编语言格式汇编语言格式nARM汇编语言程序格式主要有两种:汇编语言程序格式主要有两种:n基于基于ADS1.2集成开发环境的汇编器格式集成开发环境的汇编器格式n包括包括SDT在内,统称为在内,统称为ADSn基于基于Linux的的GNU汇编器格式汇编器格式n在本章主要介绍基于在本章主要介绍基于ARM公司公司ADS集成开集成开发环境汇编器格式的汇编语言程序设计。发环境汇编器格式的汇编语言程序设计。n在后面将介绍基于在后
3、面将介绍基于GNU汇编器的汇编器的ARM汇编汇编语言程序编写方法。语言程序编写方法。3预定义寄存器名及内部变量名预定义寄存器名及内部变量名nARM汇编器中将几十个寄存器名称作为保汇编器中将几十个寄存器名称作为保留字预先给与了定义,这些预定义寄存器留字预先给与了定义,这些预定义寄存器名都是大小写敏感的,它们都与具体的寄名都是大小写敏感的,它们都与具体的寄存器一一对应。参看下面的表格。存器一一对应。参看下面的表格。4ARM公司公司ADS预定义的寄存器名一览表预定义的寄存器名一览表预定义寄存器名预定义寄存器名描述描述r0-r15 and R0-R15ARM处理器的通用寄存器处理器的通用寄存器a1-a
4、4入口参数,处理结果,暂存寄存器;入口参数,处理结果,暂存寄存器;r0-r3的同义词的同义词v1-v8变量寄存器,变量寄存器,r4-r11sb and SB静态基址寄存器,静态基址寄存器,r9sl and SL栈界限寄存器,栈界限寄存器,r10fp and FP帧指针寄存器,帧指针寄存器,r11ip and IP内部过程调用暂存寄存器,内部过程调用暂存寄存器,r12sp and SP 栈指针寄存器,栈指针寄存器,r13 5ARM公司公司ADS预定义的寄存器名预定义的寄存器名一览表(续)一览表(续)预定义寄存器名预定义寄存器名描述描述lr and LR连接寄存器,连接寄存器,r14pc and
5、PC程序寄存器,程序寄存器,r15cpsr and CPSR当前程序状态寄存器当前程序状态寄存器spsr and SPSR保存的程序状态寄存器保存的程序状态寄存器f0-f7 and F0-F7浮点数运算加速寄存器浮点数运算加速寄存器s0-s31 and S0-S31单精度向量浮点数运算寄存器单精度向量浮点数运算寄存器d0-d15 and D0-D15双精度向量浮点数运算寄存器双精度向量浮点数运算寄存器p0-p15协处理器协处理器0-15c0-c15协处理器寄存器协处理器寄存器0-156ARM汇编语言程序的部分内部变量汇编语言程序的部分内部变量名清单名清单 内部变量内部变量描述描述PC or.当
6、前指令地址当前指令地址VAR or 内存区定位计数器的当前值内存区定位计数器的当前值TRUE逻辑值真逻辑值真FALSE逻辑值假逻辑值假CONFIG汇编器如果在汇编汇编器如果在汇编ARM指令,取值为指令,取值为32,如果汇,如果汇编编Thumb指令,取值指令,取值16ENDIAN如果汇编器是大端序,则取值如果汇编器是大端序,则取值big;如果是小端序,;如果是小端序,则取值则取值little。CPU被选择的被选择的CPU名称。缺省值是名称。缺省值是ARM7TDMI。ARCHITECTURE该变量内容是被选择的该变量内容是被选择的ARM体系结构的名称。如:体系结构的名称。如:3,3M,4TCODE
7、SIZECONFIG的同义词的同义词7ARM汇编语言程序的语句格式汇编语言程序的语句格式nARM汇编语言程序的语句格式格式如下:汇编语言程序的语句格式格式如下:symbol instruction|directive|pseudo-instruction ;comment n对应的中文语句格式描述是:对应的中文语句格式描述是:符号符号(标号标号)指令指令|指示符指示符|伪指令伪指令 ;注释注释 n语句格式中,花括号括起来的部分表示可语句格式中,花括号括起来的部分表示可以省略;竖线分隔的字段表示可以替换。以省略;竖线分隔的字段表示可以替换。8ARM汇编语言程序中的符号汇编语言程序中的符号nARM
8、汇编语句中的符号可以是指令地址或汇编语句中的符号可以是指令地址或标号、变量、常量和局部标号,符号属性标号、变量、常量和局部标号,符号属性可以是程序相关的、寄存器相关的或者是可以是程序相关的、寄存器相关的或者是绝对地址。绝对地址。9(一)符号命名和书写规则(一)符号命名和书写规则n符号的命名和书写有以下规则:符号的命名和书写有以下规则:符号命名可以使用大小写字母,数字和下划线。符号命名可以使用大小写字母,数字和下划线。符号是大小写字母敏感的。符号是大小写字母敏感的。除本地行号外,名称不能以数字开头。除本地行号外,名称不能以数字开头。一个程序段中不能重名。一个程序段中不能重名。符号在其作用范围内必
9、须唯一。符号在其作用范围内必须唯一。符号不能够与系统内部变量或者系统预定义的符号不能够与系统内部变量或者系统预定义的符号同名。例如:符号同名。例如:a1 or R0、sp、cpsr、PC or.、VAR or、CONFIG、CPU等等。等等。10符号命名和书写规则(续)符号命名和书写规则(续)当程序中的符号与指令助记符或者指示符同名当程序中的符号与指令助记符或者指示符同名时,用双竖线将符号括起来。如时,用双竖线将符号括起来。如|buffe_a|,这时双竖线并不是符号的组成部分。这时双竖线并不是符号的组成部分。在在ARM汇编语言程序中,所有符号必须在一行汇编语言程序中,所有符号必须在一行的最左边
10、位置开始书写,即所谓的顶格书写,的最左边位置开始书写,即所谓的顶格书写,不允许包含空格或者制表符。不允许包含空格或者制表符。符号的字符序列中不能大小写字母相混杂。符号的字符序列中不能大小写字母相混杂。11(二)常量(二)常量nARM汇编语言中使用到的常量可以是数字汇编语言中使用到的常量可以是数字常量、字符常量、字符串常量和布尔常量。常量、字符常量、字符串常量和布尔常量。n数字常量有以下数字常量有以下3种表示方式:种表示方式:1)十进制数,如:)十进制数,如:535,246。2)十六进制数,如:)十六进制数,如:0 x645,0 xff00。3)n进制数,格式为进制数,格式为n_XXX,其中,其
11、中n表示表示n进制,进制,从从29,XXX是具体的数字。是具体的数字。例如:例如:8_3777,8_5237702数字常量数字常量12字符常量字符常量n字符常量由一对单引号括起来,包括一个单字符字符常量由一对单引号括起来,包括一个单字符或者标准或者标准C中的转义字符。中的转义字符。n例如:例如:A,n。n字符串常量由一对双引号以及由它括住的一组字字符串常量由一对双引号以及由它括住的一组字符串组成,包括标准符串组成,包括标准C中的转义字符。如果需要中的转义字符。如果需要使用双引号或字符使用双引号或字符$,则必须用,则必须用”和和$代替。代替。n例如执行语句:例如执行语句:strtwo SETS“
12、This is character of”其编译结果是:字符串其编译结果是:字符串“This is character of”被被赋值给赋值给strtwo变量。变量。13$在汇编语句中的使用举例在汇编语句中的使用举例 GBLS add4ffadd4ff SETS“ADD r4,r4,#0 xFF“;set up add4ff$add4ff.00;invoke add4ff;this produces;ADD r4,r4,#0 xFF00 ;elaborate substitution GBLS s1 GBLS s2 GBLS fixup GBLA countcount SETA 14s1 SE
13、TS a$b$count;s1 now has value a$b0000000Es2 SETS abcFixup SETS|xy$s2.z|;fixup now has value|xyabcz|C$code|MOV r4,#16;but the label here is C$code14逻辑值常量逻辑值常量n布尔常量布尔常量TRUE和和FALSE在表达式中写为:在表达式中写为:TRUE,FALSE。15(三)表达式(三)表达式nARM汇编语言中的表达式由符号、数值、汇编语言中的表达式由符号、数值、单目操作符、双目操作符以及括号组成。单目操作符、双目操作符以及括号组成。运算的优先级次序与标
14、准运算的优先级次序与标准C一样。一样。16字符串表达式字符串表达式n字符串由字符串常量、字符串变量、操作字符串由字符串常量、字符串变量、操作符以及括号组成。最大长度为符以及括号组成。最大长度为512字节,最字节,最短短0个字节。字符串表达式的组成元素有:个字节。字符串表达式的组成元素有:字符串常量、字符串变量、操作符等。字字符串常量、字符串变量、操作符等。字符串常量由包含在双引号内的一系列字符符串常量由包含在双引号内的一系列字符组成。当在字符串中包含美元符号组成。当在字符串中包含美元符号$或者引或者引号号”时,用时,用$表示一个表示一个$,用,用”表示一个表示一个”。字符串变量用指示符。字符串
15、变量用指示符GBLS(全局字符(全局字符串)或者串)或者LCLS(局部字符串)声明,用(局部字符串)声明,用SETS赋值。取值范围与字符表达式相同。赋值。取值范围与字符表达式相同。17ARM汇编语言中的字符串操作符汇编语言中的字符串操作符 操作符操作符功能功能操作符操作符功能功能LEN返回字符串的返回字符串的长度长度CHR将将0255之间整数之间整数变为单个字符变为单个字符STR将一个数字量将一个数字量变换为串变换为串LEFT返回字符串的左子返回字符串的左子串串RIGHT返回字符串的返回字符串的右子串右子串CC连接两个字符串连接两个字符串18n n指令格式说明:指令格式说明:LENX;返回;返
16、回X字符串长度字符串长度STRM;将数字;将数字M转换成一个字符串转换成一个字符串XRIGHTN;返回;返回X字符串右边长度为字符串右边长度为N的子串的子串XLEFTN;返回;返回X字符串左边长度为字符串左边长度为N的的子串子串CHRM;返回数字;返回数字M表示的单个字符表示的单个字符XCCY;返回字符串;返回字符串X和和Y连接的字符串连接的字符串19数字表达式数字表达式n数字表达式由数字常量、数字变量、操作数字表达式由数字常量、数字变量、操作符和括号组成。数字表达式表示的是一个符和括号组成。数字表达式表示的是一个32位数的整数,其取值范围为位数的整数,其取值范围为0232-1;当作为;当作为
17、有符号数时,其取值范围为有符号数时,其取值范围为-231231-1。n汇编器对汇编器对-n和和232-n不做区别,汇编时对关系不做区别,汇编时对关系运算符采用无符号数方式处理,这就意味运算符采用无符号数方式处理,这就意味着着 0-1是是FALSE。20逻辑表达式逻辑表达式n逻辑表达式由逻辑常量、逻辑操作符、关逻辑表达式由逻辑常量、逻辑操作符、关系操作符以及括号组成。取值范围为系操作符以及括号组成。取值范围为FALSE和和TRUE。21(四)地址标号(四)地址标号n当符号代表地址时称为标号(当符号代表地址时称为标号(Label)。)。n以数字开头的标号其作用范围是当前段以数字开头的标号其作用范围
18、是当前段(没有使用(没有使用ROUT指示符时),这种标号又指示符时),这种标号又称为局部标号(称为局部标号(Local Label)。)。22三种类型标号三种类型标号(1)PC相关标号相关标号(2)寄存器相关标号)寄存器相关标号(3)绝对地址)绝对地址23PC相关标号相关标号nPC相关标号表示程序计数器加减一个数值相关标号表示程序计数器加减一个数值常数后得到的地址值。常用来指明一个分常数后得到的地址值。常用来指明一个分支指令的目标地址,或者访问嵌入在代码支指令的目标地址,或者访问嵌入在代码段中的一个数据项。段中的一个数据项。n具体标记方法是:在汇编语言程序指令的具体标记方法是:在汇编语言程序指
19、令的前面写入标号,或者在一个数据指示符前前面写入标号,或者在一个数据指示符前面写入标号。通常用面写入标号。通常用DCB或者或者DCD等指示等指示符定义。符定义。24n nDCBDCB,DCDDCD指令格式:指令格式:指令格式:指令格式:X XDCBDCBEXP1EXP1,EXP2EXP2 如定义一个字节为单位的标号如定义一个字节为单位的标号如定义一个字节为单位的标号如定义一个字节为单位的标号XSTRXSTRDCBDCB“HELLO WORLD!HELLO WORLD!”,0,0DCBDCB0 x32,0 x34,0 x350 x32,0 x34,0 x35 X XDCDDCDEXP1EXP1,
20、EXP2EXP2 定义一个字为单位的标号定义一个字为单位的标号定义一个字为单位的标号定义一个字为单位的标号LDR PC,RESETADDRLDR PC,RESETADDRRESETADDR DCD RESETRESETADDR DCD RESET RESET RESET25寄存器相关标号寄存器相关标号n寄存器标号表示指定寄存器的值加减一个数值常寄存器标号表示指定寄存器的值加减一个数值常数后得到的地址值。常常用于访问位于数据段中数后得到的地址值。常常用于访问位于数据段中的数据。通常用的数据。通常用MAP或者或者FIELD等指示符定义。等指示符定义。n格式:格式:MAPEXPR,BASEREGLA
21、BLEFIELDEXPR如:如:MAP0 x00400000,R9 COUNT FIELD 4 X FIELD 8 Y FIELD 826绝对地址绝对地址n绝对地址是一个绝对地址是一个32位的无符号数字常量,可位的无符号数字常量,可寻址范围是寻址范围是0231-1。使用它可以直接寻址整。使用它可以直接寻址整个地址空间。个地址空间。27(五)段内标号和段外标号(五)段内标号和段外标号nARM处理器的地址标号分为段内标号和段处理器的地址标号分为段内标号和段外标号。段内标号的地址值在汇编时确定,外标号。段内标号的地址值在汇编时确定,段外标号的地址值在连接时确定。段外标号的地址值在连接时确定。28程序
22、相对寻址和寄存器相对寻址程序相对寻址和寄存器相对寻址n在程序段中标号代表其所在位置与段首地在程序段中标号代表其所在位置与段首地址的偏移量,根据程序计数器和偏移量计址的偏移量,根据程序计数器和偏移量计算地址称为程序相对寻址。算地址称为程序相对寻址。n在映像文件中定义的标号代表标号到映像在映像文件中定义的标号代表标号到映像首地址的偏移量。映像的首地址通常被赋首地址的偏移量。映像的首地址通常被赋予一个寄存器,根据该寄存器值与偏移量予一个寄存器,根据该寄存器值与偏移量计算地址称为寄存器相对寻址。计算地址称为寄存器相对寻址。29(六)局部标号(六)局部标号nARM汇编语言的宏常常使用局部标号。局汇编语言
23、的宏常常使用局部标号。局部标号提供分支指令在汇编程序的局部范部标号提供分支指令在汇编程序的局部范围内进行跳转,主要用途是汇编子程序中围内进行跳转,主要用途是汇编子程序中的循环和条件编码。它是一个的循环和条件编码。它是一个099之间的之间的数字,后面可以有选择地附带一个符号名数字,后面可以有选择地附带一个符号名称。称。n局部标号特别适用于宏。局部标号特别适用于宏。30局部标号(续局部标号(续1)n使用使用ROUT指示符可以限制局部标号的范围。指示符可以限制局部标号的范围。只能在该局部标号的范围引用局部标号。只能在该局部标号的范围引用局部标号。如果在该范围的上下两个方向都没有匹配如果在该范围的上下
24、两个方向都没有匹配的标号,汇编器将给出一个错误信号并停的标号,汇编器将给出一个错误信号并停止汇编。止汇编。局部标号语法格式如下:局部标号语法格式如下:nroutname被引用的局部标号语法规则是:被引用的局部标号语法规则是:%F|B A|T n routname31局部标号(续局部标号(续2)n是局部标号的数字号。是局部标号的数字号。routname是当前局部范围的名称。是当前局部范围的名称。%表示引用操作。表示引用操作。F指示汇编器只向前搜索指示汇编器只向前搜索B指示汇编器只向后搜索指示汇编器只向后搜索A指示汇编器搜索宏的所有嵌套层次指示汇编器搜索宏的所有嵌套层次T指示汇编器搜索宏的当前层次
25、指示汇编器搜索宏的当前层次如果如果F和和B都没有指定,则汇编器首先向前搜索,再向后都没有指定,则汇编器首先向前搜索,再向后搜索。如果搜索。如果A和和T都没有指定,汇编器搜索从宏的当前都没有指定,汇编器搜索从宏的当前层次到宏的最高层次,比当前层次低的宏不再搜索。层次到宏的最高层次,比当前层次低的宏不再搜索。32ARM汇编语言程序编写规范汇编语言程序编写规范 nARM汇编语言程序源代码中允许有空行,可以在汇编语言程序源代码中允许有空行,可以在汇编程序中加上一个空白行,来增加程序的可阅汇编程序中加上一个空白行,来增加程序的可阅读性。此外需要注意的是:指令,指示符,伪指读性。此外需要注意的是:指令,指
26、示符,伪指令前必须加空格或者令前必须加空格或者Tab制表符,这就是说指令,制表符,这就是说指令,指示符,伪指令不可以从行的最左边开始书写,指示符,伪指令不可以从行的最左边开始书写,即不能顶格书写。即不能顶格书写。n在在ARM汇编语言程序中,所有标号必须在一行的汇编语言程序中,所有标号必须在一行的最左边的位置开始书写,标号的后面不要加最左边的位置开始书写,标号的后面不要加“:”。指令,指示符,寄存器名可以用小写字母也。指令,指示符,寄存器名可以用小写字母也可以用大写字母来表示,但不能大小写字母相杂。可以用大写字母来表示,但不能大小写字母相杂。33ARM汇编语言程序编写规范(续)汇编语言程序编写规
27、范(续)n当一行写不下时,可以用反斜线当一行写不下时,可以用反斜线作为这一行作为这一行最后的符号,然后另起一行接下去写,这样汇编最后的符号,然后另起一行接下去写,这样汇编器会将这两行代码看作一行代码。需要注意的是,器会将这两行代码看作一行代码。需要注意的是,如果在被引号括住的字符串中使用反斜线如果在被引号括住的字符串中使用反斜线,则反斜线则反斜线不能起到续行的作用。每行的长度不能起到续行的作用。每行的长度限制一般在限制一般在128255个字符串之间。个字符串之间。n分号分号;除非在字符串常量中出现,否则它的出除非在字符串常量中出现,否则它的出现就表示着注释的开始,此注释直至行尾结束。现就表示着
28、注释的开始,此注释直至行尾结束。可以将注释单独列为一行。所有注释被汇编器忽可以将注释单独列为一行。所有注释被汇编器忽略。略。34汇编语句规则举例汇编语句规则举例AREA Startup,Code,READONLY AREA Startup,Code,READONLY STR1 SETS STR1 SETS“This is an ARM processorThis is an ARM processor”SENTB SENTB LDR R3,=BLKADDRESSLDR R3,=BLKADDRESSANDS R2,R2,#0X40ANDS R2,R2,#0X40FIELD 4FIELD 4ARE
29、AR RoutineA,Code,READONLYAREAR RoutineA,Code,READONLYMOV R10,#0XFF00MOV R10,#0XFF00SUB1 MOV R6,#100SUB1 MOV R6,#100SEC:MOV R8,#0X200FSEC:MOV R8,#0X200Floop Mov R2,#3loop Mov R2,#3B LoopB Loop355.1.4 ARM汇编语言指示符汇编语言指示符nARM汇编语言程序指示符的英文原文是汇编语言程序指示符的英文原文是directive,ARM指示符相当于指示符相当于x86处理器汇处理器汇编语言程序中的伪指令。编语言
30、程序中的伪指令。nARM指示符语句与指示符语句与ARM机器指令不存在一机器指令不存在一一对应的关系,它指示汇编器在汇编目标一对应的关系,它指示汇编器在汇编目标代码时进行变量定义、存储单元分配等操代码时进行变量定义、存储单元分配等操作。作。nARM指示符大致可以分成指示符大致可以分成6种类型,分别是:种类型,分别是:符号定义、数据定义、汇编控制、框架控符号定义、数据定义、汇编控制、框架控制、信息报告和杂项。制、信息报告和杂项。36n nAREA指示符用于定义一个代码段或者数据段。指示符用于定义一个代码段或者数据段。n n语法格式语法格式语法格式语法格式n nAREA sectionnameARE
31、A sectionname,attrattr,attr.attr.n n其中:其中:其中:其中:n nsectionnamesectionname为所定义的代码段或者数据段的名称。如为所定义的代码段或者数据段的名称。如为所定义的代码段或者数据段的名称。如为所定义的代码段或者数据段的名称。如果该名称是以数字开头的,则该名称必须用果该名称是以数字开头的,则该名称必须用果该名称是以数字开头的,则该名称必须用果该名称是以数字开头的,则该名称必须用“”括括括括起来,如起来,如起来,如起来,如1_datasec1_datasec。还有一些代码段具有约定的。还有一些代码段具有约定的。还有一些代码段具有约定的
32、。还有一些代码段具有约定的名称,如名称,如名称,如名称,如.text.text表示表示表示表示C C语言编译器产生的代码段或者语言编译器产生的代码段或者语言编译器产生的代码段或者语言编译器产生的代码段或者是与是与是与是与C C语言库相关的代码段。语言库相关的代码段。语言库相关的代码段。语言库相关的代码段。n nAttrAttr是该代码段是该代码段是该代码段是该代码段(或者程序段或者程序段或者程序段或者程序段)的属性。的属性。的属性。的属性。n n在在在在AREAAREA指示符中,各属性间用逗号隔开。指示符中,各属性间用逗号隔开。指示符中,各属性间用逗号隔开。指示符中,各属性间用逗号隔开。(一)
33、(一)AREA指示符指示符37AREA的属性的属性n n下面列举主要的属性:下面列举主要的属性:n nALIGN=expressionALIGN=expression。默认的情况下,。默认的情况下,。默认的情况下,。默认的情况下,ELFELF的代的代的代的代码段和数据段是码段和数据段是码段和数据段是码段和数据段是4 4字节对齐的。字节对齐的。字节对齐的。字节对齐的。n nExpressionExpression可以取可以取可以取可以取0 03131的数值,相应的对齐方式为的数值,相应的对齐方式为的数值,相应的对齐方式为的数值,相应的对齐方式为(2(2expressionexpression)字
34、节对齐。如字节对齐。如字节对齐。如字节对齐。如expression=3expression=3时为时为时为时为8 8字节对齐。字节对齐。字节对齐。字节对齐。n nASSOC=sectionASSOC=section。指定与本段相关的。指定与本段相关的。指定与本段相关的。指定与本段相关的ELFELF段。段。段。段。任何时候连接任何时候连接任何时候连接任何时候连接sectionsection段也必须包括段也必须包括段也必须包括段也必须包括sectionnamesectionname段。段。段。段。n nCODECODE 定义代码段。默认属性为定义代码段。默认属性为定义代码段。默认属性为定义代码段。
35、默认属性为READONLYREADONLY。n nCOMDEF COMDEF 定义一个通用的段。该段可以包含定义一个通用的段。该段可以包含定义一个通用的段。该段可以包含定义一个通用的段。该段可以包含代码或者数据。在个源文件中,同名的代码或者数据。在个源文件中,同名的代码或者数据。在个源文件中,同名的代码或者数据。在个源文件中,同名的COMDEFCOMDEF段必须相同。段必须相同。段必须相同。段必须相同。38AREA的属性(续)的属性(续)n nCOMMON COMMON 定义一个通用的段。该段不包含任何定义一个通用的段。该段不包含任何定义一个通用的段。该段不包含任何定义一个通用的段。该段不包含
36、任何用户代码和数据,连接器将其初始化为用户代码和数据,连接器将其初始化为用户代码和数据,连接器将其初始化为用户代码和数据,连接器将其初始化为0 0。各源。各源。各源。各源文件中同名的文件中同名的文件中同名的文件中同名的COMMON COMMON 段公用同样的内存单元,段公用同样的内存单元,段公用同样的内存单元,段公用同样的内存单元,连接器为其分配合适的尺寸。连接器为其分配合适的尺寸。连接器为其分配合适的尺寸。连接器为其分配合适的尺寸。n nDATADATA 定义数据段。默认属性为定义数据段。默认属性为定义数据段。默认属性为定义数据段。默认属性为READWRITEREADWRITE。n nNOI
37、NIT NOINIT 指定本数据段仅仅保留了内存单元,而指定本数据段仅仅保留了内存单元,而指定本数据段仅仅保留了内存单元,而指定本数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将个内存单没有将各初始值写入内存单元,或者将个内存单没有将各初始值写入内存单元,或者将个内存单没有将各初始值写入内存单元,或者将个内存单元值初始化为元值初始化为元值初始化为元值初始化为0 0。n nREADONLY READONLY 指定本段为只读,代码段的默认属指定本段为只读,代码段的默认属指定本段为只读,代码段的默认属指定本段为只读,代码段的默认属性为性为性为性为READONLYREADONLY。n n
38、READWRITE READWRITE 指定本段为可读可写,数据段的指定本段为可读可写,数据段的指定本段为可读可写,数据段的指定本段为可读可写,数据段的默认属性为默认属性为默认属性为默认属性为READWRITEREADWRITE。39AREA指示符举例指示符举例n n举例举例n n下面的指示符定义了一个代码段,代码段下面的指示符定义了一个代码段,代码段下面的指示符定义了一个代码段,代码段下面的指示符定义了一个代码段,代码段的名称为的名称为的名称为的名称为Mainpro Mainpro,属性为,属性为,属性为,属性为READONLYREADONLY。AREA Mainpro,CODE,READO
39、NLYAREA Mainpro,CODE,READONLY;code segment;code segment40(二)(二)ENTRY指示符指示符n nENTRY指示符指定程序的入口点指示符指定程序的入口点n n语法格式语法格式语法格式语法格式n nENTRYENTRYn n使用说明使用说明使用说明使用说明n n一个程序一个程序一个程序一个程序(可以包含多个源文件可以包含多个源文件可以包含多个源文件可以包含多个源文件)中至少要有一个中至少要有一个中至少要有一个中至少要有一个ENTRY(ENTRY(可以有多个可以有多个可以有多个可以有多个ENTRY)ENTRY),但一个源文件中,但一个源文件中
40、,但一个源文件中,但一个源文件中最多只能有一个最多只能有一个最多只能有一个最多只能有一个ENTRY(ENTRY(可以没有可以没有可以没有可以没有ENTRY)ENTRY)。n n示例示例示例示例AREA example,CODE,READONLYAREA example,CODE,READONLYENTRY ;ENTRY ;应用程序的入口点应用程序的入口点应用程序的入口点应用程序的入口点41(三)(三)CODE16和和CODE32指示符指示符n nCODE16指示符告诉汇编编译器后面的指令序列指示符告诉汇编编译器后面的指令序列为为16位的位的Thumb指令。指令。n nCODE32指示符告诉汇编
41、编译器后面的指令序列指示符告诉汇编编译器后面的指令序列为为32位的位的ARM指令。指令。n n语法格式语法格式语法格式语法格式 CODE16/CODE32CODE16/CODE32n n使用说明使用说明使用说明使用说明 当汇编源程序中同时包含当汇编源程序中同时包含当汇编源程序中同时包含当汇编源程序中同时包含ARMARM指令和指令和指令和指令和ThumbThumb指令时,使用指令时,使用指令时,使用指令时,使用CODE16CODE16指示符告诉汇编编译器后面的指示符告诉汇编编译器后面的指示符告诉汇编编译器后面的指示符告诉汇编编译器后面的指令序列为指令序列为指令序列为指令序列为1616位的位的位的
42、位的ThumbThumb指令;使用指令;使用指令;使用指令;使用CODE32CODE32指示符指示符指示符指示符告诉汇编编译器后面的指令序列为告诉汇编编译器后面的指令序列为告诉汇编编译器后面的指令序列为告诉汇编编译器后面的指令序列为3232位的位的位的位的ARMARM指令。指令。指令。指令。但是,但是,但是,但是,CODE16CODE16指示符和指示符和指示符和指示符和CODE32CODE32指示符只是告诉编指示符只是告诉编指示符只是告诉编指示符只是告诉编译器后面指令的类型,该指示符本身并不进行程序状译器后面指令的类型,该指示符本身并不进行程序状译器后面指令的类型,该指示符本身并不进行程序状译
43、器后面指令的类型,该指示符本身并不进行程序状态的切换。态的切换。态的切换。态的切换。42CODE16/CODE32举例举例在下面的例子中,程序先在在下面的例子中,程序先在在下面的例子中,程序先在在下面的例子中,程序先在ARMARM状态下执行,然后通状态下执行,然后通状态下执行,然后通状态下执行,然后通过过过过BXBX指令切换到指令切换到指令切换到指令切换到ThumbThumb状态,并跳转到相应的状态,并跳转到相应的状态,并跳转到相应的状态,并跳转到相应的ThumbThumb指令处执行。在指令处执行。在指令处执行。在指令处执行。在ThumbThumb程序入口处用程序入口处用程序入口处用程序入口处
44、用CODE16CODE16指示符标识下面的指令为指示符标识下面的指令为指示符标识下面的指令为指示符标识下面的指令为ThumbThumb指令。参看下面的指指令。参看下面的指指令。参看下面的指指令。参看下面的指令段:令段:令段:令段:.AREA ChangeState,CODE,READONLYAREA ChangeState,CODE,READONLYCODE32 CODE32;指示下面的指令为指示下面的指令为指示下面的指令为指示下面的指令为ARMARM指令指令指令指令LDR r0,=start+1LDR r0,=start+1BX r0 BX r0 ;切换到切换到切换到切换到ThumbThum
45、b,并跳转到,并跳转到,并跳转到,并跳转到startstart处执行处执行处执行处执行CODE16 CODE16 ;指示下面的指令为指示下面的指令为指示下面的指令为指示下面的指令为ThumbThumb指令指令指令指令startstart MOV r1,#10MOV r1,#1043(四)(四)EQU指示符指示符n nEQU指示符为数字常量、基于寄存器的指示符为数字常量、基于寄存器的值和程序中的标号值和程序中的标号(基于基于PC的值的值)定义一个定义一个字符名称。字符名称。n n*是是EQU的同义词。的同义词。n n语法格式语法格式语法格式语法格式n nname EQU expr,typenam
46、e EQU expr,typen n其中:其中:其中:其中:n nexprexpr为基于寄存器的地址值、程序中的标号、为基于寄存器的地址值、程序中的标号、为基于寄存器的地址值、程序中的标号、为基于寄存器的地址值、程序中的标号、3232位的地址常量或者位的地址常量或者位的地址常量或者位的地址常量或者3232位的常量。位的常量。位的常量。位的常量。n nnamename为为为为EQUEQU指示符为指示符为指示符为指示符为exprexpr定义的字符名称。定义的字符名称。定义的字符名称。定义的字符名称。n ntype type 当当当当exprexpr为为为为3232位常量时,可以使用位常量时,可以使
47、用位常量时,可以使用位常量时,可以使用typetype指示指示指示指示exprexpr表示的数据的类型。表示的数据的类型。表示的数据的类型。表示的数据的类型。44EQU(续)(续)n ntypetype有下面有下面有下面有下面3 3种取值种取值种取值种取值:n nCODE16CODE16n nCODE32CODE32n nDATADATAn n使用说明使用说明使用说明使用说明n nEQUEQU指示符的作用类似于指示符的作用类似于指示符的作用类似于指示符的作用类似于C C语言中的语言中的语言中的语言中的#define#define,用于为,用于为,用于为,用于为一个常量定义字符名称。一个常量定义
48、字符名称。一个常量定义字符名称。一个常量定义字符名称。n n示例示例示例示例n nabcd EQU 2 abcd EQU 2 ;定义定义定义定义abcdabcd符号的值为符号的值为符号的值为符号的值为2 2n nabcd EQU label+16abcd EQU label+16;定义定义定义定义abcdabcd符号的值符号的值符号的值符号的值(label+16)(label+16)n naddr1 EQU 0 xlC,CODE32 addr1 EQU 0 xlC,CODE32;定义定义定义定义addr1addr1符号值为符号值为符号值为符号值为;绝对地址值绝对地址值绝对地址值绝对地址值0 x
49、lC0 xlC,而且该处为,而且该处为,而且该处为,而且该处为ARMARM指令。指令。指令。指令。45(五)(五)ROUT指示符指示符n nROUTROUT指示符用于标记局部标号使用范围的边界。指示符用于标记局部标号使用范围的边界。指示符用于标记局部标号使用范围的边界。指示符用于标记局部标号使用范围的边界。用法如下:用法如下:用法如下:用法如下:n nNAME ROUTNAME ROUTn n使用说明:使用说明:使用说明:使用说明:NAMENAME是指定作用范围的名称是指定作用范围的名称是指定作用范围的名称是指定作用范围的名称使用使用使用使用ROUTROUT指示符用于规定局部标号的使用范指示符
50、用于规定局部标号的使用范指示符用于规定局部标号的使用范指示符用于规定局部标号的使用范围。避免无意之中用错局部标号导致的越界。围。避免无意之中用错局部标号导致的越界。围。避免无意之中用错局部标号导致的越界。围。避免无意之中用错局部标号导致的越界。如:如:如:如:SUB1 ROUTSUB1 ROUT SUB1 ROUTSUB1 ROUT46ROUT(续续)ROUTA ROUT ;ROUTA ROUT ;定义局部标号有效范围定义局部标号有效范围定义局部标号有效范围定义局部标号有效范围,名称为名称为名称为名称为ROUTAROUTA3ROUTA3ROUTA;定义定义定义定义ROUTAROUTA中的局部标
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100