汇编语言程序设计习题PPT学习教案_第1页
汇编语言程序设计习题PPT学习教案_第2页
汇编语言程序设计习题PPT学习教案_第3页
汇编语言程序设计习题PPT学习教案_第4页
汇编语言程序设计习题PPT学习教案_第5页
已阅读5页,还剩109页未读 继续免费阅读

下载本文档

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

文档简介

1、会计学1 汇编语言程序设计习题汇编语言程序设计习题 2 5.1 ARM汇编语言程序汇编语言程序 格式格式n两种两种ARM汇编语言格式汇编语言格式 nARM汇编语言程序格式主要有两种:汇编语言程序格式主要有两种: n基于基于ADS1.2集成开发环境的汇编器格式集成开发环境的汇编器格式 n包括包括SDT在内,统称为在内,统称为ADS n基于基于Linux的的GNU汇编器格式汇编器格式 n在本章主要介绍基于在本章主要介绍基于ARM公司公司ADS集成开发环境汇编器格集成开发环境汇编器格 式的汇编语言程序设计。式的汇编语言程序设计。 n在后面将介绍基于在后面将介绍基于GNU汇编器的汇编器的ARM汇编语言

2、程序编写汇编语言程序编写 方法。方法。 第1页/共114页 3 预定义寄存器名及内部变量名预定义寄存器名及内部变量名 nARM汇编器中将几十个寄存器汇编器中将几十个寄存器 名称作为保留字预先给与了定名称作为保留字预先给与了定 义,这些预定义寄存器名都是义,这些预定义寄存器名都是 大小写敏感的,它们都与具体大小写敏感的,它们都与具体 的寄存器一一对应。参看下面的寄存器一一对应。参看下面 的表格。的表格。 第2页/共114页 4 ARM公司公司ADS预定义的寄预定义的寄 存器名一览表存器名一览表 预定义寄存器名预定义寄存器名描述描述 r0-r15 and R0- R15 ARM处理器的通用寄存器处

3、理器的通用寄存器 a1-a4入口参数,处理结果,暂存寄存器;入口参数,处理结果,暂存寄存器; r0-r3的同义词的同义词 v1-v8变量寄存器,变量寄存器,r4-r11 sb and SB静态基址寄存器,静态基址寄存器,r9 sl and SL栈界限寄存器,栈界限寄存器,r10 fp and FP帧指针寄存器,帧指针寄存器,r11 ip and IP内部过程调用暂存寄存器,内部过程调用暂存寄存器,r12 sp and SP 栈指针寄存器,栈指针寄存器,r13 第3页/共114页 5 ARM公司公司ADS预定义预定义 的寄存器名一览表的寄存器名一览表 (续)(续) 预定义寄存器名预定义寄存器名描

4、述描述 lr and LR连接寄存器,连接寄存器,r14 pc and PC程序寄存器,程序寄存器,r15 cpsr and CPSR当前程序状态寄存器当前程序状态寄存器 spsr and SPSR保存的程序状态寄存器保存的程序状态寄存器 f0-f7 and F0-F7浮点数运算加速寄存器浮点数运算加速寄存器 s0-s31 and S0-S31单精度向量浮点数运算寄存器单精度向量浮点数运算寄存器 d0-d15 and D0-D15双精度向量浮点数运算寄存器双精度向量浮点数运算寄存器 p0-p15协处理器协处理器0-15 c0-c15协处理器寄存器协处理器寄存器0-15 第4页/共114页 6

5、ARM汇编语言程序的部分内部变汇编语言程序的部分内部变 量名清单量名清单 内部变量内部变量描述描述 PC or .当前指令地址当前指令地址 VAR or 内存区定位计数器的当前值内存区定位计数器的当前值 TRUE逻辑值真逻辑值真 FALSE逻辑值假逻辑值假 CONFIG汇编器如果在汇编汇编器如果在汇编ARM指令,取值为指令,取值为32,如果汇,如果汇 编编Thumb指令,取值指令,取值16 ENDIAN如果汇编器是大端序,则取值如果汇编器是大端序,则取值big;如果是小端序,;如果是小端序, 则取值则取值little。 CPU被选择的被选择的CPU名称。缺省值是名称。缺省值是ARM7TDMI。

6、 ARCHITECT URE 该变量内容是被选择的该变量内容是被选择的ARM体系结构的名称。如:体系结构的名称。如: 3, 3M, 4T CODESIZECONFIG的同义词的同义词 第5页/共114页 7 ARM汇编语言程序的汇编语言程序的 语句格式语句格式 nARM汇编语言程序的语句格式汇编语言程序的语句格式 格式如下:格式如下: symbol instruction | directive | pseudo-instruction ;comment n对应的中文语句格式描述是:对应的中文语句格式描述是: 符号符号 (标号标号) 指令指令 | 指示符指示符 | 伪伪 指令指令 ;注释注释

7、n语句格式中,花括号括起来的语句格式中,花括号括起来的 部分表示可以省略;竖线分隔部分表示可以省略;竖线分隔 的字段表示可以替换。的字段表示可以替换。 第6页/共114页 8 ARM汇编语言程序中的符号汇编语言程序中的符号 nARM汇编语句中的符号可以是汇编语句中的符号可以是 指令地址或标号、变量、常量指令地址或标号、变量、常量 和局部标号,符号属性可以是和局部标号,符号属性可以是 程序相关的、寄存器相关的或程序相关的、寄存器相关的或 者是绝对地址。者是绝对地址。 第7页/共114页 9 (一)符号命名和书写规则(一)符号命名和书写规则 n符号的命名和书写有以下规则:符号的命名和书写有以下规则

