收藏 分销(赏)

chapter4ARM7TDMI汇编语言程序设计.pptx

上传人:w****g 文档编号:4177782 上传时间:2024-08-12 格式:PPTX 页数:64 大小:483.05KB
下载 相关 举报
chapter4ARM7TDMI汇编语言程序设计.pptx_第1页
第1页 / 共64页
chapter4ARM7TDMI汇编语言程序设计.pptx_第2页
第2页 / 共64页
chapter4ARM7TDMI汇编语言程序设计.pptx_第3页
第3页 / 共64页
chapter4ARM7TDMI汇编语言程序设计.pptx_第4页
第4页 / 共64页
chapter4ARM7TDMI汇编语言程序设计.pptx_第5页
第5页 / 共64页
点击查看更多>>
资源描述

1、page2024/8/10 周六西安邮电学院 计算机系1第第4 4章章ARM7TDMIARM7TDMI汇编语言汇编语言程序设计程序设计page西安邮电学院 计算机系22024/8/10 周六第4章 目录q1.汇编语言的基本概念q2.ARM汇编程序的组成与结构q3.汇编语言程序设计的基本方法q4.汇编语言和C语言交叉编程page西安邮电学院 计算机系32024/8/10 周六第4章 目录q1.汇编语言的基本概念q2.ARM汇编程序的组成与结构q3.汇编语言程序设计的基本方法q4.汇编语言和C语言交叉编程page西安邮电学院 计算机系42024/8/10 周六4.1 汇编语言的基本概念 u语言语言

2、 -信息的传播载体。信息的传播载体。u计计算算机机语语言言 -计计算算机机可可以以识识别别、理理解解的的语言。语言。计算机语言的用途计算机语言的用途 :描述操作和数据。描述操作和数据。数据-用于描述问题模型;操作-用于描述问题处理方法和步骤;page西安邮电学院 计算机系52024/8/10 周六4.1 汇编语言的基本概念 程程序序设设计计语语言言是是专专门门为为计计算算机机编编程程所所配配置置的的语语言言。它它们们按按照照形形式式与与功功能能的的不不同同可可分分为为三三类,即机器语言、汇编语言和高级语言。类,即机器语言、汇编语言和高级语言。1.1.机器语言机器语言 机机器器语语言言(Mach

3、ine Machine LanguageLanguage)是是由由0 0和和1 1二二进进制制代代码码表表示示和和存存储储的的指指令令与与数数据据。它它的的特特点点是是能能被被机机器器直直接接识识别别与与执执行行;程程序序所所占占内内存存空空间间较较少少。其其缺缺点点是是难难认认、难难记记、难难编编、易错。易错。page西安邮电学院 计算机系62024/8/10 周六2.2.汇编语言汇编语言 汇编语言(汇编语言(Assembly LanguageAssembly Language)是一种面向物理)是一种面向物理层操作的计算机语言,是一种采用助记符表示指令的层操作的计算机语言,是一种采用助记符表

4、示指令的程序设计语言;程序设计语言;汇编语言中使用汇编语言中使用助记符助记符来表示指令的操作码和操作来表示指令的操作码和操作数,用数,用标号或符号标号或符号代表地址、常量或变量。代表地址、常量或变量。从机器角度看:汇编语言是一种面向物理层操作的计算机语言。不同的处理器类型,具有不同的汇编语言。使用汇编语言编写程序能够直接利用硬件系统的特性(如寄存器、标志、中断系统等),可直接对位、字节、字寄存器或存储单元、I/O端口进行处理,同时也能直接使用CPU指令系统提供的各种寻址方式,编制出高质量的程序,这样的程序不但占用内存空间少,而且执行速度快。page西安邮电学院 计算机系72024/8/10 周

5、六2.汇编语言汇编语言-源程序示例 AREA Init,CODE,READONLY ENTRYStart LDR R0,=0 x40000500 MOV R1,#0 x55 STR R1,R0 LDR R0,=0 x40000504 MOV R1,#0 xAA STR R1,R0 ENDpage西安邮电学院 计算机系82024/8/10 周六2.汇编语言汇编语言-上机过程 设计、编辑汇编语言源程序;汇编、连接、下载到目标系统;调试运行;page西安邮电学院 计算机系92024/8/10 周六3.高级语言高级语言 高级语言(高级语言(High Level LanguageHigh Level L

