版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选ppt第第6 6章章 ARMARM本章的主要内容本章的主要内容1 1、ARMARM汇编语言程序设计汇编语言程序设计2 2、ARMARM程序的框架结构程序的框架结构3 3、C C语言程序对汇编程序的调用语言程序对汇编程序的调用4 4、ARMARM与与C C语言混合程序设计语言混合程序设计精选ppt6.1 ARM6.1 ARM工程工程 由于由于C C语言便于理解,有大量的支持语言便于理解,有大量的支持库,所以它是当前库,所以它是当前ARMARM程序设计所使用的程序设计所使用的主要编程语言。主要编程语言。 对硬件系统的初始化、对硬件系统的初始化、CPUCPU状态设定、状态设定、中断使能、主频设定
2、以及中断使能、主频设定以及RAMRAM控制参数初控制参数初始化等始化等C C程序力所不能及的底层操作,还程序力所不能及的底层操作,还是要由汇编语言程序来完成。是要由汇编语言程序来完成。精选ppt 用汇编语言或用汇编语言或C/C+C/C+语言编写的程序叫语言编写的程序叫做源程序,对应的文件叫做源文件。做源程序,对应的文件叫做源文件。 一个一个ARMARM工程应由多个文件组成,其工程应由多个文件组成,其中包括扩展名为中包括扩展名为.S.S的汇编语言源文件、扩的汇编语言源文件、扩展名为展名为.C.C的的C C语言源文件,扩展名为语言源文件,扩展名为.CPP.CPP的的C+C+源文件、扩展名为源文件、
3、扩展名为.H.H的头文件等。的头文件等。 ARM ARM工程的各种源文件之间的关系,以工程的各种源文件之间的关系,以及最后形成可执行文件的过程如下:及最后形成可执行文件的过程如下:精选ppt汇编语言汇编语言源文件源文件汇编器汇编器目标文件目标文件C/C+语言语言源文件源文件编译器编译器目标文件目标文件头文件头文件C/C+库文件库文件连接器连接器可执行文件可执行文件精选ppt ARM ARM提供的开发工具提供的开发工具Code Warrior for Code Warrior for ARMARM中包含的编译器如下:中包含的编译器如下:编译器编译器语言种类语言种类 源文件类型源文件类型源文件扩展
4、名源文件扩展名目标文件类型目标文件类型ArmccArmccC CC C.c.cARMARM代码代码TccTccC CC C.c.cThumbThumb代码代码ArmcppArmcppC+C+c/c+c/c+.c/.cpp.c/.cppARMARM代码代码tcpptcppC+C+c/c+c/c+.c/.cpp.c/.cppThumbThumb代码代码精选ppt 除了除了C C和和C+C+编译器,编译器,Code Warrior Code Warrior for ARMfor ARM开发工具还提供了汇编器开发工具还提供了汇编器ARMASMARMASM。 编译器负责生成目标文件,它是一种编译器负责生
5、成目标文件,它是一种包含了调试信息的包含了调试信息的ELFELF格式文件。格式文件。 编译器还要生成列表文件等相关文件:编译器还要生成列表文件等相关文件:精选ppt文件扩展名文件扩展名说明说明.h.h头文件头文件.o.oELFELF格式的目标文件格式的目标文件.s.s汇编代码文件汇编代码文件.lst.lst错误及警告信息列表文件错误及警告信息列表文件精选ppt 各种源文件先由编译器和汇编器将它各种源文件先由编译器和汇编器将它们分别编译或汇编成汇编语言文件及目标们分别编译或汇编成汇编语言文件及目标文件。文件。 连接器负责将所有目标文件连接成一连接器负责将所有目标文件连接成一个文件并确定各指令的确
6、定地址,从而形个文件并确定各指令的确定地址,从而形成最终可执行文件。成最终可执行文件。 连接器有三个功能:连接器有三个功能:精选ppt(1 1)生成与地址相关的代码,把所有文)生成与地址相关的代码,把所有文件连接成一个可执行文件。件连接成一个可执行文件。(2 2)根据程序员所指定的选项,为程序分)根据程序员所指定的选项,为程序分配地址空间。配地址空间。(3 3)给出连接信息,以说明连接过程和)给出连接信息,以说明连接过程和连接结果。连接结果。精选ppt6.2 ARM6.2 ARM汇编语言程序设计汇编语言程序设计6.2.1 6.2.1 段段 汇编语言编写的程序叫做汇编语言源汇编语言编写的程序叫做
7、汇编语言源程序,包含源程序的文件叫做汇编语言程程序,包含源程序的文件叫做汇编语言程序文件。序文件。 一个工程可以有多个源文件,汇编源一个工程可以有多个源文件,汇编源文件的扩展名为文件的扩展名为.S.S。精选ppt 在在ARMARM(ThumbThumb)汇编语言程序中,通)汇编语言程序中,通常以段为单位来组织代码。段是具有特定常以段为单位来组织代码。段是具有特定名称且功能相对独立的指令或数据序列。名称且功能相对独立的指令或数据序列。 根据段的内容,分为代码段和数据段。根据段的内容,分为代码段和数据段。 一个汇编程序至少应该有一个代码段,一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为
8、多个代码段和当程序较长时,可以分割为多个代码段和数据段。数据段。精选ppt 以下是一个汇编语言程序段的基本结构:以下是一个汇编语言程序段的基本结构: AREA Init, CODE, READONLY /AREA Init, CODE, READONLY /只读的代码段只读的代码段InitInit ENTRY / ENTRY /程序入口点程序入口点 start LDR R0,#0X3FF5000start LDR R0,#0X3FF5000 LDR R1,0XFF LDR R1,0XFF STR R1,R0 STR R1,R0 LDR R0,#0X3FF5008 LDR R0,#0X3FF50
9、08 LDR R1,0X01 LDR R1,0X01 STR R1,R0 STR R1,R0 . . END / END /段结束段结束精选ppt6.2.2 6.2.2 分支程序设计分支程序设计 具有两个或两个以上可选执行路径的具有两个或两个以上可选执行路径的程序叫做分支程序。程序叫做分支程序。1 1、普通分支程序设计、普通分支程序设计 使用带有条件码的指令可以很容易地使用带有条件码的指令可以很容易地实现分支程序。实现分支程序。精选ppt例:编写一个分支程序段,如果寄存器例:编写一个分支程序段,如果寄存器R5R5中的数据等于中的数据等于1010,就把,就把R5R5中的数据存如寄中的数据存如寄存
10、器存器R1R1;否则把;否则把R5R5中的数据分别存储寄存中的数据分别存储寄存器器R0R0和和R1R1。精选ppt(1 1)用条件指令实现的分支程序段)用条件指令实现的分支程序段 CMP R5CMP R5,#10 #10 MOVNE R0 MOVNE R0,R5R5 MOV R1 MOV R1,R5R5(2 2)用条件转移指令来实现分支)用条件转移指令来实现分支 CMP R5CMP R5,#10 #10 BEQ doequal BEQ doequal MOV R0 MOV R0,R5R5 doequal MOV R1,R5 doequal MOV R1,R5精选ppt例:编写一个程序段,当寄存
11、器例:编写一个程序段,当寄存器R1R1中的数中的数据大于据大于R2R2中数据时,将中数据时,将R2R2中的数据加中的数据加1010存存入寄存器入寄存器R1R1;否则将;否则将R2R2中数据加中数据加5 5存入寄存存入寄存器器R1R1。精选ppt CMP R1CMP R1,R2R2 ADDHI R1 ADDHI R1,R2R2,#10#10 ADDLS R1 ADDLS R1,R2R2,#5#52 2、多分支(散转)程序设计、多分支(散转)程序设计 程序分支点上有多于两个以上的执行程序分支点上有多于两个以上的执行路径的程序叫做多分支程序。利用条件测路径的程序叫做多分支程序。利用条件测试指令或跳转
12、表可以实现多分支程序。试指令或跳转表可以实现多分支程序。精选ppt例、编写一个程序段,判断寄存器例、编写一个程序段,判断寄存器R1R1中数中数据是否为据是否为1010、1515、1212、2222。如果是,则将。如果是,则将R0R0中的数据加中的数据加1 1;否则将;否则将R0R0设置为设置为0XF0XF。精选ppt MOV R0 MOV R0,#0#0 TEQ R1 TEQ R1,#10#10 TEQNE R1 TEQNE R1,#15#15 TEQNE R1 TEQNE R1,#12#12 TEQNE R1 TEQNE R1,#22#22 ADDEQ R0 ADDEQ R0,R0R0,#1
13、#1 MOVNE R0 MOVNE R0,#0XF#0XF精选ppt 当多分支程序的每个分支所对应的是当多分支程序的每个分支所对应的是一个程序段时,常常把各个分支程序段的一个程序段时,常常把各个分支程序段的首地址依次存放在一个叫做跳转地址表的首地址依次存放在一个叫做跳转地址表的存储区域,然后在程序的分支点处使用一存储区域,然后在程序的分支点处使用一个可以将跳转表中的目标地址传送到个可以将跳转表中的目标地址传送到PCPC的的指令来实现分支。指令来实现分支。 一个具有一个具有3 3个分支的跳转地址表示意个分支的跳转地址表示意图如下:图如下:精选ppt精选ppt MOV R0MOV R0,N N A
14、DR R5 ADR R5,JPTBJPTB LDR PC LDR PC,R5R5,R0R0,LSL #2LSL #2JPTAB JPTAB ;跳转表;跳转表 DCD FUN0DCD FUN0 DCD FUN1 DCD FUN1 ECD FUN2 ECD FUN2FUN0 FUN0 . . ;分支;分支FUN0FUN0的程序段的程序段FUN1 FUN1 . . ;分支;分支FUN1FUN1的程序段的程序段 FUN2 FUN2 . . ;分支;分支FUN2FUN2的程序段的程序段精选ppt3 3、带、带ARM/ThumbARM/Thumb状态切换的分支程序设计状态切换的分支程序设计 在在ARMAR
15、M程序中经常需要在程序跳转的同程序中经常需要在程序跳转的同时还要进行处理器状态的转移,即从时还要进行处理器状态的转移,即从ARMARM指指令程序段跳转到令程序段跳转到ThumbThumb指令程序段(或相指令程序段(或相反)。为了实现这个功能,系统提供了一反)。为了实现这个功能,系统提供了一条专用的、可以实现条专用的、可以实现4GB4GB空间范围内的绝对空间范围内的绝对跳转交换指令跳转交换指令BXBX。精选ppt精选ppt 下面是一段从下面是一段从ARMARM指令程序段跳转到指令程序段跳转到ThumbThumb指令程序的状态切换例程。指令程序的状态切换例程。 ;ARMARM指令程序指令程序 CO
16、DE32CODE32 . ADD R0,Into_Thumb +1 ADD R0,Into_Thumb +1 BX R0 BX R0 . ;Thumb ;Thumb指令程序指令程序 CODE16CODE16Into_Thumb Into_Thumb . .精选ppt 下面是一段从下面是一段从Thumb 指令程序段跳转指令程序段跳转到到ARM指令程序的状态切换例程。指令程序的状态切换例程。 ; ThumbThumb 指令程序指令程序 CODE16CODE16 . ADD R5,Back_to_ARM ADD R5,Back_to_ARM BX R0 BX R0 . ; ARM ; ARM指令程序
17、指令程序 CODE32CODE32Back_to_ARM Back_to_ARM . .精选ppt6.2.3 6.2.3 循环程序设计循环程序设计 当条件满足时,需要重复执行同一个当条件满足时,需要重复执行同一个程序段做同样工作的程序叫做循环程序。程序段做同样工作的程序叫做循环程序。 被重复执行的程序段叫做循环体,需被重复执行的程序段叫做循环体,需要满足的条件叫做循环条件。要满足的条件叫做循环条件。 循环程序有两种结构:循环程序有两种结构:DO-WHILEDO-WHILE结构结构和和DO-UNTILDO-UNTIL结构。结构。精选pptDO-WHILEDO-WHILE结构结构DO-UNTILD
18、O-UNTIL结构结构精选ppt 在汇编语言程序设计中,常用的是在汇编语言程序设计中,常用的是DO-DO-UNTILUNTIL结构循环程序。结构循环程序。 MOV R1MOV R1,#10#10LOOP LOOP . . SUB R1 SUB R1,R1R1,#1#1 BNE LOOP BNE LOOP例、编写一个程序,把首地址为例、编写一个程序,把首地址为DATA_SRCDATA_SRC的的8080个字的数据复制到首地址为个字的数据复制到首地址为DATA_DSTDATA_DST的目标数据块中。的目标数据块中。精选ppt LDR R1LDR R1,#DATA_SRC#DATA_SRC LDR
19、R0 LDR R0,#DATA_DST#DATA_DST MOV R10 MOV R10,#10#10LOOP LDMIA R1LOOP LDMIA R1!,!,R2-R9R2-R9 STMIA R0 STMIA R0!,!,R2-R9R2-R9 SUBS R10 SUBS R10,R10R10,#1#1 BNE LOOP BNE LOOP6.2.4 6.2.4 子程序及其调用子程序及其调用精选ppt1 1、子程序的调用与返回、子程序的调用与返回 人们把这种可以多次反复调用的、能人们把这种可以多次反复调用的、能完成指定功能的程序段称为完成指定功能的程序段称为“子程序子程序”。把调用子程序的程序
20、称为把调用子程序的程序称为“主程序主程序”。 为进行识别,子程序的第为进行识别,子程序的第1 1条指令之前条指令之前必须赋予一个标号,以便其他程序可以用必须赋予一个标号,以便其他程序可以用这个标号调用子程序。这个标号调用子程序。精选ppt 在在ARMARM汇编语言程序中,主程序一般通汇编语言程序中,主程序一般通过过BLBL指令来调用子程序。该指令在执行时指令来调用子程序。该指令在执行时完成如下操作:将子程序的返回地址存放完成如下操作:将子程序的返回地址存放在连接寄存器在连接寄存器LRLR中,同时将程序计数器中,同时将程序计数器PCPC指向子程序的入口点。指向子程序的入口点。 为使子程序执行完毕
21、能返回主程序的为使子程序执行完毕能返回主程序的调用处,子程序末尾处应有调用处,子程序末尾处应有MOVMOV、B B、BXBX、STMFDSTMFD等指令,并在指令中将返回地址重新等指令,并在指令中将返回地址重新复制到复制到PCPC中。中。精选ppt 在调用子程序的同时,也可以使用在调用子程序的同时,也可以使用R0R3R0R3来进行参数的传递和从子程序返回运来进行参数的传递和从子程序返回运算结果。算结果。例、一个使用例、一个使用MOVMOV指令实现返回的子程序。指令实现返回的子程序。 relay relay . MOV PC, LR MOV PC, LR 使用使用B B指令实现返回的子程序。指令
22、实现返回的子程序。 relay relay . B LR B LR 精选ppt例、一个使用例、一个使用BLBL指令调用子程序的汇编语指令调用子程序的汇编语言缘程序的基本结构。言缘程序的基本结构。 AERA Init, CODE, READONLYAERA Init, CODE, READONLY ENTRY ENTRY start LDR R0,#0X3FF5000 start LDR R0,#0X3FF5000 LDR R1,0XFF LDR R1,0XFF STR R1,R0 STR R1,R0 LDR R0,#0X3FF5008 LDR R0,#0X3FF5008 LDR R1,0X01
23、 LDR R1,0X01 STR R1,R0 STR R1,R0 BL PR BL PR . .精选ppt PR PR MOV PC MOV PC,LRLR END END2 2、子程序中堆栈的使用、子程序中堆栈的使用 relay relay STMFD R13!,R0R12,LR STMFD R13!,R0R12,LR;压入堆栈;压入堆栈 ;子程序代码;子程序代码 LDMFD R13!,R0R12,PC LDMFD R13!,R0R12,PC ;弹出堆栈并返回;弹出堆栈并返回精选ppt6.2.5 6.2.5 汇编程序访问全局汇编程序访问全局C C变量变量 一般来说,汇编语言程序与一般来说,汇
24、编语言程序与C C语言程语言程序不在同一个文件上,所以实质上这是一序不在同一个文件上,所以实质上这是一个引用不同文件定义的变量问题。解决这个引用不同文件定义的变量问题。解决这个问题的办法就是使用关键字个问题的办法就是使用关键字IMPORTIMPORT和和EXPORTEXPORT。例、下面是一个汇编代码的函数,它引用例、下面是一个汇编代码的函数,它引用了一个在其他文件中定义的全局变量了一个在其他文件中定义的全局变量globvarglobvar,将其加,将其加2 2后写回后写回globvar globvar 。精选ppt AREA globvar, CODE, READONLYAREA globv
25、ar, CODE, READONLY EXPORT asmsubrouttine EXPORT asmsubrouttine IMPORT globvar IMPORT globvarAsmsubrouttineAsmsubrouttine LDR R1,# globvar LDR R1,# globvar LDR R0,R1 LDR R0,R1 ADD R0,R0,#2 ADD R0,R0,#2 STR R0,R1 STR R0,R1 MOV PC,LR MOV PC,LR END END精选ppt6.3 ARM6.3 ARM程序框架程序框架 在应用系统的程序设计中,若所有的在应用系统的程序
26、设计中,若所有的编程任务均用汇编语言来完成,其工作量编程任务均用汇编语言来完成,其工作量是可想而知的,这样做也不利于系统升级是可想而知的,这样做也不利于系统升级或应用软件移植。或应用软件移植。 通常汇编语言部分完成系统硬件的初通常汇编语言部分完成系统硬件的初始化;高级语言部分完成用户的应用。始化;高级语言部分完成用户的应用。精选ppt 执行时,首先执行初始化部分,然后执行时,首先执行初始化部分,然后再跳转到再跳转到C/C+C/C+部分。整个程序结构显得清部分。整个程序结构显得清晰明了,容易理解。程序的基本结构如下:晰明了,容易理解。程序的基本结构如下: 硬件初始化的汇编语硬件初始化的汇编语 言
27、程序(特权模式)言程序(特权模式)B main完成用户任务的完成用户任务的C/C+程序(用户模式)程序(用户模式)跳转跳转精选ppt6.3.1 6.3.1 初始化程序部分初始化程序部分 由于在用于完成初始化任务的汇编语由于在用于完成初始化任务的汇编语言程序中需要在特权模式下做一些诸如修言程序中需要在特权模式下做一些诸如修改改CPSRCPSR等特权操作,所以不能过早地进入等特权操作,所以不能过早地进入用户模式。用户模式。 通常,初始化过程大致会经历如下所通常,初始化过程大致会经历如下所示的一些模式变化。示的一些模式变化。精选ppt启动启动管理模式管理模式svcsvc其他特权模式其他特权模式用户模
28、式用户模式usrusr汇编语言汇编语言程序段程序段精选ppt6.3.26.3.2初始化部分与主应用程序部分的衔接初始化部分与主应用程序部分的衔接 当所有的系统初始化工作完成之后,当所有的系统初始化工作完成之后,就需要把程序流程转入主应用程序。最简就需要把程序流程转入主应用程序。最简单的方法是,在汇编语言程序末尾使用跳单的方法是,在汇编语言程序末尾使用跳转指令转指令B B或或BLBL直接从启动代码转移到直接从启动代码转移到C/C+C/C+程序入口。程序入口。B main ;B main ;跳转到跳转到C/C+C/C+程序程序精选ppt 同时在汇编文件中有如下代码同时在汇编文件中有如下代码: :
29、IMPORT main IMPORT main 完整的汇编语言程序如下完整的汇编语言程序如下: : IMPORT main AREA Init, CODE, READONLY ENTRY LDR R0,#0X3FF000 LDR R1,#0XE7FFFF80 STR R1,R0 LDR SP,#0X3EE1000 BL main END精选ppt C C程序如下程序如下: : void main(void)void main(void) . 6.3.3 ARM6.3.3 ARM开发环境提供的程序框架开发环境提供的程序框架精选ppt 为方便工程开发,为方便工程开发,ARMARM公司的开发环境公司
30、的开发环境ARM ADSARM ADS为用户提供了一个可以选用的应用为用户提供了一个可以选用的应用程序框架。该框架把为用户程序做准备工程序框架。该框架把为用户程序做准备工作的程序分成了启动代码和应用程序初始作的程序分成了启动代码和应用程序初始化两部分。化两部分。 用于硬件初始化的汇编语言部分叫做用于硬件初始化的汇编语言部分叫做启动代码;用于应用程序初始化的启动代码;用于应用程序初始化的C C部分部分叫做初始化部分。整个程序如下所示:叫做初始化部分。整个程序如下所示:精选ppt IMPORT_main IMPORT_main 启动代码启动代码B_mainB_main应用程序初始化应用程序初始化主
31、用程序主用程序_main()_main()main()main()精选ppt6.4 C6.4 C与汇编之间的函数调用与汇编之间的函数调用 在在ARMARM工程中,工程中,C C程序调用汇编函数和程序调用汇编函数和汇编程序调用汇编程序调用C C函数是经常发生的事情。为函数是经常发生的事情。为此人们制定了此人们制定了ARM-ThumbARM-Thumb过程调用标准过程调用标准ATPCSATPCS(ARM-Thumb Procedure Call ARM-Thumb Procedure Call StandardStandard)。)。6.4.1 ATPCS6.4.1 ATPCS简介简介精选ppt1
32、 1、堆栈与寄存器在函数调用中的作用、堆栈与寄存器在函数调用中的作用 函数是通过寄存器和堆栈来传递参数函数是通过寄存器和堆栈来传递参数和返回函数值的。和返回函数值的。下面是下面是C C语言程序调用语言程序调用C C函数的情况。函数的情况。 int AddInt(int x, int y)int AddInt(int x, int y) int s; int s; s = x + y; s = x + y; return s; return s; 精选ppt 在在C C程序中,主函数程序中,主函数main()main()调用该函调用该函数的方法如下:数的方法如下: void main(void)
33、void main(void) . AddInt(a,b); / AddInt(a,b); /调用调用 精选ppt ARM ARM编译器使用的函数调用规则就是编译器使用的函数调用规则就是ATPCSATPCS标准。标准。ATPCSATPCS标准既是标准既是ARMARM编译器的编译器的规则,也是设计可被规则,也是设计可被C C程序调用的汇编函数程序调用的汇编函数的编写规则。的编写规则。2 2、ATPCSATPCS关于堆栈和寄存器的使用规则关于堆栈和寄存器的使用规则 ATPCS ATPCS规定,规定,ARMARM的数据堆栈为的数据堆栈为FDFD型堆型堆栈,即递减满堆栈。栈,即递减满堆栈。精选ppt
34、ATPCS ATPCS标准规定,对于参数个数不多于标准规定,对于参数个数不多于4 4的函数,编译器必须按参数在列表中的顺的函数,编译器必须按参数在列表中的顺序,自左向右为它们分配寄存器序,自左向右为它们分配寄存器R0R3R0R3。其。其中函数返回时,中函数返回时,R0R0还被用来存放函数的返还被用来存放函数的返回值。回值。精选ppt 如果函数的参数多于如果函数的参数多于4 4个,那么多余个,那么多余的参数则按自右向做的顺序压入数据堆栈,的参数则按自右向做的顺序压入数据堆栈,即参数入栈顺序与采纳书顺序相反。即参数入栈顺序与采纳书顺序相反。精选ppt 下表列举了下表列举了ARM-ThumbARM-
35、Thumb过程调用标准过程调用标准规定的寄存器的名称和使用方法。规定的寄存器的名称和使用方法。寄存器寄存器别名别名1 1别名别名2 2用法用法R0R3R0R3A1A4A1A4参数寄存器,其中参数寄存器,其中R0R0又被用作函数返回值寄存器又被用作函数返回值寄存器R4R8R4R8V1V5V1V5函数局部变量寄存器函数局部变量寄存器R9R9V6V6SbSb在在RWPIRWPI情况下保存静态基地址情况下保存静态基地址R10R10V7V7SlSl用来保存堆栈边界地址用来保存堆栈边界地址R11R11V8V8FpFp保存结构指针保存结构指针R12R12IpIp过度寄存器过度寄存器R13R13SpSp堆栈指
36、针堆栈指针R14R14LRLR连接寄存器连接寄存器R15R15PCPC程序计数器程序计数器精选ppt 寄存器的别名和特殊名称都是寄存器的别名和特殊名称都是ARMARM编译编译器和汇编器预定义的,用户可以直接使用。器和汇编器预定义的,用户可以直接使用。6.4.2 C6.4.2 C程序可调用汇编函数实例程序可调用汇编函数实例 下面是一个用汇编语言编写的函数,下面是一个用汇编语言编写的函数,该函数把该函数把R1R1指向的数据块复制到指向的数据块复制到R0R0指向的指向的存储快。存储快。精选ppt AREA strcopy, CODE, READONLYAREA strcopy, CODE, READ
37、ONLY EXPORT strcopy EXPORT strcopy strcopy strcopy LDRB R2,R1,#1 LDRB R2,R1,#1 STRB R2,R0,#1 STRB R2,R0,#1 CMP R2,#0 CMP R2,#0 BNE strcopy BNE strcopy MOV PC,LR MOV PC,LR END END精选ppt 根据根据ATPCSATPCS的的C C语言程序调用汇编函数,语言程序调用汇编函数,参数由左向右依次传递给寄存器参数由左向右依次传递给寄存器R0R3R0R3的的规则,可知汇编函数规则,可知汇编函数strcopystrcopy在在C C
38、程序中原程序中原型应该为:型应该为: void strcopy(char void strcopy(char * *d, const char d, const char * *s);s); 在在C C语言文件中,调用语言文件中,调用strcopystrcopy函数的函数的方法如下:方法如下:精选ppt extern void strcopy(char extern void strcopy(char * *d, const char d, const char * *s);s); int main(void) int main(void) const char const char * *s
39、rc = src = “sourcesource”; ; char dest10; char dest10; . . strcopy(dest, src; strcopy(dest, src; . . 精选ppt6.4.3 6.4.3 汇编程序调用汇编程序调用C C函数实例函数实例 现有现有C C函数函数g()g()如下:如下: int g(int a, int b, int c, int d, int e)int g(int a, int b, int c, int d, int e) return a+b+c+d+e; return a+b+c+d+e; 汇编函数汇编函数f f中调用中调用
40、C C函数函数g()g(),以实现,以实现下面的功能。下面的功能。精选ppt 整个汇编函数整个汇编函数f f的代码如下:的代码如下: int f(int i) return int f(int i) return g(i, 2g(i, 2* *i, 3i, 3* *i, 4i, 4* *i,5i,5* *i)i) EXPORT f AREA f, CODE, READONLY IMPORT g ;声名;声名g为外部引用符号为外部引用符号 STR LR, SP,#-4 ;断点存入堆栈;断点存入堆栈 ADD R1,R0,R0 ;(;(R1)= i*2 ADD R2,R1,R0 ; (R2)= i*
41、3 ADD R3,R1,R2 ; (R3)= i*5 STR R3,SP,#-4 ;将(;将(R3)即第)即第5个参数个参数i*5存入堆栈存入堆栈 ADD R3,R1,R1 ;(;(R3)= i*4精选ppt BL g BL g ;调用;调用C C函数函数g g(),返回值在寄存器(),返回值在寄存器R0R0中中 ADD SP,SP,#4 ADD SP,SP,#4 ;清栈;清栈 RSB R0,R0,#0 RSB R0,R0,#0 ;函数;函数f f的返回值(的返回值(R0R0)=0-=0-(R0R0) LDR PC,SP,#4 LDR PC,SP,#4 ;恢复断点并返回;恢复断点并返回 END
42、END精选ppt6.5 C/C+6.5 C/C+语言和汇编语言的混合编程语言和汇编语言的混合编程 除了上面介绍的函数调用方法之外,除了上面介绍的函数调用方法之外,ARMARM编译器编译器armccarmcc中含有内嵌汇编器还允许中含有内嵌汇编器还允许在在C C程序中内联或嵌入式汇编代码,以提高程序中内联或嵌入式汇编代码,以提高程序的效率。程序的效率。6.5.1 6.5.1 内联汇编内联汇编1 1、定义内联汇编程序、定义内联汇编程序精选ppt 所谓内联汇编程序,就是在所谓内联汇编程序,就是在C C程序中程序中直接编写汇编程序段而形成一个语句块,直接编写汇编程序段而形成一个语句块,这个语句块可以使
43、用除了这个语句块可以使用除了BXBX和和BLXBLX之外的之外的全部全部ARMARM指令来编写,从而可以使程序实指令来编写,从而可以使程序实现一些不能从现一些不能从C C获得的底层功能。获得的底层功能。 其格式为:其格式为: _asm_asm 汇编语句块汇编语句块 精选ppt例:例: void enable_IRQ(void)void enable_IRQ(void) int tmp; int tmp; _asm / _asm /声名内联汇编代码声名内联汇编代码 MRS tmp, CPSR MRS tmp, CPSR BIC tmp, tmp, #0 x80 BIC tmp, tmp, #0
44、x80 MSR CPSR_c, tmp MSR CPSR_c, tmp 精选ppt2 2、内联汇编的限制、内联汇编的限制 内联汇编与真实汇编之间有很大区别,内联汇编与真实汇编之间有很大区别,会受到很多限制。会受到很多限制。(1 1)它不支持)它不支持ThumbThumb指令;除了程序状态指令;除了程序状态寄存器寄存器PSRPSR之外,不能直接访问其他任何之外,不能直接访问其他任何物理寄存器等。物理寄存器等。(2 2)如果在内联汇编程序指令中出现了)如果在内联汇编程序指令中出现了以某个寄存器名称命名的操作数,那么它以某个寄存器名称命名的操作数,那么它精选ppt被叫做虚拟寄存器,而不是实际的物理寄
45、被叫做虚拟寄存器,而不是实际的物理寄存器。编译器在生成和优化代码的过程中,存器。编译器在生成和优化代码的过程中,会给每个虚拟寄存器分配实际的物理寄存会给每个虚拟寄存器分配实际的物理寄存器,但这个物理寄存器可能与在指令中指器,但这个物理寄存器可能与在指令中指定的不同。唯一的一个例外就是状态寄存定的不同。唯一的一个例外就是状态寄存器器PSRPSR,任何对,任何对PSRPSR的引用总是执行指向物的引用总是执行指向物理理PSRPSR。精选ppt(3 3)在内联汇编代码中不能使用寄存器)在内联汇编代码中不能使用寄存器PCPC(R15R15)、)、LRLR(R14R14)和)和SPSP(R13R13),任
46、何试),任何试图使用这些寄存器的操作都会导致出现错图使用这些寄存器的操作都会导致出现错误消息。误消息。(4 4)鉴于上述情况,在内联汇编语句块)鉴于上述情况,在内联汇编语句块中最好使用中最好使用C C或或C+C+变量作为操作数。变量作为操作数。(5 5)虽然内联汇编代码可以更改处理器)虽然内联汇编代码可以更改处理器模式,但更改处理器模式会禁止使用模式,但更改处理器模式会禁止使用C C操操精选ppt作数或对已编译作数或对已编译C C代码的调用,直到将处理代码的调用,直到将处理器模式恢复为原设置之后。器模式恢复为原设置之后。6.5.2 6.5.2 嵌入式汇编嵌入式汇编 嵌入式汇编程序是一个编写在嵌
47、入式汇编程序是一个编写在C C程序外程序外的单独汇编程序,该程序段可以像函数那的单独汇编程序,该程序段可以像函数那样被样被C C程序调用。程序调用。精选ppt 与内联汇编不同,嵌入式汇编具有真与内联汇编不同,嵌入式汇编具有真实汇编的所有特性,数据交换符合实汇编的所有特性,数据交换符合ATPCSATPCS标标准,同时支持准,同时支持ARMARM和和ThumbThumb,所以它可以对,所以它可以对目标处理器进行不受限制的低级访问。但目标处理器进行不受限制的低级访问。但是不能直接引用是不能直接引用C/C+C/C+的变量。的变量。 用用_asm_asm声明的嵌入式汇编程序像声明的嵌入式汇编程序像C C
48、函函数那样可以有参数和返回值。定义一个嵌数那样可以有参数和返回值。定义一个嵌入式汇编函数的语法格式为:入式汇编函数的语法格式为:精选ppt _asm returntype functionname(parameter-list) 汇编程序段汇编程序段 returnreturntypetype:函数返回值类型;:函数返回值类型;functionfunctionnamename:函数名;:函数名;parameter-listparameter-list:函数参数列表。:函数参数列表。 嵌入式汇编在形式上看起来就像使用嵌入式汇编在形式上看起来就像使用关键字关键字_asm_asm进行了声明的函数,如下所示:进行了声明的函数,如下所示:精选ppt _asm int add(int I, int j)_asm int add(int I, int j) ADD R0,R0,R1 ADD R0,R0,R1 MOV PC,LR MOV PC,LR 参数名只允许使用在参数列表中,不参数名只允许使用在参数列表中,不能用在嵌入式汇编函数体内。如下面定义能用在嵌入式汇编
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度车展场地租赁与媒体合作合同3篇
- 2025年度农产品出口质量保障合同3篇
- 2025年度个人环保项目贷款合同(含环保指标达标)4篇
- 二零二五年度承包工地食堂员工心理健康关爱合同3篇
- 汕尾2025年广东汕尾陆河县第一批城镇公益性岗位招聘笔试历年参考题库附带答案详解
- 数字化时代的学生管理与德育工作变革
- 二零二五年度仓储设施租赁与运输服务合同3篇
- 普洱2024年云南普洱市科学技术局城镇公益性岗位工作人员招聘笔试历年参考题库附带答案详解
- 昭通2025年云南昭通巧家县人力资源和社会保障局零星选调工作人员笔试历年参考题库附带答案详解
- 社交媒体时代孩子的行为模式与心理变化
- JT-T-496-2018公路地下通信管道高密度聚乙烯硅芯塑料管
- 人员密集场所消防安全管理培训
- 《聚焦客户创造价值》课件
- PTW-UNIDOS-E-放射剂量仪中文说明书
- JCT587-2012 玻璃纤维缠绕增强热固性树脂耐腐蚀立式贮罐
- 保险学(第五版)课件全套 魏华林 第0-18章 绪论、风险与保险- 保险市场监管、附章:社会保险
- 典范英语2b课文电子书
- 员工信息登记表(标准版)
- 17~18世纪意大利歌剧探析
- 春节工地停工复工计划安排( 共10篇)
- 何以中国:公元前2000年的中原图景
评论
0/150
提交评论