8、: 符号命名可以使用大小写字母,符号命名可以使用大小写字母, 数字和下划线。数字和下划线。 符号是大小写字母敏感的。符号是大小写字母敏感的。 除本地行号外,名称不能以数字除本地行号外,名称不能以数字 开头。开头。 一个程序段中不能重名。一个程序段中不能重名。 符号在其作用范围内必须唯一。符号在其作用范围内必须唯一。 符号不能够与系统内部变量或者符号不能够与系统内部变量或者 系统预定义的符号同名。例如:系统预定义的符号同名。例如: a1 or R0、sp、cpsr、PC or .、 VAR or 、CONFIG、CPU 等等。等等。 第8页/共114页 10 符号命名和书写规则(续)符号命名和书

9、写规则(续) 当程序中的符号与指令助记符或当程序中的符号与指令助记符或 者指示符同名时,用双竖线将符者指示符同名时,用双竖线将符 号括起来。如号括起来。如|buffe_a|,这时,这时 双竖线并不是符号的组成部分。双竖线并不是符号的组成部分。 在在ARM汇编语言程序中,所有符汇编语言程序中,所有符 号必须在一行的最左边位置开始号必须在一行的最左边位置开始 书写,即所谓的顶格书写,不允书写,即所谓的顶格书写,不允 许包含空格或者制表符。许包含空格或者制表符。 符号的字符序列中不能大小写字符号的字符序列中不能大小写字 母相混杂。母相混杂。 第9页/共114页 11 (二)常量(二)常量 nARM汇

10、编语言中使用到的常量汇编语言中使用到的常量 可以是数字常量、字符常量、可以是数字常量、字符常量、 字符串常量和布尔常量。字符串常量和布尔常量。 n数字常量有以下数字常量有以下3种表示方式:种表示方式: 1)十进制数,如:)十进制数,如:535,246。 2)十六进制数,如:)十六进制数,如:0 x645,0 xff00。 3)n进制数,格式为进制数,格式为n_XXX,其中,其中 n表示表示n进制,从进制,从29,XXX是具是具 体的数字。体的数字。 例如:例如:8_3777,8_5237702 数字常量数字常量 第10页/共114页 12 字符常量字符常量 n字符常量由一对单引号括起来,包括一

11、个单字符或者标准字符常量由一对单引号括起来,包括一个单字符或者标准C中的转中的转 义字符。义字符。 n例如:例如:A,n。 n字符串常量由一对双引号以及由它括住的一组字符串组成,包括字符串常量由一对双引号以及由它括住的一组字符串组成,包括 标准标准C中的转义字符。如果需要使用双引号或字符中的转义字符。如果需要使用双引号或字符$,则必须用,则必须用” 和和$代替。代替。 n例如执行语句:例如执行语句:strtwo SETS “This is character of ” 其编译结果是:字符串其编译结果是:字符串“This is character of ”被赋值给被赋值给strtwo变变 量。量

12、。 第11页/共114页 13 $在汇编语句中的使用举例在汇编语句中的使用举例 GBLS add4ff add4ff 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 count count SETA 14 s1 SETS a$b$count ; s1 now has value a$b0000000E s2 SETS abc

13、Fixup SETS |xy$s2.z| ; fixup now has value |xyabcz| |C$code| MOV r4,#16 ; but the label here is C$code 第12页/共114页 14 逻辑值常量逻辑值常量 n布尔常量布尔常量TRUE和和FALSE在表在表 达式中写为:达式中写为:TRUE, FALSE。 第13页/共114页 15 (三)表达式(三)表达式 nARM汇编语言中的表达式由符号、数值、汇编语言中的表达式由符号、数值、 单目操作符、双目操作符以及括号组成。单目操作符、双目操作符以及括号组成。 运算的优先级次序与标准运算的优先级次序与标

14、准C一样。一样。 第14页/共114页 16 字符串表达式字符串表达式 n字符串由字符串常量、字符串字符串由字符串常量、字符串 变量、操作符以及括号组成。变量、操作符以及括号组成。 最大长度为最大长度为512字节,最短字节,最短0个字个字 节。字符串表达式的组成元素节。字符串表达式的组成元素 有:字符串常量、字符串变量、有:字符串常量、字符串变量、 操作符等。字符串常量由包含操作符等。字符串常量由包含 在双引号内的一系列字符组成。在双引号内的一系列字符组成。 当在字符串中包含美元符号当在字符串中包含美元符号$或或 者引号者引号”时,用时,用$表示一个表示一个$, 用用”表示一个表示一个”。字符

15、串变。字符串变 量用指示符量用指示符GBLS(全局字符串)(全局字符串) 或者或者LCLS(局部字符串)声明,(局部字符串)声明, 用用SETS赋值。取值范围与字符赋值。取值范围与字符 表达式相同。表达式相同。 第15页/共114页 17 ARM汇编语言中的字符串操作符汇编语言中的字符串操作符 操作符操作符功能功能操作符操作符功能功能 LEN返回字符串的返回字符串的 长度长度 CHR将将0255之间整数之间整数 变为单个字符变为单个字符 STR将一个数字量将一个数字量 变换为串变换为串 LEFT返回字符串的左子返回字符串的左子 串串 RIGHT返回字符串的返回字符串的 右子串右子串 CC连接两