6、anguage)是脱离)是脱离具体机器(即独立于机器)的通用语言,不依具体机器(即独立于机器)的通用语言,不依赖于特定计算机的结构与指令系统。赖于特定计算机的结构与指令系统。page西安邮电学院 计算机系102024/8/10 周六第4章 目录q1.汇编语言的基本概念q2.ARM汇编程序的组成与结构q3.汇编语言程序设计的基本方法q4.汇编语言和C语言交叉编程page西安邮电学院 计算机系112024/8/10 周六4.2 ARM汇编程序的组成与结构;文件名:文件名:TEST1.S;功能:实现字符串拷贝功能功能:实现字符串拷贝功能;说明:使用说明:使用ARMulate软件仿真调试软件仿真调试

7、AREAExample1,CODE,READONLY ;声明代码段声明代码段Example1 num EQU 20 ;设置拷贝字的个数设置拷贝字的个数 ENTRY ;标识程序入口标识程序入口 CODE32 ;声明声明32位位ARM指令指令STARTLDRR0,=src ;R0指向源数据块指向源数据块LDRR1,=dst ;R1指向目的数据块指向目的数据块MOVR2,#num ;R2需要拷贝的数据个数需要拷贝的数据个数 wordcopyLDRR3,R0,#4;从源数据块中取一个字,放入从源数据块中取一个字,放入R3中,中,;R0=R0+4STRR3,R1,#4;将将R3中的数据存入中的数据存入R

8、1指向的存储指向的存储;单元中,单元中,R1=R1+4SUBSR2,R2,#1;R2计数器减计数器减1BNEwordcopy;如果如果R2不为不为0,则转向,则转向wordcopy处处使用“;”进行注释标号顶格写程序代码段page西安邮电学院 计算机系122024/8/10 周六stopMOVR0,#0 x18;程序运行结束返回编译器调试环境程序运行结束返回编译器调试环境LDRR1,=0 x20026SWI0 x123456 AREA BlockData,DATA,READWRITE;数据段的名字数据段的名字BlockDataSrcDCD1,2,3,4,5,6,7,8,1,2,3,4,5,6,

9、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西安邮电学院 计算机系132024/8/10 周六4.2 ARM汇编程序的组成与结构 u段:ARM汇编程序由段组成(程序段、数据段);段是由汇编器伪指令AREA定义的相对独立程序块;段的属性:READONLY(只读)或READWRITE(读写)分别用于定义一个代码段或数据段;page西安邮电学院 计算机系1

10、42024/8/10 周六4.2 ARM汇编程序的组成与结构 u标识符(标号):(用途)用来表示指令的地址、数据的地址、变量、过程名和常量;(组成)标号是一个自行设计的字母数字串,通常以字母开头,由字母、数字、下划线等组成;(注意1)标号不能与寄存器名、指令助记符、伪指令(操作)助记符等“关键字”同名;(注意2)标号必须在一行的开头书写,不能留空格;page西安邮电学院 计算机系152024/8/10 周六4.2.1 汇编器伪指令 nARM汇编语言程序中,有一些特殊的指令助记符,称为汇编器伪指令。它们无论表示形式或其在程序中所处的位置,都与指令相似,但二者之间有着重要的区别。指令是供CPU执行

11、的操作命令,每条指令对应CPU的一种特定操作,在用户代码运行期间执行;而汇编器伪指令是供汇编器处理的命令,在汇编过程中由汇编器进行处理,例如定义数据、分配存储区、定义段、定义宏等;汇编以后,汇编器伪指令不产生与之对应的目标代码。page西安邮电学院 计算机系162024/8/10 周六4.2.1 汇编器伪指令AREACODE16、CODE32ENTRYENDEQUDCB、DCW、DCDSPACELTORGALIGNpage西安邮电学院 计算机系172024/8/10 周六4.2.1 汇编器伪指令-AREA用途:段声明;格式:AREA,其中:段名-用户定义的标识符;段属性-CODE/DATA读写

