1、page2022-11-14西安邮电学院 计算机系1第第4 4章章ARM7TDMIARM7TDMI汇编语言汇编语言程序设计程序设计page西安邮电学院 计算机系22022-11-14第4章 目录q1.汇编语言的基本概念q2.ARM汇编程序的组成与结构q3.汇编语言程序设计的基本方法q4.汇编语言和C语言交叉编程page西安邮电学院 计算机系32022-11-14第4章 目录q1.汇编语言的基本概念q2.ARM汇编程序的组成与结构q3.汇编语言程序设计的基本方法q4.汇编语言和C语言交叉编程page西安邮电学院 计算机系42022-11-141.汇编语言的基本概念 程序设计语言是专门为计算机编程
2、所配置的程序设计语言是专门为计算机编程所配置的语言。它们按照形式与功能的不同可分为三语言。它们按照形式与功能的不同可分为三种,即机器语言、汇编语言和高级语言。种,即机器语言、汇编语言和高级语言。1.机器语言机器语言 机器语言(机器语言(Machine Language)是由)是由0和和1二进制代码书写和存储的指令与数据。它的二进制代码书写和存储的指令与数据。它的特点是能被机器直接识别与执行;程序所占特点是能被机器直接识别与执行;程序所占内存空间较少。其缺点是难认、难记、难编、内存空间较少。其缺点是难认、难记、难编、易错。易错。page西安邮电学院 计算机系52022-11-142.汇编语言汇编
3、语言汇编语言(汇编语言(Assembly Language)是一)是一种面向物理层操作的计算机语言,是一种采用种面向物理层操作的计算机语言,是一种采用助记符表示的程序设计语言,使用助记符来表助记符表示的程序设计语言,使用助记符来表示指令的操作码和操作数,用标号或符号代表示指令的操作码和操作数,用标号或符号代表地址、常量或变量。地址、常量或变量。从机器角度看:汇编语言是一种面向物理层操作的计算机语言。不同的处理器类型,具有不同的汇编语言。使用汇编语言编写程序能够直接利用硬件系统的特性(如寄存器、标志、中断系统等),可直接对位、字节、字寄存器或存储单元、I/O端口进行处理,同时也能直接使用CPU指
4、令系统提供的各种寻址方式,编制出高质量的程序,这样的程序不但占用内存空间少,而且执行速度快。page西安邮电学院 计算机系62022-11-143.高级语言高级语言高级语言(高级语言(High Level Language)是脱)是脱离具体机器(即独立于机器)的通用语言,不离具体机器(即独立于机器)的通用语言,不依赖于特定计算机的结构与指令系统。依赖于特定计算机的结构与指令系统。page西安邮电学院 计算机系72022-11-14第4章 目录q1.汇编语言的基本概念q2.ARM汇编程序的组成与结构q3.汇编语言程序设计的基本方法q4.汇编语言和C语言交叉编程page西安邮电学院 计算机系820
5、22-11-142.ARM汇编程序的组成与结构;文件名:文件名:TEST1.S;功能:实现字符串拷贝功能功能:实现字符串拷贝功能;说明:使用说明:使用ARMulate软件仿真调试软件仿真调试 AREAExample1,CODE,READONLY ;声明代码段声明代码段Example1 num EQU 20 ;设置拷贝字的个数设置拷贝字的个数 ENTRY ;标识程序入口标识程序入口 CODE32 ;声明声明32位位ARM指令指令STARTLDRR0,=src ;R0指向源数据块指向源数据块LDRR1,=dst ;R1指向目的数据块指向目的数据块MOVR2,#num ;R2需要拷贝的数据个数需要拷
6、贝的数据个数 wordcopyLDRR3,R0,#4;从源数据块中取一个字,放入从源数据块中取一个字,放入R3中,中,;R0=R0+4STRR3,R1,#4;将将R3中的数据存入中的数据存入R1指向的存储指向的存储;单元中,单元中,R1=R1+4SUBSR2,R2,#1;R2计数器减计数器减1BNEwordcopy;如果如果R2不为不为0,则转向,则转向wordcopy处处使用“;”进行注释标号顶格写程序代码段page西安邮电学院 计算机系92022-11-14stopMOVR0,#0 x18;程序运行结束返回编译器调试环境程序运行结束返回编译器调试环境LDRR1,=0 x20026SWI0
7、x123456AREA BlockData,DATA,READWRITE;数据段的名字数据段的名字BlockDataSrcDCD1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4DstDCD0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0AREA|.extra|,NOINIT,READWRITE;未初始数据段的名字未初始数据段的名字.extradataSPACE1024END;文件结束文件结束 声明文件结束page西安邮电学院 计算机系102022-11-142.0 汇编语言程序格式汇编语言程序格式n汇编语言形式n汇编语言源程序的组成n
8、汇编语言程序中常用的符号n汇编语言程序中的表达式和运算符page西安邮电学院 计算机系112022-11-14汇编语言形式汇编语言形式page西安邮电学院 计算机系122022-11-14汇编语言程序中常用的符号汇编语言程序中常用的符号 在汇编语言程序设计中,经常使用各种符号表示变量、常量和地址n 组成:符号由大小写字母、数字以及下划线组成。n 大小写:符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。n 唯一性:符号在其作用范围内必须唯一,即在其作用范围内不可有同名的符号。n 自定义的符号名不能与系统的保留字相同。n 不能同名:符号名不应与指令或伪指令同名。page西安邮电学
9、院 计算机系132022-11-141程序中的变量 变量的类型:n数值变量n逻辑变量n字符串变量 作用范围:全局变量局部变量 page西安邮电学院 计算机系142022-11-142程序中的常量ARM(Thumb)汇编程序所支持的常量有数值常量、逻辑常量和字符串常量。数值常量一般为32位的整数,当作为无符号数时,其取值范围为0232-1;当作为有符号数时,其取值范围为-231231-1。在ARM汇编语言中,使用EQU来定义数 值常量。数值常量一经定义,其数值就不能再修改。page西安邮电学院 计算机系152022-11-14数值常量有下列表示方式:n 十进制数:可以直接表达如:1、2、345。
10、n 十六进制数:有两种表达方法,使用前缀0 x,如0 x003、0 x001C,或使用前缀&,如&10F、&134。这两种方法都是等效的。n n进制数:形如n_XXX,其中n的范围是2到9,XXX是具体数值。如:8_247表示一个八进制数。n ASCII的表示:有些值可以使用ASCII表达,例如:A表达A的ASCII码。指令:MOV R1,#B 等同于 MOV R1,#0 x42。page西安邮电学院 计算机系162022-11-14 逻辑常量只有两种取值情况:TRUE和FALSE,注意带大括号。字符串常量为一个固定的字符串,一般用于程序运行时的信息提示。字符常量由单引号表示,包括C语言中的转
11、义字符,如n。字符串常量用双引号表示,也包括C语言中的转义字符如“abcd0 xcr”。page西安邮电学院 计算机系172022-11-14汇编语言程序中的表达式和运算符汇编语言程序中的表达式和运算符 数值表达式 逻辑表达式 字符串表达式 表达式中各元素运算次序的优先级如下:括号运算符的优先级最高。相邻的单目运算符的运算顺序为从右到左,单 目运算符的优先级高于其它运算符。优先级相同的双目运算符的运算顺序为从左到右。page西安邮电学院 计算机系182022-11-14汇编语言的语句格式 Label Operation Operand ;Comment 标号域 操作助记符域 操作数域 注释域
12、例:start MOV R0,#0 x3F ;将立即数传送到寄存器R0 page西安邮电学院 计算机系192022-11-14标号域标号域(Label)(Label):作用:标号域用来表示指令的地址、变量、过程名、数据的地址和常量。开头:标号是一个自行设计的标识符或名称,语句标号可以是大小写字母混合,通常以字母开头,由字母、数字、下划线等组成。要求:语句标号不能与寄存器名、指令助记符、伪指令(操作)助记符、变量名同名。位置:语句标号必须在一行的开头书写,不能留空格。page西安邮电学院 计算机系202022-11-14操作助记符域操作助记符域(Operation):操作助记符域可以为指令、伪操
13、作、宏指令或伪指令的助记符。大小写要求:ARM汇编器对大小写敏感,在汇编语言程序设计中,每一条指令的助记符可以全部用大写、或全部用小写,但不允许在一条指令中大、小写混用。位置:所有的指令都不能在行的开头书写,必须在指令的前面有空格,然后再书写指令。格式:指令助记符和后面的操作数或操作寄存器之间必须有空格,不可以在这之间使用逗号。page西安邮电学院 计算机系212022-11-14操作数域操作数域(Operand):操作数域表示操作的对象,操作数可以是常量、变量、标号、寄存器名或表达式,不同对象之间必须用逗号“,”分开。page西安邮电学院 计算机系222022-11-14课堂练习 判断指令格
14、式正误 AREA EX3,CODE,READONLY GBLA DATADATA SETA 0 x20 ADD R0,R1,R2 ADD R0,R1,r2 add R0,R1,r2 Add R0,R1,r2 前面必须有空格前面必须有空格DATA变量名前面不能留空格全部大写,正确寄存器小写,正确指令助记符小写,寄存器大写或小写,正确指令助记符大小写混合,不正确page西安邮电学院 计算机系232022-11-142.1 ARM汇编器的伪操作汇编器的伪操作 在汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,其没有相对应的操作码,通常称这些特助指令助记符为伪操作。伪操作仅在汇
15、编过程中起各种准备工作作用。ARM汇编中伪操作:符号定义伪操作数据定义伪操作汇编控制伪操作信息报告伪操作其它常用的伪操作page西安邮电学院 计算机系242022-11-14符号定义伪操作符号定义伪操作 符号定义伪操作用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。常见的符号定义伪操作有如下几种:(1)GBLA、GBLL、GBLS (2)LCLA、LCLL,LCLS (3)SETA、SETL、SETS (4)RLISTpage西安邮电学院 计算机系252022-11-14各符号定义伪操作功能说明:各符号定义伪操作功能说明:GBLA:定义一个全局的数值变量,并初始化为0GB
16、LL:定义一个全局的逻辑变量,并初始化为FGBLS:定义一个全局字符串变量,并初始化为空LCLA:定义一个局部的数值变量,并初始化为0LCLL:定义一个局部的逻辑变量,并初始化为FLCLS:定义一个局部字符串变量,并初始化为空SETA:给一个数值变量赋值;SETL:给一个逻辑变量赋值;SETS:给一个字符串变量赋值;page西安邮电学院 计算机系262022-11-14使用示例:使用示例:GBLA A1 ;定义一个全局的数值变量,变量名为A1 A1 SETA 0 x0F ;将该变量赋值为0 x0F GBLL A2 ;定义一个全局的逻辑变量,变量名为A2 A2 SETL TRUE ;将该变量赋值
17、为真 GBLS A3 ;定义一个全局的字符串变量,变量名为A3 A3 SETS“Testing”;将该变量赋值为“Testing”LCLA T4 ;声明一个局部的数值变量,变量名为T4 T4 SETA 0 xaa ;将该变量赋值为0 xaapage西安邮电学院 计算机系272022-11-14数据定义伪操作数据定义伪操作DCB :分配一片连续的字节存储单元并初始化DCW(DCWU):分配一片连续的半字存储单元并初始化 DCD(DCDU):分配一片连续的字存储单元并初始化 DCDO :分配一片按字对齐的字内存单元并初始化 DCI :分配一片字或半字对齐内存单元并初始化 DCQ(DCQU):分配一
18、片以8字节为单位的连续存储单元并初始化 DCFS(DCFSU):为单精度浮点数分配一片连续字存储单元并初始化 DCFD(DCFDU):为双精度浮点数分配一片连续字存储单元并初始化 SPACE :分配一片连续的存储单元 FIELD :定义一个结构化的内存表的数据区 MAP :定义一个结构化的内存表首地址 LTORG :定义一个数据缓冲区池(literally pool)的开始page西安邮电学院 计算机系282022-11-14使用示例:使用示例:Str DCB “This is a test!”;分配一片连续的字节存储单元并初始化。DataTest DCW 1,2,3 ;分配一片连续的半字存储
19、单元并初始化。DataTest DCD 4,5,6 ;分配一片连续的字存储单元并初始化。page西安邮电学院 计算机系292022-11-14课堂练习课堂练习:假设Str的地址为:8008,有如下伪操作,试画出内存中数据的分布示意图。page西安邮电学院 计算机系302022-11-14page西安邮电学院 计算机系312022-11-14内存中的数据分布图page西安邮电学院 计算机系322022-11-142.2 ARM汇编程序中的数据定义 n数据定义的目的是为目标系统数学模型的各种抽象数据类型分配存储单元,同时进行初始化。DCB、DCW和和DCD汇编器伪指令汇编器伪指令string DC
20、B “Hello World!”;分配一片连续的字节存储单元并初始化 halfword DCW 1,2,3 ;分配一片连续的半字存储单元并初始化 word DCD 1,2,3 ;分配一片连续的字存储单元并初始化SPACE汇编器伪指令汇编器伪指令data SPACE1024;分配一片连续的存储区域并初始化为0 page西安邮电学院 计算机系332022-11-14LTORG汇编器伪指令汇编器伪指令 nLTORG用于声明一个文字池(literal pool),用于存放常量。nARM汇编语言提供了LDR加载指令附加文字池的方法,文字池中可以存放任意的32比特数,LDR加载指令相对寻址文字池,以实现对
21、任意立即数的访问。汇编过程中,汇编器会默认地在每一个段的末 尾填加一个文字池。需要注意的是,文字池不能远离文字池使用者(LDR指令),因为LDR指令的寻址范围是指令位置的前后4KB。如果用户程序比较大,则可能使程序段的末尾超出4KB范围,此时需要在程序中的适当位置,使用LTORG伪指令显式声明文字池。一般总可以在LDR伪指令前后4KB的范围内找到分支指令,文字池可声明在分支(B)指令之后的紧邻位置,不会影响代码的正常执行,因为B指令总是会将程序的执行转移到其它地方的。page西安邮电学院 计算机系342022-11-14I.缺省文字池AREA default,CODE,READONLYENTR
22、YCODE32startLDRR1,=0 xABCDEFLDRR2,=0 x101ADDR3,R1,R2Bstart ;汇编器默认的文字池位置,常数0 xABCDEF、0 x101即存放于此END start0 xe59f1008ldrr1,0 x00008010;=#0 x00abcdef000080040 xe59f2008ldrr2,0 x00008014;=#0 x00000101000080080 xe0813002addr3,r1,r20000800c0 xeafffffeb0 x800c;(start+0 xc)000080100 x00abcdefdcd0 x00abcdef.
23、000080140 x00000101dcd0 x00000101.page西安邮电学院 计算机系352022-11-14II.自定义文字池AREA default,CODE,READONLYENTRYCODE32startLDR R1,=0 xABCDEFLDR R2,=0 x101ADDR3,R1,R2B branch;其它汇编代码branch;其它汇编代码other SPACE 4096END汇编器在每一个程序段的末尾附加缺省文字池,如果程序段较长,这个缺省的文字池和LDR指令的距离有可能超出了4KB,那么LDR指令也不能正确加载数据。AREA default,CODE,READONLY
24、ENTRYCODE32startLDR R1,=0 xABCDEFLDR R2,=0 x101ADDR3,R1,R2B branchLTORG;其它汇编代码branch;其它汇编代码other SPACE 4096ENDstart0 xe59f1008ldrr1,0 x00008010;=#0 x00abcdef000080040 xe59f2008ldrr2,0 x00008014;=#0 x00000101000080080 xe0813002addr3,r1,r20000800c0 xea000001bbranch000080100 x00abcdefdcd0 x00abcdef.000
25、080140 x00000101dcd0 x00000101.branch0 xe1a01001movr1,r10000801c0 xeafffff7bstartother0 x00000000dcd0 x00000000 .000080240 x00000000dcd0 x00000000 .000080280 x00000000dcd0 x00000000 .page西安邮电学院 计算机系362022-11-14其它常用的伪操作其它常用的伪操作AREAALIGNCODE16、CODE32ENTRYENDEQUEXPORT(或(或GLOBAL)IMPORTEXTERNGET(或(或INCLU
26、DE)INCBINRNROUTpage西安邮电学院 计算机系372022-11-142.3 汇编语言程序的上机过程汇编语言程序的上机过程汇编语言上机环境page西安邮电学院 计算机系382022-11-142.3.1 编辑汇编语言源程序编辑汇编语言源程序 1 建立工程文件 page西安邮电学院 计算机系392022-11-14 2 编辑源文件 page西安邮电学院 计算机系402022-11-14 3 添加源文件 page西安邮电学院 计算机系412022-11-142.3.2 编译连接源程序编译连接源程序n在编译连接之前还需要通过Debug Settings 对话框对项目的运行环境进行一些设
27、置。这里采用默认设置。n编译时可以通过Project compile对源文件进行编译,然后再连接。但 是比较简便的做法是直接单击工程窗口的Make图标按钮。page西安邮电学院 计算机系422022-11-14page西安邮电学院 计算机系432022-11-142.3.3 调试汇编程序调试汇编程序page西安邮电学院 计算机系442022-11-14page西安邮电学院 计算机系452022-11-14第4章 目录q1.汇编语言的基本概念q2.ARM汇编程序的组成与结构q3.汇编语言程序设计的基本方法q4.汇编语言和C语言交叉编程page西安邮电学院 计算机系462022-11-143 AR
28、M 汇编语言程序设计汇编语言程序设计程序设计步骤简单程序设计分支程序设计循环程序设计子程序设计page西安邮电学院 计算机系472022-11-14程序设计步骤程序设计步骤 分析题目确定算法。合理分配存储空间和寄存器 根据算法画出程序框图 根据框图编写程序 上机调试程序page西安邮电学院 计算机系482022-11-141.分析题目与确定算法算法:解决实际问题的数学模型 相同的问题有不同的算法实现 不同的算法在运行速度,占据的空间不同2.合理分配存储空间和寄存器:合理地为原始数据,中间结果以及最终结果安排存储空间。分配原则:够用就好,不浪费空间,不定义多余变量,变量名合乎常规,增强可读性。p
29、age西安邮电学院 计算机系492022-11-143.画出程序的流程图矩形框:菱形框:分支判断椭圆框:程序的开始或结束圆框:流程图之间的连接箭头:处理流程圆圈:连接流程图某个处理page西安邮电学院 计算机系502022-11-144.根据流程图编制语句:简洁明了,必要的注释 不要出现绝对地址 注意中英文字符,半/全角,各数制对齐等5.汇编调试程序:ADS进行汇编、连接;AXD进行调试。6.判断程序质量的标准 程序执行的时间 程序所占用的内存字节数 程序的语句行数page西安邮电学院 计算机系512022-11-141.结构化程序设计的基本概念 n迪杰斯克拉(E.W.dijkstra)在19
30、69年提出结构化程序设计的基本思想采用“自顶向下,逐步求精”的程序设计方法。“单入口单出口”的控制结构。“自顶向下、逐步求精”程序设计方法的主导思想是从问题本身开始,对问题进行分解,将解决问题的方法步骤逐步细化,分解为由基本程序结构模块组成的结构化程序框图;“单入口单出口”的思想认为一个复杂的程序,如果它仅是由顺序、分支、循环和子程序四种基本程序结构的组合、嵌套构成,那么这个新构造的程序一定是一个单入口单出口的程序。page西安邮电学院 计算机系522022-11-142.汇编语言程序设计的流程汇编语言程序设计的流程n使用计算机通过编程序解决某一问题时,通常按以下步骤进行:分析问题,建立数学模
31、型;确定算法;设计程序流程图;合理分配寄存器、存储空间和外设资源;编制程序;调试程序;形成文档;研讨目标系统的本质特性,用数学方法对其本质特性进行抽象描述,建立目标系统的数学表示模型 在已建立的目标系统数学表示模型上,进一步研讨目标系统的内在规则,设计相应处理法则方案(算法分析与描述)把解题的方法、步骤用框图形式表示。如果问题比较复杂,那么可以逐步细化,直到每一框图可以容易编程为止。流程图不仅便于程序的编制,且对程序逻辑正确性也比较容易查找和修改。合理地分配存储器资源,将前述的目标系统数据结构模型表示到各存储器单元。CPU寄存器数量有限,在程序中,大多数操作都要使用寄存器;并且有的操作使用特定
32、的寄存器(如堆栈操作使用SP/R13等),程序中要合理分配各寄存器的用途。用计算机语言,对数据结构模型和流程图表示的算法进行准确地描述。语法调试:排除程序中的语法错误。功能调试:保证程序的逻辑功能正确性。用文档形式记录说明程序的功能、使用方法、程序结构、算法流程等每一个阶段的工作。page西安邮电学院 计算机系532022-11-143.顺序程序设计 n顺序程序是一种最简单的程序结构,也称为直线程序,它的执行自始自终按照语句的先后顺序进行。这种结构的流程图,除了有一个起始框,一个终止框外,就是若干执行框。page西安邮电学院 计算机系542022-11-14例 4 2 试编制一程序,完成10+
33、3的操作。AREA ARMex,CODE,READONLY;代码段名ARMexENTRY;程序的入口CODE 32startMOVR0,#10;将立即数10存入寄存器R0MOVR1,#3;将立即数3存入寄存器R1ADDR0,R0,R1;R0=R0+R1stopMOVR0,#0 x18;这三条指令是ADS调试环境特约LDRR1,=0 x20026;程序运行结束返回编译器调试环境SWI0 x123456END;结束 page西安邮电学院 计算机系552022-11-144.分支程序设计 n许多实际问题需要根据不同的情况作出不同的处理。在程序中,把不同的处理方法编制成各自的处理程序段,运行时由机器根
34、据不同的条件自动作出判断,选择执行相应的处理程序段。这样的程序结构中,计算机不再完全按指令存储的顺序执行,称之为分支。分支程序使用子程序调用指令BL、转移指令B或带状态转移指令BX来实现。page西安邮电学院 计算机系562022-11-14例 4 3 给定以下符号函数:000101xxxy任意给定值,假定为-25,存放 在x单元,函数值存放在y单元;要求根据x中的值来确定y的值。R3=-1R3=0AREA symbol,CODE,READONLY;代码段的名字 symbolENTRY ;程序的入口CODE32startLDR R0,=x;加载数据段中的变量x地址,存入R0LDR R1,=y;
35、加载数据段中的变量y地址,存入R1LDRR2,R0;加载变量x的值,存入R2compareCMPR2,#0;将R2的值与0作比较BEQZERO;如果R2等于0,那么转向标号ZERO处BGTPLUS;如果R2大于0,那么转向标号PLUS处 MOVR3,#-1;否则,R2小于0,将-1存入R3中BstopZEROMOVR3,#0;R2等于0,将0存入R3中BstopPLUSMOVR3,#1;R2大于0,将1存入R3中;续上段代码stop STRR3,R1MOVR0,#0 x18LDRR1,=0 x20026SWI0 x123456AREA Data,DATA,READWRITExDCD-25yDC
36、D0 END page西安邮电学院 计算机系572022-11-145.循环程序设计 n顺序程序和分支程序中的指令每次运行最多只执行一次。在实际应用中重复地做某些事的情况是很多的,这也是计算机最擅长的工作方式。重复地执行某些指令,最好用循环程序来实现。n循环程序的结构 初始化循环体修改判断判断结束循环程序的主要部分,视具体情况而定:可以是一个顺序程序、分支程序或另一个循环程序。计数控制循环计数控制循环:通过计数循环次数,判断是否已达到预定次数,控制循环。条件控制循环条件控制循环:通过判断循环终止条件是否已成立,控制循环。建立循环初始值。如设置地址指针、计数器、其他循环参数的起始值等。判断循环结
37、束条件是否成立,决定是否继续循环。对循环结束进行适当处理;有的循环程序可以没有这部分。为执行下一个循环而修改某些参数,尤其循环控制变量的修改等。page西安邮电学院 计算机系582022-11-14用计数控制循环适用于已知循环次数的循环程序设计 例 4 4 从x单元开始的30个连续字单元中存放 有30个无符号数,从中找出最大者送入y单元中。分析:根据题意,把第一个数先送入Rx寄存器,将Rx中的数与后 面的29个数逐个进行比较,如果Rx中的数较小,则将该较 大的数送入Rx;继续与余下的数据逐个比较。在比较过程 中,Rx中始终保持较大的数,共计比较29次,则最终Rx 中保留了最大数,最后把Rx中的
38、数(最大者)送入y单元。AREA max,CODE,READONLY;代码段的名字 maxENTRY ;程序的入口CODE32numEQU29 ;比较的次数startLDRR0,=x ;R0指向源数据块xLDRR1,=y ;R1指向单元yLDRR2,=num ;R2作为计数器LDRR3,R0 ;将源数据块x中第一个数加载到R3中compareADDR0,R0,#4 ;每进行一次比较,将R0指针地址加4LDRR4,R0 ;依次将源数据块x中下一个数加载到R4中CMPR3,R4 ;比较R3和R4中数的大小 MOVCC R3,R4 ;如果R3小于R4,则将较大的数送入R3中SUBSR2,R2,#1
39、;计数器值减1BNEcompare ;如果不为0,那么继续跳到compare执行STREQ R3,R1 ;如果为0,那么循环比较结束,R3是最大的数 ;并且将R3中的数加载到R1指向的单元(即y)中 stopMOVr0,#0 x18LDRr1,=0 x20026SWI0 x123456 AREA Data,DATA,READWRITExDCD73,59,61,34,81,107,225,231,54,43DCD100,35,1,42,222,254,34,71,100,31DCD33,119,13,44,18,147,55,244,97,3yDCD0ENDpage西安邮电学院 计算机系5920
40、22-11-14 适用于无法确定循环次数,但知道循环结束的条件的循环程序设计例 4 5 从自然数1开始累加,直到累加和大于1000为止,统计被累加的自然数的个数,并把统计的个数送入n单元,把累加和送入sum单元。分析:根据题意,被累加的自然数的个数事先未知,因此不能用计数方法控制循环。但题目中给定一个条件,即累加和大于1000则停止累加,因此,可以根据这一条件控制循环。我们用R3寄存器放累加和,用R4寄存器放每次取得的自然数,其中它的值也是统计自然数的个数。AREA SUM,CODE,READONLY;代码段的名字 SUM ENTRY ;程序的入口 CODE32start LDR R0,=n
41、;将数据段中自然数的个数n的地址加载到R0寄存器 LDR R1,=sum ;将数据段中自然数的累加和sum的地址加载到R1寄存器 LDR R3,=0 ;R3存放自然数的累加和 LDR R4,=0 ;R4用于循环个数的统计/每次取得的自然数 LDR R5,=1000 ;R5用于循环结束的界限值continue ADDR4,R4,#1 ;取下一个自然数 ADDR3,R3,R4 ;累加自然数 CMP R3,R5 ;比较累加和是否超过了1000 BCC continue ;如果小于1000,那么跳到compare执行 STRCS R3,R1 ;如果大于1000,那么将累加和存储到R1所指向的单元中 S
42、TRCS R4,R0 ;如果大于1000,那么将已累加的自然数个数值存储 ;到R0所指向的单元中 stop MOV r0,#0 x18 LDR r1,=0 x20026 SWI 0 x123456 AREA Data,DATA,READWRITEnDCD0 ;定义累加的自然数的个数sumDCD0 ;定义自然数的累加和 ENDpage西安邮电学院 计算机系602022-11-14例:编制程序使S1233445N(N+1),直到N等于10为止。分析过程算法功能:相邻数相乘 MUL累加 ADD循环次数:10 CMP B指令初始值 S=1 N N+1 部分和N(N+1)寄存器分配R0:S 1 R0+R
43、3得S值R1:N的初始值 2 循环变量R2:N+1 由R1=1求得R3:N(N+1)流程图page西安邮电学院 计算机系612022-11-14源程序源程序:AREA EX4_45,CODE,READONLY ENTRY CODE32START MOV R0,#1 ;R0用作累加,置初值1,S MOV R1,#2 ;R1用作第一个乘数,初值为2,NREPEAT ADD R2,R1,#1 ;R2用作第二个乘数,N+1 MUL R3,R2,R1 ;实现N*(N+1)部分积存于R3 ADD R0,R0,R3 ;将部分积累加至R0 ADD R1,R1,#1 ;修改N的值得到下一轮乘数 CMP R1,#
44、10 ;循环次数比较 BLE REPEAT ;未完成则重复 ENDpage西安邮电学院 计算机系622022-11-14 多重循环程序设计 多重循环即循环体内套有循环。设计多重循环程序时,可以从外层循环到内层循环一层一层地进行。通常在设计外层循环时,仅把内层循环看成一个处理粗框,然后 再将该粗框细化,分成置初值、工作、修改和控制四个组成部分。当内层循环设计完之后,用其替换外层循环体中被视为一个处理粗框的对应部分,这样就构成了一个多重循环。page西安邮电学院 计算机系632022-11-14多重循环程序设计多重循环程序设计 多重循环又称循环嵌套多重循环又称循环嵌套,即循环套循环。有些问即循环套
45、循环。有些问题比较复杂题比较复杂,单重循环难以解决单重循环难以解决,必须使用多重循环。必须使用多重循环。在使用多重循环时在使用多重循环时,必须注意以下几点:必须注意以下几点:关系:关系:内循环必须完整地包含在外循环内内循环必须完整地包含在外循环内,内外循环不能相互交叉。内外循环不能相互交叉。跳转:跳转:内循环既可以嵌套在外循环中内循环既可以嵌套在外循环中,也可也可以几个内循环并列存在。可以从内循环中直接跳到以几个内循环并列存在。可以从内循环中直接跳到外循环,但不能从外循环直接跳进内循环中。外循环,但不能从外循环直接跳进内循环中。注意:注意:防止出现防止出现“死循环死循环”。无论是外循环。无论是
46、外循环,还是内循环,千万不要使循环返回到初始部分还是内循环,千万不要使循环返回到初始部分,这一这一点应当特别注意。点应当特别注意。参数设置:参数设置:每次通过外循环再次进入内循每次通过外循环再次进入内循环时,初始条件必须重新设置。环时,初始条件必须重新设置。page西安邮电学院 计算机系642022-11-1449 38 65 12 97 13 55 27 78 8549496565979738384949656578788585 78 65 55 49 38 27 13 1212ARRAYR6BX SISISISISISISISISIBXSISISISISISISISIpage西安邮电学院
47、计算机系652022-11-14综合举例:综合举例:在以BUF为首址的字存储区中存放有10个无符号数 0 x0FF,0 x00,0 x40,0 x10,0 x90,0 x20,0 x80,0 x30,0 x50,0 x70,0 x60,现需将它们按从小到大的顺序排列在BUF存储区中,试编写其程序。1、分析2、流程3、编程4、调测page西安邮电学院 计算机系662022-11-14R1R2流程图分析:分析:采用逐一比较法:将第一个存储单元中的数与其后n-1个存储单元中的数逐一比较,每次比较之后,总是把小者放在第一个存储单元之中,经过n-1次比较之后,n个数中最小者存入第一存储单元中;接着从第二
48、个存储单元开始,同理,经过n-2次比较之后,得到n-1个数中最小者存入第二存储单元中;如此类推,当最后两个存储单元的数比较完成之后,从小到大的排列顺序就实现了。“冒泡排序”算法。page西安邮电学院 计算机系672022-11-14 各寄存器分配功能如下:R0:用来指示缓冲区初始地址R1:外循环计数器R2:内循环计数器R3:外循环地址指针R4:内循环地指针R5:内循环下一个数地址指针R6:存放内循环一轮比较的最小值R7:存放内循环取出的下一个比较值page西安邮电学院 计算机系682022-11-14 源程序如下:源程序如下:N EQU 10 AREA EX4_47,CODE,READONLY
49、 ENTRY CODE32START LDR R0,=BUF ;指向数组的首地址 MOV R1,#0 ;外循环计数器 MOV R2,#0 ;内循环计数器LOOPI ADD R3,R0,R1,LSL#2 ;外循环首地址存R3 MOV R4,R3 ;内循环首地址存R4 ADD R2,R1,#1 ;内循环计数器初值 MOV R5,R4 ;内循环下一地址初值 LDR R6,R4 ;取内循环下一地址值R4page西安邮电学院 计算机系692022-11-14LOOPJ ADD R5,R5,#4 ;内循环下一地址值 LDR R7,R5 ;取出下一地址值至R7 CMP R6,R7 ;比较 BLT NEXT
50、;小则取下一个 SWP R7,R6,R5 ;大则交换,最小值R6 MOV R6,R7 NEXT ADD R2,R2,#1 ;内循环计数 CMP R2,#N ;循环中止条件 BLT LOOPJ ;小于N则继续内循环 SWP R7,R6,R3 ;否则,内循环一轮结束 ;将最小数存入外循环的首地址处 ADD R1,R1,#1 ;外循环计数page西安邮电学院 计算机系702022-11-14 CMP R1,#N-1 ;外循环中止条件 BLT LOOPI ;小于N-1则继续执行外循环 B START AREA BlockData,DATA,READWRITE BUF DCD 0 x0FF,0 x00,