16、个字符串连接两个字符串 第16页/共114页 18 XCCY;返回字符串;返回字符串X和和Y连连 接的字符串接的字符串 第17页/共114页 19 数字表达式数字表达式 n数字表达式由数字常量、数字数字表达式由数字常量、数字 变量、操作符和括号组成。数变量、操作符和括号组成。数 字表达式表示的是一个字表达式表示的是一个32位数位数 的整数,其取值范围为的整数,其取值范围为0232-1; 当作为有符号数时,其取值范当作为有符号数时,其取值范 围为围为-231231-1。 n汇编器对汇编器对-n和和232-n不做区别,不做区别, 汇编时对关系运算符采用无符汇编时对关系运算符采用无符 号数方式处理,

17、这就意味着号数方式处理,这就意味着 0- 1是是FALSE。 第18页/共114页 20 逻辑表达式逻辑表达式 n逻辑表达式由逻辑常量、逻辑逻辑表达式由逻辑常量、逻辑 操作符、关系操作符以及括号操作符、关系操作符以及括号 组成。取值范围为组成。取值范围为FALSE和和 TRUE。 第19页/共114页 21 (四)地址标号(四)地址标号 n当符号代表地址时称为标号当符号代表地址时称为标号 (Label)。)。 n以数字开头的标号其作用范围以数字开头的标号其作用范围 是当前段(没有使用是当前段(没有使用ROUT指指 示符时),这种标号又称为局示符时),这种标号又称为局 部标号(部标号(Local

18、 Label)。)。 第20页/共114页 22 三种类型标号三种类型标号 (1)PC相关标号相关标号 (2)寄存器相关标号)寄存器相关标号 (3)绝对地址)绝对地址 第21页/共114页 23 PC相关标号相关标号 nPC相关标号表示程序计数器加相关标号表示程序计数器加 减一个数值常数后得到的地址减一个数值常数后得到的地址 值。常用来指明一个分支指令值。常用来指明一个分支指令 的目标地址,或者访问嵌入在的目标地址,或者访问嵌入在 代码段中的一个数据项。代码段中的一个数据项。 n具体标记方法是:在汇编语言具体标记方法是:在汇编语言 程序指令的前面写入标号,或程序指令的前面写入标号,或 者在一个

19、数据指示符前面写入者在一个数据指示符前面写入 标号。通常用标号。通常用DCB或者或者DCD等等 指示符定义。指示符定义。 第22页/共114页 24 第23页/共114页 25 寄存器相关标号寄存器相关标号 n寄存器标号表示指定寄存器的值加减一个数值常寄存器标号表示指定寄存器的值加减一个数值常 数后得到的地址值。常常用于访问位于数据段中数后得到的地址值。常常用于访问位于数据段中 的数据。通常用的数据。通常用MAP或者或者FIELD等指示符定义。等指示符定义。 n格式:格式: MAPEXPR,BASEREG LABLEFIELDEXPR 如:如:MAP0 x00400000 ,R9 COUNT

20、FIELD 4 X FIELD 8 Y FIELD 8 第24页/共114页 26 绝对地址绝对地址 n绝对地址是一个绝对地址是一个32位的无符号数字常量,位的无符号数字常量, 可寻址范围是可寻址范围是0231-1。使用它可以直接寻。使用它可以直接寻 址整个地址空间。址整个地址空间。 第25页/共114页 27 (五)段内标号和段外标号(五)段内标号和段外标号 nARM处理器的地址标号分为段处理器的地址标号分为段 内标号和段外标号。段内标号内标号和段外标号。段内标号 的地址值在汇编时确定,段外的地址值在汇编时确定,段外 标号的地址值在连接时确定。标号的地址值在连接时确定。 第26页/共114页