12、属性-READONLY/READWRITEpage西安邮电学院 计算机系182024/8/10 周六;文件名:文件名:TEST1.S;功能:实现字符串拷贝功能功能:实现字符串拷贝功能;说明:使用说明:使用ARMulate软件仿真调试软件仿真调试 AREAExample1,CODE,READONLY ;声明代码段声明代码段Example1 num EQU 20 ;设置拷贝字的个数设置拷贝字的个数 ENTRY ;标识程序入口标识程序入口 CODE32 ;声明声明32位位ARM指令指令STARTLDRR0,=src ;R0指向源数据块指向源数据块LDRR1,=dst ;R1指向目的数据块指向目的数据

13、块MOVR2,#num ;R2需要拷贝的数据个数需要拷贝的数据个数 wordcopyLDRR3,R0,#4;从源数据块中取一个字,放入从源数据块中取一个字,放入R3中,中,;R0=R0+4STRR3,R1,#4;将将R3中的数据存入中的数据存入R1指向的存储指向的存储;单元中,单元中,R1=R1+4SUBSR2,R2,#1;R2计数器减计数器减1BNEwordcopy;如果如果R2不为不为0,则转向,则转向wordcopy处处page西安邮电学院 计算机系192024/8/10 周六stopMOVR0,#0 x18;程序运行结束返回编译器调试环境程序运行结束返回编译器调试环境LDRR1,=0

14、x20026SWI0 x123456 AREA 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西安邮电学院 计算机系202024/8/10 周六4.2.1 汇编器伪指令-CODE16/32用途:声明后续行是

15、16位的Thumb或是32位的ARM指令;格式:CODE16(CODE32)代码示例:code16 add r0,r1 ;Thumb指令 code32 add r0,r1 ;ARM指令page西安邮电学院 计算机系212024/8/10 周六;文件名:文件名:TEST1.S;功能:实现字符串拷贝功能功能:实现字符串拷贝功能;说明:使用说明:使用ARMulate软件仿真调试软件仿真调试 AREAExample1,CODE,READONLY ;声明代码段声明代码段Example1 num EQU 20 ;设置拷贝字的个数设置拷贝字的个数 ENTRY ;标识程序入口标识程序入口 CODE32 ;声明

16、声明32位位ARM指令指令STARTLDRR0,=src ;R0指向源数据块指向源数据块LDRR1,=dst ;R1指向目的数据块指向目的数据块MOVR2,#num ;R2需要拷贝的数据个数需要拷贝的数据个数 wordcopyLDRR3,R0,#4;从源数据块中取一个字,放入从源数据块中取一个字,放入R3中,中,;R0=R0+4STRR3,R1,#4;将将R3中的数据存入中的数据存入R1指向的存储指向的存储;单元中,单元中,R1=R1+4SUBSR2,R2,#1;R2计数器减计数器减1BNEwordcopy;如果如果R2不为不为0,则转向,则转向wordcopy处处page西安邮电学院 计算机

17、系222024/8/10 周六4.2.1 汇编器伪指令-ENTRY用途:声明程序的入口,编译程 序会把这个入口的地址定义为系统复位后的程序的起始点;格式:ENTRY代码示例:AREA Init,CODE,READONLY ENTRY CODE32Start LDR R0,=0 x40000500 LDR R1,#0 xFF STR R1,R0 ENDpage西安邮电学院 计算机系232024/8/10 周六4.2.1 汇编器伪指令-END用途:声明汇编源程序的结束(末行);格式:END代码示例:AREA Init,CODE,READONLY ENTRYCODE32Start LDR R0,=0

18、 x3FF5000 LDR R1,#0 xFF STR R1,R0 ENDpage西安邮电学院 计算机系242024/8/10 周六4.2.1 汇编器伪指令-EQU用途:声明程序的入口;格式:EQU代码示例:AREA Init,CODE,READONLYZQL_V EQU 0 x40000500 ENTRYCODE32Start LDR R0,=ZQL_V LDR R1,#0 xFF STR R1,R0 ENDpage西安邮电学院 计算机系252024/8/10 周六4.2.1 汇编器伪指令-DCB用途:在程序存储区预存字节数据;格式:DCB 代码示例:AREA Init,CODE,READO

19、NLYZQL_DB DCB 0 x01,0 x04,0 x09,0 x10,0 x19 ENTRYCODE32Start LDR R0,=ZQL_DB LDR R2,R0,R1 END备注:DCB也可用“=”代替;page西安邮电学院 计算机系262024/8/10 周六4.2.1 汇编器伪指令-DCW用途:在程序存储区预存半字数据(2B);格式:DCW 代码示例:AREA Init,CODE,READONLYZQL_DW DCW 0 x01,0 x04,0 x09,0 x10,0 x19 ENTRYCODE32Start LDR R0,=ZQL_DW LDR R2,R0,R1,LSL#1 E

20、ND备注:DCW预存的数据在存储器中半字对齐存放;page西安邮电学院 计算机系272024/8/10 周六4.2.1 汇编器伪指令-DCD用途:在程序存储区预存字数据(4B);格式:DCD 代码示例:AREA Init,CODE,READONLYZQL_DD DCD 0 x01,0 x04,0 x09,0 x10,0 x19 ENTRYCODE32Start LDR R0,=ZQL_DD LDR R2,R0,R1,LSL#2 END备注:DCD预存的数据在存储器中字对齐存放;DCD也可用“&”代替;page西安邮电学院 计算机系282024/8/10 周六4.2.1 汇编器伪指令-SPACE

21、用途:在存储区预留初值为0 x00的空间;格式:SPACE 代码示例:AREA Init,CODE,READONLYZQL_DD DCD 0 x01,0 x04,0 x09,0 x10,0 x19 ENTRYCODE32Start LDR R0,=ZQL_DD LDR R2,R0,R1,LSL#2 Buff SPACE 4096 ENDpage西安邮电学院 计算机系292024/8/10 周六4.2.1 汇编器伪指令-LTORG用途:声明一个文字池的位置;格式:LTORG文字池的起源与应用:用于预存放任何32bit的数据常量,供LDR加载指令使用,实现对任意立即数的访问;解释:立即数包含在32

22、bit的指令码中,必须是8位图立即数,这就限制了立即数的取值;ARM汇编语言提供了LDR加载指令附加文字池的方法,文字池中可以存放任意的32bit数,LDR加载指令相对寻址文字池,以实现对任意立即数的访问。page西安邮电学院 计算机系302024/8/10 周六汇编过程中,汇编器会默认地在每一个程序段的末尾填加一个文字池。需要注意的是,文字池不能远离文字池使用者(LDR指令),因为LDR指令的寻址范围是指令位置的前后4KB。如果用户程序比较大,则可能使程序段的末尾超出4KB范围,此时需要在程序中的适当位置,使用LTORG伪指令显式声明文字池。一般总可以在LDR伪指令前后4KB的范围内找到分支

23、指令,文字池可声明在分支(B)指令之后的紧邻位置,不会影响代码的正常执行,因为B指令总是会将程序的执行转移到其它地方的。page西安邮电学院 计算机系312024/8/10 周六u缺省文字池缺省文字池AREA default,CODE,READONLYENTRYCODE32startLDRR1,=0 xABCDEFLDRR2,=0 x101ADDR3,R1,R2B ;汇编器默认的文字池位置 ;常数0 xABCDEF、0 x101即存放于此END 地址 机器指令码 汇编指令 注释start0 xe59f1008ldrr1,0 x00008010;=#0 x00abcdef000080040 xe

24、59f2008ldrr2,0 x00008014;=#0 x00000101000080080 xe0813002addr3,r1,r20000800c0 xeafffffeb0 x800c;(start+0 xc)000080100 x00abcdefdcd0 x00abcdef.000080140 x00000101dcd0 x00000101.page西安邮电学院 计算机系322024/8/10 周六u自定义文字池AREA default,CODE,READONLYENTRYCODE32startLDR R1,=0 xABCDEF ;文字池使用处LDR R2,=0 x101ADDR3,R

25、1,R2B branch ;其它汇编代码branch ;其它汇编代码other SPACE 4096END ;默认文字池位置超远!?汇编器缺省文字池位于程序段的末尾,如果程序段较长,这个缺省的文字池和LDR指令的距离有可能超出了4KB,那么LDR指令不能正确加载数据。AREA default,CODE,READONLYENTRYCODE32startLDR R1,=0 xABCDEF ;文字池使用者LDR R2,=0 x101ADD R3,R1,R2B branchLTORG;显示声明文字池位置显示声明文字池位置;其它汇编代码branch;其它汇编代码other SPACE 4096ENDst