21、 28 程序相对寻址和寄存器相对寻址程序相对寻址和寄存器相对寻址 n在程序段中标号代表其所在位在程序段中标号代表其所在位 置与段首地址的偏移量,根据置与段首地址的偏移量,根据 程序计数器和偏移量计算地址程序计数器和偏移量计算地址 称为程序相对寻址。称为程序相对寻址。 n在映像文件中定义的标号代表在映像文件中定义的标号代表 标号到映像首地址的偏移量。标号到映像首地址的偏移量。 映像的首地址通常被赋予一个映像的首地址通常被赋予一个 寄存器,根据该寄存器值与偏寄存器,根据该寄存器值与偏 移量计算地址称为寄存器相对移量计算地址称为寄存器相对 寻址。寻址。 第27页/共114页 29 (六)局部标号(六

22、)局部标号 nARM汇编语言的宏常常使用局汇编语言的宏常常使用局 部标号。局部标号提供分支指部标号。局部标号提供分支指 令在汇编程序的局部范围内进令在汇编程序的局部范围内进 行跳转,主要用途是汇编子程行跳转,主要用途是汇编子程 序中的循环和条件编码。它是序中的循环和条件编码。它是 一个一个099之间的数字,后面可之间的数字,后面可 以有选择地附带一个符号名称。以有选择地附带一个符号名称。 n局部标号特别适用于宏。局部标号特别适用于宏。 第28页/共114页 30 局部标号(续局部标号(续1) n使用使用ROUT指示符可以限制局部标号的范指示符可以限制局部标号的范 围。只能在该局部标号的范围引用

23、局部标围。只能在该局部标号的范围引用局部标 号。如果在该范围的上下两个方向都没有号。如果在该范围的上下两个方向都没有 匹配的标号,汇编器将给出一个错误信号匹配的标号,汇编器将给出一个错误信号 并停止汇编。并停止汇编。 局部标号语法格式如下:局部标号语法格式如下: nroutname 被引用的局部标号语法规则是:被引用的局部标号语法规则是: % F|B A|T n routname 第29页/共114页 31 局部标号(续局部标号(续2) n是局部标号的数字号。是局部标号的数字号。 routname是当前局部范围的名称。是当前局部范围的名称。 %表示引用操作。表示引用操作。 F指示汇编器只向前搜

24、索指示汇编器只向前搜索 B指示汇编器只向后搜索指示汇编器只向后搜索 A指示汇编器搜索宏的所有嵌套层次指示汇编器搜索宏的所有嵌套层次 T指示汇编器搜索宏的当前层次指示汇编器搜索宏的当前层次 如果如果F和和B都没有指定,则汇编器首先向前搜索,再向都没有指定,则汇编器首先向前搜索,再向 后搜索。如果后搜索。如果A和和T都没有指定,汇编器搜索从宏的都没有指定,汇编器搜索从宏的 当前层次到宏的最高层次,比当前层次低的宏不再当前层次到宏的最高层次,比当前层次低的宏不再 搜索。搜索。 第30页/共114页 32 ARM汇编语言程序编写汇编语言程序编写 规范规范 nARM汇编语言程序源代码中允许有空行,可以汇

25、编语言程序源代码中允许有空行,可以 在汇编程序中加上一个空白行,来增加程序的可在汇编程序中加上一个空白行,来增加程序的可 阅读性。此外需要注意的是:指令,指示符,伪阅读性。此外需要注意的是:指令,指示符,伪 指令前必须加空格或者指令前必须加空格或者Tab制表符,这就是说指制表符,这就是说指 令,指示符,伪指令不可以从行的最左边开始书令,指示符,伪指令不可以从行的最左边开始书 写,即不能顶格书写。写,即不能顶格书写。 n在在ARM汇编语言程序中,所有标号必须在一行汇编语言程序中,所有标号必须在一行 的最左边的位置开始书写,标号的后面不要加的最左边的位置开始书写,标号的后面不要加 “:”。指令,指

26、示符,寄存器名可以用小写字。指令,指示符,寄存器名可以用小写字 母也可以用大写字母来表示,但不能大小写字母母也可以用大写字母来表示,但不能大小写字母 相杂。相杂。 第31页/共114页 33 ARM汇编语言程序编汇编语言程序编 写规范(续)写规范(续) n当一行写不下时,可以用反斜线当一行写不下时,可以用反斜线作为这一行作为这一行 最后的符号,然后另起一行接下去写,这样汇编最后的符号,然后另起一行接下去写,这样汇编 器会将这两行代码看作一行代码。需要注意的是,器会将这两行代码看作一行代码。需要注意的是, 如果在被引号括住的字符串中使用反斜线如果在被引号括住的字符串中使用反斜线, 则反斜线则反斜

27、线不能起到续行的作用。每行的长度不能起到续行的作用。每行的长度 限制一般在限制一般在128255个字符串之间。个字符串之间。 n分号分号;除非在字符串常量中出现,否则它的出除非在字符串常量中出现,否则它的出 现就表示着注释的开始,此注释直至行尾结束。现就表示着注释的开始,此注释直至行尾结束。 可以将注释单独列为一行。所有注释被汇编器忽可以将注释单独列为一行。所有注释被汇编器忽 略。略。 第32页/共114页 34 第33页/共114页 35 5.1.4 ARM汇编语言指示符汇编语言指示符 nARM汇编语言程序指示符的英汇编语言程序指示符的英 文原文是文原文是directive,ARM指示指示

28、符相当于符相当于x86处理器汇编语言程处理器汇编语言程 序中的伪指令。序中的伪指令。 nARM指示符语句与指示符语句与ARM机器指机器指 令不存在一一对应的关系,它令不存在一一对应的关系,它 指示汇编器在汇编目标代码时指示汇编器在汇编目标代码时 进行变量定义、存储单元分配进行变量定义、存储单元分配 等操作。等操作。 nARM指示符大致可以分成指示符大致可以分成6种类种类 型,分别是:符号定义、数据型,分别是:符号定义、数据 定义、汇编控制、框架控制、定义、汇编控制、框架控制、 信息报告和杂项。信息报告和杂项。 第34页/共114页 36 库相关的代码段。库相关的代码段。 nAttr是该代码段是

29、该代码段(或者程序段或者程序段)的属性。的属性。 n在在AREA指示符中,各属性间用逗号指示符中,各属性间用逗号 隔开。隔开。 (一)(一)AREA指示符指示符 第35页/共114页 37 nCOMDEF 定义一个通用的段。该定义一个通用的段。该 段可以包含代码或者数据。在个段可以包含代码或者数据。在个 源文件中,同名的源文件中,同名的COMDEF段必段必 须相同。须相同。 第36页/共114页 38 nREADONLY 指定本段为只读,代指定本段为只读,代 码段的默认属性为码段的默认属性为READONLY。 nREADWRITE 指定本段为可读可指定本段为可读可 写,数据段的默认属性为写,数

30、据段的默认属性为 READWRITE。 第37页/共114页 39 第38页/共114页 40 AREA example, CODE, READONLY ENTRY ;应用程序的入口点应用程序的入口点 第39页/共114页 41 CODE16指示符和指示符和CODE32指示符只指示符只 是告诉编译器后面指令的类型,该指是告诉编译器后面指令的类型,该指 示符本身并不进行程序状态的切换。示符本身并不进行程序状态的切换。 第40页/共114页 42 第41页/共114页 43 nname为为EQU指示符为指示符为expr定义的定义的 字符名称。字符名称。 ntype 当当expr为为32位常量时,可

31、以使位常量时,可以使 用用type指示指示expr表示的数据的类型。表示的数据的类型。 第42页/共114页 44 naddr1 EQU 0 xlC, CODE32 ;定义定义 addr1符号值为符号值为 ;绝对地址值绝对地址值0 xlC,而且该处为,而且该处为ARM指指 令。令。 第43页/共114页 45 第44页/共114页 46 第45页/共114页 47 第46页/共114页 48 n 位置到下一个地址之间按照:位置到下一个地址之间按照: offset+n*expr的方式进行对齐的方式进行对齐 第47页/共114页 49 第48页/共114页 50 第49页/共114页 51 第50

32、页/共114页 52 第51页/共114页 53 第52页/共114页 54 1)GBLS add4ff add4ff SETS ADD r4,r4,#0 xFF“ $add4ff.00 2)xyz ROUT 3xyz B %F3 zxx ROUT 第53页/共114页 55 AAPCS n2007年年ARM公司正式推出了公司正式推出了 AAPCS标准标准 nARM Archtecture Procedure Call Standard nAAPCS是是ATPCS的改进版的改进版 n目前,目前, AAPCS和和ATPCS都是可都是可 用的标准用的标准 第54页/共114页 56 AAPCS 和

33、和ATPCS规范要点规范要点 n寄存器的使用规则寄存器的使用规则 n堆栈使用规则堆栈使用规则 n参数传递规则参数传递规则 第55页/共114页 57 ATPCS nATPCS(ARM-Thumb Procedure Call Standard)规定了一些子程序间调用的基本)规定了一些子程序间调用的基本 规则,这些规则包括子程序调用过程中寄规则,这些规则包括子程序调用过程中寄 存器的使用规则,数据栈的使用规则,参存器的使用规则,数据栈的使用规则,参 数的传递规则。有了这些规则之后,单独数的传递规则。有了这些规则之后,单独 编译的编译的C语言程序就可以和汇编程序相互调语言程序就可以和汇编程序相互调