26、art0 xe59f1008ldrr1,0 x00008010;=#0 x00abcdef000080040 xe59f2008ldrr2,0 x00008014;=#0 x00000101000080080 xe0813002addr3,r1,r20000800c0 xea000001bbranch000080100 x00abcdefdcd0 x00abcdef.000080140 x00000101dcd0 x00000101.branch0 xe1a01001movr1,r10000801c0 xeafffff7bstartother0 x00000000dcd0 x00000000

27、.000080240 x00000000dcd0 x00000000 .000080280 x00000000dcd0 x00000000 .page西安邮电学院 计算机系332024/8/10 周六4.2.1 汇编器伪指令-LTORG用途:声明一个文字池(literal pool)的位置;格式:LTORG代码示例:AREA EXP_LTOGR,CODE,READONLY ENTRY CODE32Start LDR R0,=0 x12345678 LDR R2,=0 x87654321 B label LTORG Buff SPACE 4096 END在文字池使用者4KB范围内的某个 B指令后

28、临,使用LTORG声明文字池;page西安邮电学院 计算机系342024/8/10 周六第4章 目录q1.汇编语言的基本概念q2.ARM汇编程序的组成与结构q3.汇编语言程序设计的基本方法q4.汇编语言和C语言交叉编程page西安邮电学院 计算机系352024/8/10 周六4.3 汇编语言程序设计的基本方法u描述问题模型;(数据描述)(物理问题数学抽象模型计算机存储模型)u描述问题处理方法;(算法描述)计算机语言主要用于编程(程序设计)。汇编语言程序设计的主要工作-基于计算机工作平台,使用汇编语言:page西安邮电学院 计算机系362024/8/10 周六4.3 汇编语言程序设计的基本方法u

29、计算机工作平台的知识;u汇编指令系统基本掌握;u数学建模、存储器表示基础知识;u分析、解决问题方法描述能力;汇编语言程序设计的基本素质要求:page西安邮电学院 计算机系372024/8/10 周六4.3.1 结构化程序设计的基本概念 n迪杰斯克拉(E.W.dijkstra)在1969年提出结构化程序设计的基本思想;采用“自顶向下,逐步求精”的程序设计方法。“单入口单出口”的控制结构。“自顶向下、逐步求精”程序设计方法的主导思想是从问题本身开始,对问题逐步分解,将解决问题的方法步骤逐步细化,分解为由基本程序结构模块组成的结构化程序框图,直至便于编程实现;“单入口单出口”的思想认为一个复杂的程序

30、,如果它仅是由顺序、分支、循环和子程序四种基本程序结构的组合、嵌套构成,那么这个新构造的程序一定是一个单入口单出口的程序。page西安邮电学院 计算机系382024/8/10 周六4.3.2 汇编语言程序设计的流程汇编语言程序设计的流程n使用计算机通过编程序解决某一问题时,通常按以下步骤进行:分析问题,建立数学模型;确定算法;设计程序流程图;合理分配寄存器、存储空间和外设资源;编制程序;调试程序;形成文档;研讨目标系统的本质特性,用数学方法对其本质特性进行抽象描述,建立目标系统的数学表示模型 在已建立的目标系统数学表示模型上,进一步研讨目标系统的内在规则,设计相应处理法则方案(算法分析与描述)

31、把解题的方法、步骤用框图形式表示。如果问题比较复杂,那么可以逐步细化,直到每一框图可以容易编程为止。流程图不仅便于程序的编制,且对程序逻辑正确性也比较容易查找和修改。合理地分配存储器资源,将前述的目标系统数据结构模型表示到各存储器单元。CPU寄存器数量有限,在程序中,大多数操作都要使用寄存器;并且有的操作使用特定的寄存器(如堆栈操作使用SP/R13等),程序中要合理分配各寄存器的用途。用计算机语言,对数据结构模型和流程图表示的算法进行准确地描述。语法调试:排除程序中的语法错误。功能调试:保证程序的逻辑功能正确性。用文档形式记录说明程序的功能、使用方法、程序结构、算法流程等每一个阶段的工作。pa

32、ge西安邮电学院 计算机系392024/8/10 周六4.3.3 顺序程序设计 n顺序程序是一种最简单的程序结构,也称为直线程序,它的执行自始自终按照语句的先后顺序进行。这种结构的流程图,除了有一个起始框,一个终止框外,就是若干执行框。page西安邮电学院 计算机系402024/8/10 周六例 42 试编制一程序,完成10+3的操作。AREA ARMex,CODE,READONLY;代码段名ARMexENTRY;程序的入口CODE 32startMOVR0,#10;将立即数10存入寄存器R0MOVR1,#3;将立即数3存入寄存器R1ADDR0,R0,R1;R0=R0+R1stopMOVR0,

33、#0 x18;这三条指令是ADS调试环境特约LDRR1,=0 x20026;程序运行结束返回编译器调试环境SWI0 x123456END;结束 page西安邮电学院 计算机系412024/8/10 周六4.3.4 分支程序设计 n许多实际问题需要根据不同的情况作出不同的处理。在程序中,针对不同的情况把不同的处理方法编制成各自的处理程序段,运行时由机器根据当时的条件自动作出判断,选择执行相应的处理程序段。这样的程序结构中,计算机不再完全按指令存储的顺序执行,称之为分支。分支程序使用转移指令B、子程序调用指令BL或带状态转移指令BX来实现。page西安邮电学院 计算机系422024/8/10 周六

34、例 43 给定以下符号函数:任意给定值,假定为-25,存放 在x单元,函数值存放在y单元;要求根据x中的值来确定y的值。R3=-1R3=0AREA symbol,CODE,READONLY;代码段的名字 symbolENTRY ;程序的入口CODE32startLDR R0,=x;加载数据段中的变量x地址,存入R0LDR R1,=y;加载数据段中的变量y地址,存入R1LDRR2,R0;加载变量x的值,存入R2compareCMPR2,#0;将R2的值与0作比较BEQZERO;如果R2等于0,那么转向标号ZERO处BGTPLUS;如果R2大于0,那么转向标号PLUS处 MOVR3,#-1;否则,

35、R2小于0,将-1存入R3中BstopZEROMOVR3,#0;R2等于0,将0存入R3中BstopPLUSMOVR3,#1;R2大于0,将1存入R3中;续上段代码stop STRR3,R1 MOVR0,#0 x18LDRR1,=0 x20026SWI0 x123456 AREA Data,DATA,READWRITExDCD-25yDCD0 END page西安邮电学院 计算机系432024/8/10 周六4.3.5 循环程序设计 n顺序程序和分支程序中的指令每次运行最多只执行一次。在实际应用中重复地做某些事的情况很多,这也是计算机最擅长的工作方式。重复地执行某些指令,最好用循环程序来实现。

36、n循环程序的结构-重复地执行同一种运算,直到某种条件满足。初始化循环体修改判断判断结束循环程序的主体业务代码,可以是一个顺序程序、分支程序或另一个循环程序。例如:计数控制循环;例如:计数控制循环;通过计数循环次数,判断是否已达到预定次数,控制循环。条件控制循环条件控制循环:通过判断循环终止条件是否已成立,控制循环。建立循环初始值。如设置地址指针、计数器、其他循环参数的起始值等。判断循环结束条件是否成立,决定是否继续循环。对循环结束进行适当处理;有的循环程序可以没有这部分。为执行下一个循环而修改某些参数,尤其循环控制变量的修改等。page西安邮电学院 计算机系442024/8/10 周六用计数控

37、制循环适用于已知循环次数的循环程序设计 例 44 从x单元开始的30个连续字单元中存放 有30个无符号数,从中找出最大者送入y单元中。分析:根据题意,把第一个数先送入Rx寄存器,将Rx中的数与后 面的29个数逐个进行比较,如果Rx中的数较小,则将该较 大的数送入Rx;继续与余下的数据逐个比较。在比较过程 中,Rx中始终保持较大的数,共计比较29次,则最终Rx 中保留了最大数,最后把Rx中的数(最大者)送入y单元。AREA max,CODE,READONLY;代码段的名字 maxENTRY ;程序的入口CODE32numEQU29 ;比较的次数startLDRR0,=x ;R0指向源数据块xLD