34、 用。用。 n使用使用ADS的的C语言编译器编译的语言编译器编译的C语言子程语言子程 序满足用户指定的序满足用户指定的ATPCS类型。而对于汇类型。而对于汇 编语言来说,则需要用户来保证各个子程编语言来说,则需要用户来保证各个子程 序满足序满足ATPCS的要求。的要求。 第56页/共114页 58 寄存器的使用规则寄存器的使用规则 n子程序间通过寄存器子程序间通过寄存器R0R3来传递参数。这时,寄存器来传递参数。这时,寄存器R0R3可可 记作记作a0a3。被调用的子程序在返回前无需恢复寄存器。被调用的子程序在返回前无需恢复寄存器R0R3的的 内容。内容。 n在子程序中,使用寄存器在子程序中,使

35、用寄存器R4R11来保存局部变量。这时,寄存器来保存局部变量。这时,寄存器 R4R11可以记作可以记作v1v8。如果在子程序中使用了寄存器。如果在子程序中使用了寄存器v1v8中中 的某些寄存器,则子程序进入时必须保存这些寄存器的值,在返的某些寄存器,则子程序进入时必须保存这些寄存器的值,在返 回前必须恢复这些寄存器的值。在回前必须恢复这些寄存器的值。在Thumb程序中,通常只能使用程序中,通常只能使用 寄存器寄存器R4R7来保存局部变量。来保存局部变量。 n寄存器寄存器R12用作过程调用中间临时寄存器,记作用作过程调用中间临时寄存器,记作IP。在子程序之间。在子程序之间 的连接代码段中常常有这

36、种使用规则。的连接代码段中常常有这种使用规则。 第57页/共114页 59 寄存器的使用规则(续)寄存器的使用规则(续) n寄存器寄存器R13用作堆栈指针,记作用作堆栈指针,记作SP。在子程序中。在子程序中 寄存器寄存器R13不能用作其他用途。寄存器不能用作其他用途。寄存器SP在进入在进入 子程序时的值和退出子程序时的值必须相等。子程序时的值和退出子程序时的值必须相等。 n寄存器寄存器R14称为连接寄存器,记作称为连接寄存器,记作LR。它用于保。它用于保 存子程序的返回地址。如果在子程序中保存了返存子程序的返回地址。如果在子程序中保存了返 回地址,寄存器回地址,寄存器R14则可以用作其他用途。

37、则可以用作其他用途。 n寄存器寄存器R15是程序计数器,记作是程序计数器,记作PC。它不能用作。它不能用作 其它用途。其它用途。 第58页/共114页 60 堆栈使用规则堆栈使用规则 nATPCS规定堆栈为规定堆栈为FD类型,即类型,即 满递减堆栈,并且对堆栈的操满递减堆栈,并且对堆栈的操 作是作是8字节对齐。字节对齐。 n对于汇编程序来说,如果目标对于汇编程序来说,如果目标 文件中包含了外部调用,则必文件中包含了外部调用,则必 须满足下列条件:须满足下列条件: (1)外部接口的堆栈必须是)外部接口的堆栈必须是8字节对齐的。字节对齐的。 (2)在汇编程序中使用)在汇编程序中使用PRESERVE