38、RR1,=y ;R1指向单元yLDRR2,=num ;R2作为计数器LDRR3,R0 ;将源数据块x中第一个数加载到R3中compareADDR0,R0,#;每进行一次比较,将R0指针地址加4LDRR4,R0 ;依次将源数据块x中下一个数加载到R4中CMPR3,R4 ;比较R3和R4中数的大小 MOVCC R3,R4 ;如果R3小于R4,则将较大的数送入R3中SUBSR2,R2,#;计数器值减1BNEcompare ;如果不为0,那么继续跳到compare执行STREQ R3,R1 ;如果为0,那么循环比较结束,R3是最大的数 ;并且将R3中的数加载到R1指向的单元(即y)中 stopMOVr

39、0,#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西安邮电学院 计算机系452024/8/10 周六 适用于已知循环条件的循环程序设计适用于无法确定循环次数,但知道循环结束的条件例 45 从自然数1开始累加,直到累加和大于1000为止,统计被累加的自然数的个数,并把统计的个数送入n单元,把累加和

40、送入sum单元。分析:根据题意,被累加的自然数的个数事先未知,因此不能用计数方法控制循环。但题目中给定一个条件,即累加和大于1000则停止累加,因此,可以根据这一条件控制循环。我们用R3寄存器放累加和,用R4寄存器放每次取得的自然数,其中它的值也是统计自然数的个数。AREA SUM,CODE,READONLY;代码段的名字 SUM ENTRY ;程序的入口 CODE32start LDR R0,=n ;将数据段中自然数的个数n的地址加载到R0寄存器 LDR R1,=sum ;将数据段中自然数的累加和sum的地址加载到R1寄存器 LDR R3,=0 ;R3存放自然数的累加和 LDR R4,=0

41、;R4用于循环个数的统计/每次取得的自然数 LDR R5,=1000 ;R5用于循环结束的界限值continue ADD R4,R4,#1 ;取下一个自然数 ADDR3,R3,R4 ;累加自然数 CMP R3,R5 ;比较累加和是否超过了1000 BCC continue ;如果小于1000,那么跳到compare执行 STRCS R3,R1 ;如果大于1000,那么将累加和存储到R1所指向的单元中 STRCS R4,R0 ;如果大于1000,那么将已累加的自然数个数值存储 ;到R0所指向的单元中 stop MOV r0,#0 x18 LDR r1,=0 x20026 SWI 0 x12345

42、6 AREA Data,DATA,READWRITEnDCD0 ;定义累加的自然数的个数sumDCD0 ;定义自然数的累加和 ENDpage西安邮电学院 计算机系462024/8/10 周六双重循环应用举例:冒泡算法对 N个单元数据排序!a0a1a2a3a(N-2)a(N-1)数据模型计算法分析:1、每个数据4个字节,内存中连续存放;2、冒泡算法;(同学们可否试描述该算法?)page西安邮电学院 计算机系472024/8/10 周六Data_TAB-待排序的数据表头;N-表中数据个数;冒泡排序算法框图page西安邮电学院 计算机系482024/8/10 周六4.3.6 子程序设计 n子程序概念

43、 如果在一个程序中的多处用到同一段程序代码,那么可以把这段共同的程序代码抽取出来,写成一个相对独立的程序段,每当需要执行这段代码时,就调用这个程序段,执行完这个程序段后,再返回原来调用它的程序。这样编写程序时,就不必重复写这段代码了,而这样的程序段称为子程序或子过程。n子程序的调用与返回 主程序中使用BL指令实现子程序的调用BL子程序名在子程序结束处,使用如下指令返回到主程序中。MOV PC,LRn主程序与子程序之间的参数传递 主程序调用子程序时,可以向子程序传递一些参数;同样,子程序运行后也可把一些结果参数传回给主程序。主程序与子程序之间的这种信息传递称为参数传递。n三种参数传递方式 寄存器

44、传递参数方式 存储区域传递参数方式 堆栈传递参数方式 page西安邮电学院 计算机系492024/8/10 周六寄存器传递参数方式 n技术思想:主程序将待传递的数据直接写入约定的通用寄存器,在子程序中直接使用;或子程序返回后,主程序直接从约定的通用寄存器中获得子程序的结果数据。n应用特点:这种方式适合于传递较少参数的应用场合。例 45 用子程序实现内存区里的字符串拷贝功能,即将存储单元中源字符串对应拷贝到目的字符串中。解题思路:通过设定两个地址指针,分别指向存储区中的源字符串和目的字符串;然后通过加载和存储指令(LDR和STR)的寄存器间接寻址方式,依次从源字符串读取一个字符数据,写入到目的字