38、8伪指令伪指令 告诉连接器,本汇编程序数据是告诉连接器,本汇编程序数据是8字节对字节对 齐的。齐的。 第59页/共114页 61 参数传递规则参数传递规则 n如果系统不包含浮点运算的硬件部件,浮如果系统不包含浮点运算的硬件部件,浮 点参数会通过相应的规则转换成整数参数点参数会通过相应的规则转换成整数参数 (若没有浮点参数,此步省略),然后依(若没有浮点参数,此步省略),然后依 次将各字数据传送到寄存器次将各字数据传送到寄存器R0R3中。如中。如 果参数多于果参数多于4个,将剩余的字数据传送堆栈个,将剩余的字数据传送堆栈 中,入栈的顺序与参数顺序相反,即最后中,入栈的顺序与参数顺序相反,即最后

39、一个字数据先入栈。在参数传递时,将所一个字数据先入栈。在参数传递时,将所 有参数看作是存放在连续的内存字单元的有参数看作是存放在连续的内存字单元的 字数据。字数据。 第60页/共114页 62 子程序结果返回规则子程序结果返回规则 n子程序中结果返回的规则如下:子程序中结果返回的规则如下: n结果为一个结果为一个32位整数时,可以通位整数时,可以通 过寄存器过寄存器R0返回;返回; n结果为一个结果为一个64位整数时,可以通位整数时,可以通 过寄存器过寄存器R0和和Rl返回;返回; n结果为一个浮点数时,可以通过结果为一个浮点数时,可以通过 浮点运算部件的寄存器浮点运算部件的寄存器f0、d0或

40、或 s0来返回;来返回; n结果为复合型浮点数(如复数)结果为复合型浮点数(如复数) 时,可以通过寄存器时,可以通过寄存器f0fn或或 d0dn来返回;来返回; n对于位数更多的结果,需要通过对于位数更多的结果,需要通过 内存来传递。内存来传递。 第61页/共114页 63 (一)条件执行举例(一)条件执行举例 n求求a和和b两整数最大公约数的两整数最大公约数的C程程 序序 While (a!=b) If(ab) a-=b; else b-=a; 5.2 典型典型ARM汇编语言程序举例汇编语言程序举例 第62页/共114页 64 条件执行举例(续)条件执行举例(续) n如果用如果用ARM汇编子

41、程序来实现,就是求汇编子程序来实现,就是求r1和和 r2两个寄存器中的两个整数的最大公约数。两个寄存器中的两个整数的最大公约数。 使用条件执行指令表示只有以下使用条件执行指令表示只有以下4句代码:句代码: gcd cmp r1, r2;cmp与与subs功能类功能类 似似 subgtr1, r1, r2;如果如果r1r2执行此执行此 指令指令 subltr2, r2, r1;如果如果r1r2执行此执行此 指令指令 bnegcd;如果如果r1r2则转则转 gcd标号标号 注:函数结束时注:函数结束时r1=r2,都可以用作返回值。,都可以用作返回值。 第63页/共114页 65 (二)(二)32位

42、地址送入一位地址送入一 个寄存器中个寄存器中 n下面指令段中的下面指令段中的load指令根据输入参数决定调用指令根据输入参数决定调用 那个函数。具体做法是将函数的绝对地址通过那个函数。具体做法是将函数的绝对地址通过 LDR指令存入在指令存入在r4寄存器中,由于是寄存器中,由于是32的绝对地的绝对地 址,址,LDR会被解释成以下操作:将函数的绝对会被解释成以下操作:将函数的绝对 地址放入一个文字池(地址放入一个文字池(Literal pool,嵌入在代码,嵌入在代码 中的用以存放常数的区域)。产生一条形如:中的用以存放常数的区域)。产生一条形如: LDR rn pc, #offset to li

43、teral pool的指令来将这的指令来将这 个绝对地址读入到指定的寄存器中。个绝对地址读入到指定的寄存器中。 n类似地类似地LDR指令也通过上述方法读入一个指令也通过上述方法读入一个32位的位的 绝对数。在下例中,绝对数。在下例中,LDR指令将指令将32位绝对数位绝对数 0 x11552634读入到读入到r0寄存器中,用作调用寄存器中,用作调用routine1 或者或者routine2的参数。的参数。 第64页/共114页 66 32位地址送入一个寄存位地址送入一个寄存 器中(续)器中(续) ;void load(int i) ;void routine1(int 1); ;void rou

44、tine2(int 2); AREA LOAD, CODE, READONLY IMPORT routine1 IMPORT routine2 EXPORT load load stmfdr13!, r4, r14 ldrr4, = routine1 ;首先将首先将32位地址存放在位地址存放在 附近的区域附近的区域 cmps r0, #1 ldrner4, = routine2 ldrr0 = 0 x11552634;函数的第函数的第1个个int参数参数 bxr4 ldmfdr13!, r4, r14 bxr14 第65页/共114页 67 (三)从(三)从IRQ和和FIQ异常异常 处理程序返

45、回处理程序返回 n从从IRQ和和FIQ异常处理程序返回时,返回地异常处理程序返回时,返回地 址应该是址应该是LR-4。 n有三种不同的编程方法,分别列出如下:有三种不同的编程方法,分别列出如下: n返回方式返回方式1 INT_HANDLER SUBS PC, LR, #4; PC=R14-4 第66页/共114页 68 从从IRQ和和FIQ异常处理程异常处理程 序返回(序返回(2) n返回方式返回方式2 INT_HANDLER SUB R14, R14, #4; R14 -=4 MOVS PC, LR 第67页/共114页 69 从从IRQ和和FIQ异常处理程异常处理程 序返回(序返回(3)

46、n返回方式返回方式3 INT_HANDLER SUB R14, R14, #4; R14 = R14 4 STMFD R13!, R0-R3, R14 LDMFD R13!, R0-R3, R15 第68页/共114页 70 (四)(四) 循环结构循环结构 n在在ARM汇编中,没有专门的指令用来实现循环,汇编中,没有专门的指令用来实现循环, 一般通过跳转指令加条件码的形式来实现。可一般通过跳转指令加条件码的形式来实现。可 以采用比较指令以采用比较指令CMP或者减法指令或者减法指令SUB等实现。等实现。 参看下面的指令段:参看下面的指令段: LOOP ADDR4, R4, R0 ADDR0, R

47、0, #1 CMPR0, R1 BLELOOP ; R0小于等于小于等于R1场合跳场合跳 转转 n在做完了两次加法操作后,比较在做完了两次加法操作后,比较R0,R1的值,的值, 影响条件标志。最后的条件跳转语句根据影响条件标志。最后的条件跳转语句根据CMP 指令执行的结果来决定是否进行循环。指令执行的结果来决定是否进行循环。 第69页/共114页 71 (五)(五) 调用调用ARM汇编汇编 语言子程序语言子程序 n在在ARM汇编语言中,子程序调用是通过汇编语言中,子程序调用是通过BL指令指令 完成的。完成的。BL指令的语法格式如下:指令的语法格式如下: nBL subname n其中,其中,s

48、ubname是调用的子程序的名称。是调用的子程序的名称。 nBL指令完成两个操作:将子程序的返回地址放在指令完成两个操作:将子程序的返回地址放在 LR寄存器中,同时将寄存器中,同时将PC寄存器值设置成目标子寄存器值设置成目标子 程序的第一条指令地址。程序的第一条指令地址。 n在子程序返回时可以通过将在子程序返回时可以通过将LR寄存器的值传送到寄存器的值传送到 PC寄存器中来实现。寄存器中来实现。 n子程序调用时通常使用寄存器子程序调用时通常使用寄存器R0R3来传递参数来传递参数 和返回结果。和返回结果。 第70页/共114页 72 调用汇编子程序举例调用汇编子程序举例 n子程序子程序DOADD

49、完成加法运算,操作数放在完成加法运算,操作数放在R0和和R1 寄存器中,结果放在寄存器中,结果放在R0中。中。 AREA EXAMPLE2, CODE, READONLY ENTRY startMOV r0, #10;R0设置输入参数设置输入参数 MOV r1, #3 ;R1设置输入参设置输入参 数数 BLdoadd;调用子调用子 程序程序doadd doaddADD r0, r0, r1 ;子程序实体子程序实体 MOV pc,lr ;从子程从子程 序中返回序中返回 END 第71页/共114页 73 第72页/共114页 74 (七)(七) 数据块复制数据块复制 示范程序示范程序 n本程序将