45、符串的对应字符位置中,直到遇到源字符串的结束标志0为止。AREA StrCopy,CODE,READONLY ENTRY CODE32start LDR R1,=srcstr ;R1指向数据区的源字符串 LDR R0,=dststr ;R0指向数据区的目的字符串 BL strcopy ;调用子程序strcopy,完成字符串拷贝stop MOV R0,#0 x18 ;程序结束返回编译器调试环境 LDR R1,=0 x20026 SWI 0 x123456strcopy LDRB R2,R1,#1 ;将R1指向的单元内容加载到R2中 STRB R2,R0,#1 ;将R2中的数存储到R0指向的单元中

46、 CMP R2,#0 ;检查R0的值是否等于0 BNE strcopy ;如果不等于0,那么转到strcopy处执行 MOV PC,LR ;子程序返回 AREA Strings,DATA,READWRITEsrcstr DCB First string-source,0;源字符串dststr DCB Second string-destination,0;目的字符串 END page西安邮电学院 计算机系502024/8/10 周六存储区域传递参数方式 n技术思想:主程序和子程序约定了某一共享内存块用于参数传递,主程序在BL调用子程序前,先将要传递的参数写入到约定的存储单元,子程序可从约定的内

47、存读取这些参数;子程序返回时,也可以使用该方式将数据传给主程序。n应用特点:这种方式可以传递大批量数据。n实现方法:当主程序与子程序有较多的数据需要传递时,可以通过共享内存区或传内存数据块地址方式来传递批量数据。通过伪指令ADR直接装载近距离数据块地址;通过伪指令ADRL直接装载中距离数据块地址;通过语句LDR Rd,=Label转载远距离的数据块地址;例 46 通过设置的入口参数查找函数地址表,实现选择不同的函数功能。说明:本题中通过事先将函数地址存放在存储单元中,通过查找地址表的方法,实现根据“选择项(choice)”进入不同的函数体功能。page西安邮电学院 计算机系512024/8/1

48、0 周六存储区域传递参数方式 AREA Jump,CODE,READONLY num EQU 4;函数地址表内容的个数 ENTRY CODE32start LDR R0,=choice;R0指向存储区的choice单元 LDR R0,R0;设置第一个参数:选择执行哪一个函数 MOV R1,#16;设置第1个操作数 MOV R2,#2;设置第2个操作数 BL arithfunc;调用子程序arithfuncstop MOV R0,#0 x18;程序结束返回编译器调试环境 LDR R1,=0 x20026 SWI 0 x123456arithfunc CMP R0,#num ;比较R0的值是否超过

49、函数地址表的个数 MOVHS PC,LR ;如果大于,那么就返回到标号stop处 ADR R3,JumpTable;将函数地址表的地址作为基地址 LDR PC,R3,R0,LSL#2;根据R0参数进入对应的子程序JumpTable;函数地址表的入口基地址 DCD DoAdd;加法子程序 DCDDoSub;减法子程序 DCDDoMul;乘法子程序 DCDDoDiv;除法子程序DoAdd ADD R0,R1,R2 ;R0=R1+R2 MOV PC,LR;返回DoSub SUB R0,R1,R2 ;R0=R1-R2 MOV PC,LR;返回DoMul MOV R0,R1,LSL R2;R0=R1 R

50、2 MOV PC,LR;返回 AREA NUM,DATA,READWRITEchoiceDCD3 ;0:表示选择加法子程序 1:表示选择减法子程序 ;2:表示选择乘法子程序 3:表示选择除法子程序 ENDpage西安邮电学院 计算机系522024/8/10 周六 堆栈传递参数方式 n主程序和子程序使用同一个堆栈,主程序在BL调用子程序前,先将要传递的参数压入到堆栈中,子程序可从堆栈中读取传过来的数据;子程序返回需要向主程序传递参数时,也可使用此方法。page西安邮电学院 计算机系532024/8/10 周六第4章 目录q1.汇编语言的基本概念q2.ARM汇编程序的组成与结构q3.汇编语言程序设

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服