50、数据从源数据区复制到目标数据区本程序将数据从源数据区复制到目标数据区 n复制时,以复制时,以8个字为单位进行。个字为单位进行。 n对于最后所剩不足对于最后所剩不足8个字的数据,以字为单个字的数据,以字为单 位进行复制,这时程序跳转到位进行复制,这时程序跳转到copywords处处 执行。执行。 n在进行以在进行以8个字为单位的数据复制时,保存个字为单位的数据复制时,保存 了所用的了所用的8个工作寄存器。程序清单如下面个工作寄存器。程序清单如下面 所示。所示。 第73页/共114页 75 数据块复制示范程序(数据块复制示范程序(1) AREA Block, CODE, READONLY ;设置段

51、名称及属性;设置段名称及属性 num EQU 20 ;设置将要复制的字数;设置将要复制的字数 ENTRY ;标识程序入口点;标识程序入口点 Start LDR r0, =src;r0寄存器指向源数据区寄存器指向源数据区src LDR r1, =dst;r1寄存器指向目标数据区寄存器指向目标数据区dst 第74页/共114页 76 数据块复制示范程序(数据块复制示范程序(2) MOV r2, #num;r2指定将要复制的字数指定将要复制的字数 MOV sp, #0 x400;设置数据栈指针;设置数据栈指针(r13),用于保存工作寄存,用于保存工作寄存 器数值器数值 blockcopy ;进行以;

52、进行以8个字为单位的数据复制个字为单位的数据复制 MOVS r3,r2,LSR #3;需要进行的以;需要进行的以8个字为单位的复制次数个字为单位的复制次数 BEQ copywords ;对于剩下不足;对于剩下不足8个字的数据,跳转到个字的数据,跳转到 copywords,以字为单位复制,以字为单位复制 STMFD sp!,r4r11 ;保存工作寄存器,压栈;保存工作寄存器,压栈 octcopy LDMIA r0!, r4-r11 ;从源数据区读取;从源数据区读取8个字的数据,放到个字的数据,放到8个寄个寄 存器中,并更新目标数据区指针存器中,并更新目标数据区指针r0 STMIA r1!, r4

53、-r11 ;将这;将这8个字数据写入到目标数据区中,并个字数据写入到目标数据区中,并 更新目标数据区指针更新目标数据区指针r1 SUBS r3, r3, #1 ;将块复制次数减;将块复制次数减1 BNE octcopy ;循环,直到完成以;循环,直到完成以8个字为单位的个字为单位的 块复制块复制 LDMFD sp!, r4-r11 ;恢复工作寄存器值,出栈;恢复工作寄存器值,出栈 第75页/共114页 77 数据块复制示范程序(数据块复制示范程序(3) copywords ANDS r2, r2, #7;剩下不足;剩下不足8个字的数据的字个字的数据的字 数数 BEQ stop ;数据复制完成;

54、数据复制完成 wordcopy LDR r3, r0, #4 ;从源数据区读取;从源数据区读取1个字的数个字的数 据,据, 放到放到r3寄存器中,并寄存器中,并 更新目标数更新目标数 据区指针据区指针r0,后索引,后索引 偏移偏移 STR r3, r1, #4 ;将这;将这r3中数据写入到目标数中数据写入到目标数 据据 区中,并更新目标数区中,并更新目标数 据区指针据区指针 r1,后索引偏移,后索引偏移 第76页/共114页 78 数据块复制示范程序(数据块复制示范程序(4) SUBS r2, r2, #l ;将字数减;将字数减1 BNE wordcopy;循环,直到完成以字为单位的数据复制;

55、循环,直到完成以字为单位的数据复制 STOP AREA BlockData, DATA, READWRITE ;定义数据;定义数据 区区BlockData src DCD 1,2,3,4,5,6,7,8,1, 2,3,4,5,6,7,8,1,2,3,4 dst DCD 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0;定义源数据区;定义源数据区src及及 目标数目标数 据区据区dst END ;结束汇编;结束汇编 第77页/共114页 79 第78页/共114页 80 5.3 ARM汇编、汇编、C和和 C+混合编程混合编程 n在在C/C+程序中如果必须使用程序中

56、如果必须使用 汇编指令来完成某些操作,可汇编指令来完成某些操作,可 以采用两种方法:以采用两种方法: n1.采用内嵌汇编,即在采用内嵌汇编,即在C/C+ 源程序中嵌入一块汇编代码,源程序中嵌入一块汇编代码, 让这块汇编代码来完成特定的让这块汇编代码来完成特定的 操作;操作; n2.将必须使用汇编代码的部分独将必须使用汇编代码的部分独 立编写成在一个文件中,形成立编写成在一个文件中,形成 一个子程序,一个子程序,C/C+程序可以程序可以 调用这些汇编程序来完成特定调用这些汇编程序来完成特定 的操作。的操作。 第79页/共114页 81 5.3.1 内嵌汇编内嵌汇编 n内嵌汇编(内嵌汇编(inli

57、ne assembly) 的语法如下:的语法如下: _asm 指令指令;指令指令 /* 注释注释 */ 指令指令 第80页/共114页 82 内嵌汇编的指令用法内嵌汇编的指令用法 n内嵌在内嵌在C或者或者C+程序中的程序中的 ARM汇编指令与普通(汇编指令与普通(ADS) 格式的格式的ARM汇编指令有所不同。汇编指令有所不同。 其主要原因在于其主要原因在于C/C+编译器编译器 在编译在编译C/C+源代码的同时要源代码的同时要 兼顾处理内嵌汇编程序,因此兼顾处理内嵌汇编程序,因此 CPU的内部寄存器资源使用有的内部寄存器资源使用有 额外约束。以下讲解内嵌额外约束。以下讲解内嵌ARM 汇编指令的用

58、法。汇编指令的用法。 第81页/共114页 83 ARM内嵌汇编程序的操作数内嵌汇编程序的操作数 操作数操作数 n内嵌汇编指令中作为操作数的内嵌汇编指令中作为操作数的 寄存器和常量可以是表达式。寄存器和常量可以是表达式。 这些表达式可以是这些表达式可以是char,short 或或int类型,而且这些表达式都类型,而且这些表达式都 是作为无符号数进行操作。若是作为无符号数进行操作。若 需要带符号,用户需要自己处需要带符号,用户需要自己处 理与符号有关的操作。编译器理与符号有关的操作。编译器 将会计算这些表达式的值,并将会计算这些表达式的值,并 为其分配寄存器。为其分配寄存器。 第82页/共114

59、页 84 ARM内嵌汇编程序的物理寄存器内嵌汇编程序的物理寄存器 物理寄存器物理寄存器 n内嵌汇编程序中使用物理寄存器有以下限制。内嵌汇编程序中使用物理寄存器有以下限制。 不能直接向不能直接向PC寄存器赋值,程序跳转只能使用寄存器赋值,程序跳转只能使用B或或BL 指令实现指令实现 不要使用过于复杂的不要使用过于复杂的C表达式,因为将会需要较多的物表达式,因为将会需要较多的物 理寄存器,这将导致与其他指令中用到的物理寄存理寄存器,这将导致与其他指令中用到的物理寄存 器产生使用冲突。器产生使用冲突。 编译器可能会使用编译器可能会使用R12或或R13存放编译的中间结果,在存放编译的中间结果,在 计算

60、表达式的值时可能会将寄存器计算表达式的值时可能会将寄存器R0R3,R12和和 R14用于子程序调用。因此在内嵌的汇编指令中不要用于子程序调用。因此在内嵌的汇编指令中不要 将这些寄存器同时指定为指令中的物理寄存器。将这些寄存器同时指定为指令中的物理寄存器。 通常内嵌的汇编指令中不要指定物理寄存器,因为这可通常内嵌的汇编指令中不要指定物理寄存器,因为这可 能会影响编译器分配寄存器,进而影响代码的效率。能会影响编译器分配寄存器,进而影响代码的效率。 第83页/共114页 85 其他内嵌汇编程序的编写注意点其他内嵌汇编程序的编写注意点 n常量:常量:在内嵌汇编指令中,常量前面的在内嵌汇编指令中,常量前

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论