书签 分享 收藏 举报 版权申诉 / 76
上传文档赚钱

类型ARM嵌入式系统原理与应用-第4章-ARM汇编语言及C语言程序设计基础.pptx

  • 上传人(卖家):三亚风情
  • 文档编号:3376514
  • 上传时间:2022-08-25
  • 格式:PPTX
  • 页数:76
  • 大小:1.04MB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《ARM嵌入式系统原理与应用-第4章-ARM汇编语言及C语言程序设计基础.pptx》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    ARM 嵌入式 系统 原理 应用 汇编语言 语言程序设计 基础
    资源描述:

    1、第4章 ARM汇编语言及C语言程序设计基础本章内容简介4.1 ARM汇编的语句汇编的语句格式格式4.2 ARM汇编的程序汇编的程序结构结构4.3 ARM汇编语言程序设计汇编语言程序设计举举例例4.4 ARM C 语言基础及混合编语言基础及混合编程程4.5 ARM 汇编语言实验基础汇编语言实验基础4.1 ARM汇编的语句格式ARM汇编语言基本的的语句格式如下:汇编语言基本的的语句格式如下:符号符号 指令、伪指令或伪操作指令、伪指令或伪操作 ;注释;注释 一些相同的基本特征一些相同的基本特征1、一条指令一行。、一条指令一行。2、使用标号(、使用标号(label)给内存单元提供名称,从第一列)给内存

    2、单元提供名称,从第一列开始书写。开始书写。3、指令必须从第二列或能区分标号的地方开始书写。、指令必须从第二列或能区分标号的地方开始书写。4、注释跟在指定的注释字符后面(、注释跟在指定的注释字符后面(ARM使用的是使用的是“;”),一直书写到行尾。),一直书写到行尾。4.1.1符号命名规则1符号由大小写字母、数字及下划线组成,符号不能用数字开头。2符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。3符号在其作用范围内必须唯一。4自定义的符号名不能与系统的保留字相同。5符号名不应与指令或伪指令同名。4.1.2 ARM汇编语言伪操作 伪操作(Directive)是ARM汇编语言程序里

    3、的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,对源程序运行汇编程序处理,而不是在计算机运行期间由处理器执行。表4-1 ARM汇编常用伪操作列表操作符语法格式功能描述ARMARM指示编译器处理的是32位ARM指令CODE32CODE32指示编译器处理的是32位ARM指令THUMBTHUMB指示编译器处理的是16位THUMB指令CODE16CODE16指示编译器处理的是16位THUMB指令AREA AREA nameattrattr段属性定义ENTRYENTRY声明程序的入口点ENDEND源程序结尾标识EQUname EQU expr,type定义常量或标号名称EXPORTEX

    4、PORT name声明全局标号IMPORTIMPORT name外部符号声明4.1.3 ARM汇编语言伪指令伪指令是ARM处理器支持的汇编语言程序里的特殊助记符,它不在处理器运行期间由机器执行,只是在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正的指令操作。ARM汇编语言伪指令如表3-2所示 表4-2 ARM汇编语言伪指令列表伪指令语法格式功能ADRADRcond register,=expression 它将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。ADRLADRLcondregister,=expression它将基于PC相对偏移的地址值或基于

    5、寄存器相对偏移的地址值读取到寄存器中。LDRLDRcond register,=expression将一个32位的常数或者一个地址值读取到寄存器中,可以看作是加载寄存器的内容。NOPNOPNOP是空操作伪指令,在汇编时将会被替代成ARM中的空操作4.1.3 ARM汇编语言伪指令1、ADR伪指令-小范围的地址读取在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。ADR伪指令中的地址是基于PC或寄存器的,当ADR伪指令中的地址是基于PC时,该地址与ADR伪指令必须在同一

    6、个代码段中。4.1.3 ARM汇编语言伪指令示例:LOOP MOV r0,#10;LOOP为行标,指示某一行代码ADR r4,LOOP;将LOOP地址放入r4(相对地址);因为pc值为当前指令地址值加8字节替换成本ADR伪指令将被编译器编译为;SUB r4,PC,#0 xc4.1.3 ARM汇编语言伪指令2、ADRL伪指令-中等范围的地址读取地址表达式expr的取值范围:当地址值是字节对齐时,其取指范围为:-64K64K;当地址值是字对齐时,其取指范围为:-256K256K;4.1.3 ARM汇编语言伪指令示例:LOOP MOV r0,#10;LOOP为行标,指示某一行代码ADRL r4,LO

    7、OP;将LOOP地址放入r4(相对地址);因为pc值为当前指令地址值加8字节替换成本ADR伪指令将被编译器编译为;SUB r4,PC,#0 xc;NOP (MOV r0,r0)4.1.3 ARM汇编语言伪指令3、LDR伪指令-大范围的地址读取在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。4.1.3 ARM汇编语言伪指令示例:LDR r1,=0 xff;将0 xff读取到r1中;编译后得到MOV r1,0 xff示例:

    8、LDR r1,=ADDR;将外部地址ADDR读取到R1中;汇编后将得到:;LDR r1,PC,OFFSET_TO_LPOOL;LPOOL DCD ADDR4.2 ARM汇编的程序结构 在ARM(Thumb)汇编语言程序中,以程序段为单位组织代码。段是相对独立的指令或数据序列,具有特定的名称。段可以分为代码段和数据段,代码段的内容为执行代码,数据段存放代码运行时需要用到的数据。一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成一个可执行的映象文件。【例4-1】汇编语言源程序的基本格式AREA EXAMPLE,CODE,READONLY ;

    9、定义段的名称和属性,表示了一个段的开始ENTRY ;标识程序的入口点 start ;以下为具体指令MOVR0,#10MOVR1,#3ADDR0,R0,R1END ;标识源文件的结束。1、顺序程序设计2、分支程序设计示例CMP R1,#3;比较R1和#3ADDHIR0,R0,R1;if R13 then R0=R0+R1ADDLSR0,R0,#3;if R13 then ENDADDR0,R0,#3;R0=R0+3END示例LOOPADD R0,R0,R1;R0=R0+R1CMP R0,#3;比较R0和#3BLSLOOP;if R0R2 跳转到 ADD_END ;分支的实现 ADD R0,R0,

    10、R1;R0R0+R1 ADD R1,R1,#1;R1R1+1 B LOOP;无条件跳转至LOOP ;循环的实现ADD_END ;行标定义 B ADD_END;无条件跳转ADD_END END;代码结束【例4-3】给出了一个输出Hello World的程序AREA HelloWorld,CODE,READONLY;声明代码段SWI_WriteC EQU&0;输出R0中的字符,&0为预定义的输出代码段入口SWI_Exit EQU&11;程序结束&11为预定义程序结束代码入口ENTRY;代码的入口START ADRR1,TEXT;R1“Hello World”LOOP LDRB R0,R1,#1;读

    11、取下一个字节 CMPR0,#0;检查文本终点 SWINESWI_WriteC;若非终点,则打印 BNELOOP;并返回LOOP SWISWI_Exit;执行结束TEXT =“Hello World”,&0a,&0d,0ENDAREA BlkCpy,CODE,READONLY;声明代码段;声明代码段SWI_WriteC EQU&0;输出;输出R0中的字符中的字符SWI_ExitEQU&11;程序结束;程序结束ENTRY;代码的入口;代码的入口ADRR1,TABLE1;R1TABLE1ADRR2,TABLE2;R2TABLE2ADRR3,T1END;R3T1ENDLOOP1LDRR0,R1,#4;

    12、读取;读取TABLE1的第一个字的第一个字STRR0,R2,#4;拷贝到;拷贝到TABLE2CMPR1,R3;结束?;结束?BLTLOOP1;若非,则再拷贝;若非,则再拷贝ADRR1,TABLE2;R1TABLE2LOOP2LDRBR0,R1,#1;读取下一个字;读取下一个字CMPR0,#0;检查文本终点;检查文本终点SWINE SWI_WriteC;若非终点,则打印;若非终点,则打印BNELOOP2;并返回;并返回LOOP2SWISWI_Exit;执行结束;执行结束TABLE1=“This is the right string!”,&0a,&0d,0T1ENDALIGN;保证字对准;保证字

    13、对准TABLE2=“This is the wrong string!”,0END;程序源代码结束;程序源代码结束4.4 ARM C 语言基础及混合编程4.4.1 ATPCS概述4.4.2 基本ATPCS4.4.3 支持ARM程序和Thumb 程序混合使用的ATPCS4.4.4 C语言及汇编语言混合编程4.4.1 ATPCS概述4.4.1 ATPCS概述 如果汇编代码比较简单,则可以直接利用内嵌汇编的如果汇编代码比较简单,则可以直接利用内嵌汇编的方式进行混合编程;方式进行混合编程;如果汇编代码比较复杂,则可以将汇编程序和如果汇编代码比较复杂,则可以将汇编程序和C程序程序分别以文件的形式加到一个

    14、工程里,通过分别以文件的形式加到一个工程里,通过ATPCS标准来标准来完成汇编程序和完成汇编程序和C程序之间的调用。程序之间的调用。4.4.1 ATPCS概述 为了使不同编译器产生的程序和汇编语言编写的程序能灵为了使不同编译器产生的程序和汇编语言编写的程序能灵活地混合,活地混合,ARM公司定义了一系列过程调用的规则,称为公司定义了一系列过程调用的规则,称为ATPCS(ARM-Thumb Procedure Call Standard)。)。这些基本规则包括子程序调用过程中寄存器的使用规则、这些基本规则包括子程序调用过程中寄存器的使用规则、数据栈的使用规则和参数的传递规则。数据栈的使用规则和参数

    15、的传递规则。4.4.1 ATPCS概述 如果程序遵守如果程序遵守ATPCS,则程序中,则程序中ARM子程序和子程序和Thumb子子程序可互相调用。程序可互相调用。具体做法是:在编译和汇编时,通过使用具体做法是:在编译和汇编时,通过使用/interwork选项选项可以使编译器生成的目标代码遵守支持可以使编译器生成的目标代码遵守支持ATPCS。对于对于C程序,编译选项为程序,编译选项为apcs/interwork。对于汇编程序,。对于汇编程序,必须保证编写的代码本身遵守必须保证编写的代码本身遵守ATPCS。4.4.2 基本基本ATPCS1.寄存器的使用规则寄存器R0R1R2R3R4R5R6R7R8

    16、R9R10R11R12R13R14R15ATPCS名称a1a2a3a4v1v2v3v4WRv5v6SBv7SLv8FP静态基址寄存器SB,数据栈限制指针SL和桢指针FP 2.数据栈的使用规则;3.参数传递的规则。4.4.3 ARM程序和程序和Thumb程序程序的的混合混合使用使用在编译或汇编时,使用/intework告诉编译器或汇编器生成的目标代码遵守支持ARM程序和Thumb程序混合使用的ATPCS,它用在以下场合:程序中存在ARM程序调用Thumb程序的情况;程序中存在Thumb程序调用ARM程序的情况;需要连接器来进行ARM状态和Thumb状态切换的情况;在下述情况下使用选项nointe

    17、rwork:程序中不包含Thumb程序;用户自己进行ARM程序和Thumb程序切换。需要注意的是:在同一个C/C+程序中不能同时有ARM指令和Thumb指令。C语言和ARM汇编语言之间相互调用 当链接器发现有当链接器发现有ARM子程序与子程序与Thumb子程序相互调用时,子程序相互调用时,编译器将修改相应的调用和返回代码,或者添加一段编译器将修改相应的调用和返回代码,或者添加一段veneers代码(链接器生成的用于程序状态转换的代码段)来完成程代码(链接器生成的用于程序状态转换的代码段)来完成程序状态的转换。序状态的转换。C语言和语言和ARM汇编语言之间相互调用包含三部分内容:汇汇编语言之间相

    18、互调用包含三部分内容:汇编语言程序访问编语言程序访问C语言全局变量、语言全局变量、C语言程序调用汇编语言程语言程序调用汇编语言程序、汇编语言程序调用序、汇编语言程序调用C语言程序。语言程序。C语言和ARM汇编语言之间相互调用 汇编语言程序可通过地址间接访问在汇编语言程序可通过地址间接访问在C语言程序中声明的语言程序中声明的全局变量。具体做法是使用全局变量。具体做法是使用IMPORT关键词引入全局变量,关键词引入全局变量,再利用再利用LDR和和STR指令根据全局变量的地址来进行访问。指令根据全局变量的地址来进行访问。具体做法是使用具体做法是使用IMPORT关键词引入全局变量,再利用关键词引入全局

    19、变量,再利用LDR和和STR指令根据全局变量的地址来进行访问。指令根据全局变量的地址来进行访问。unsigned charLDRB/STRBunsigned shortLDRH/STRHunsigned intLDR/STRcharLDRSB/STRSBshortLDRSH/STRSH 对于不同类型的变量,需要选用不同选项的对于不同类型的变量,需要选用不同选项的LDRLDR和和STRSTR指令,列表如下:指令,列表如下:对于结构体,如果知道各个成员的偏移量,则可通对于结构体,如果知道各个成员的偏移量,则可通过过LDR/STR指令进行访问。如果结构体所占空间小于指令进行访问。如果结构体所占空间小

    20、于8个字,则可用个字,则可用LDM和和STM一次性读写。一次性读写。AREA globals,CODE,READONLYEXPORT asmsubroutine;用用EXPORT伪操作声明该变量可伪操作声明该变量可 被其它文件引用被其它文件引用;相当于声明了一个全局变量相当于声明了一个全局变量IMPORT globvar;globvar是是C程序中声明的全局变量程序中声明的全局变量;用用IMPRORT伪操作声明该变量是伪操作声明该变量是 在其它文件中定义的在其它文件中定义的;在本文件中可能要用到该变量在本文件中可能要用到该变量asmsubroutineLDR R1,=globvar;从文字池读

    21、出从文字池读出globvar的地址,将其的地址,将其 保存到保存到R1LDR R0,R1ADD R0,R0,#2STR R0,R1;将修改后的值返回将修改后的值返回MOV PC,LREND例:例:C语言和ARM汇编语言之间相互调用 首先,为保证程序调用时参数的正确传递,汇编语言程序首先,为保证程序调用时参数的正确传递,汇编语言程序的设计要遵守的设计要遵守ATPCS。其次,汇编语言程序需要使用其次,汇编语言程序需要使用EXPORT伪操作声明本程序伪操作声明本程序可被其它程序调用。可被其它程序调用。同时,在同时,在C语言程序中使用语言程序中使用extern关键词声明来该汇编语关键词声明来该汇编语言

    22、程序。言程序。1.内嵌汇编 内嵌汇编器内嵌汇编器armcc和和armcpp用来支持完整的用来支持完整的ARM指令集,指令集,tcc和和tcpp用来支持用来支持Thumb指令集。指令集。内嵌的汇编指令包括大部分内嵌的汇编指令包括大部分ARM指令和指令和Thumb指令,但指令,但不能直接引用不能直接引用C语言的变量定义,数据交换必须通过函数过语言的变量定义,数据交换必须通过函数过程调用标准程调用标准ATPCS(ARM-Thumb Procedure Call Standard)进行。)进行。嵌入式汇编在形式上表现为独立定义的函数体。嵌入式汇编在形式上表现为独立定义的函数体。1.内嵌汇编-内嵌汇编指

    23、令 _asm(“指令指令;指令指令”);语法格式语法格式:u 其中其中“_asm”是是ARM C编译器使用的关键字,编译器使用的关键字,“_”是是两个下划线。两个下划线。u 指令之间用指令之间用“;”分隔。分隔。u 如果一条指令占据多行,在行尾可使用连字符如果一条指令占据多行,在行尾可使用连字符“”。u 汇编命令段中可使用汇编命令段中可使用C语言的注释语句。如果有多条汇编语言的注释语句。如果有多条汇编指令嵌入,则可用指令嵌入,则可用“”将它们归为一条语句,将它们归为一条语句,注意注意1.内嵌汇编-内嵌汇编注意事项 对于寄存器对于寄存器R0R3、LR和和PC的使用要格外小心。的使用要格外小心。编

    24、译器在计算表达式时可能会将寄存器编译器在计算表达式时可能会将寄存器R0R3、R12和和R14用于子程序调用,因此在内嵌的汇编指令中,不要将用于子程序调用,因此在内嵌的汇编指令中,不要将这些寄存器同时指定为物理寄存器。这些寄存器同时指定为物理寄存器。_asmMOVR0,xADDy,R0,x/y/*(x/y)的结果覆盖了的结果覆盖了R0*/例:例:1.内嵌汇编-内嵌汇编注意事项 不要使用寄存器寻址变量。不要使用寄存器寻址变量。int bad_f(int x)_asmADD R0,R0,#1/*将发生寄存器冲突,将发生寄存器冲突,R0 中保存的中保存的x的值将不变的值将不变*/return x;例:

    25、例:1.内嵌汇编-内嵌汇编注意事项 使用内嵌汇编时,编译器会自动保存和恢复可能用到的寄使用内嵌汇编时,编译器会自动保存和恢复可能用到的寄存器,用户无须在程序中再作这些工作。读物理寄存器(除存器,用户无须在程序中再作这些工作。读物理寄存器(除PSR寄存器之外)之前必须先进行写入。寄存器之外)之前必须先进行写入。int f(int x)_asmSTMFD SP,R0;由于由于SP出现了写前先读,因出现了写前先读,因 此对此对R0的保存是非法的的保存是非法的ADDR0,x,#1EORx,R0,xLDMFD SP!,R0;对对R0的恢复没有必要的恢复没有必要 return x;例:例:1.内嵌汇编-内

    26、嵌汇编注意事项 LDM和和STM指令的寄存器列表中只允许使用物理寄存器。指令的寄存器列表中只允许使用物理寄存器。内嵌汇编可以修改处理器模式、协处理器状态和内嵌汇编可以修改处理器模式、协处理器状态和FP、SL、SB等等ATPCS寄存器,但是编译器在编译时并不了解这寄存器,但是编译器在编译时并不了解这些变化,所以必须保证在执行些变化,所以必须保证在执行C语言代码前恢复被改变了的语言代码前恢复被改变了的处理器模式。处理器模式。由于汇编语言使用由于汇编语言使用“,”作为操作数的分隔符,因此带作为操作数的分隔符,因此带“,”的的C语言表达式作为操作数时,必须用语言表达式作为操作数时,必须用“()”括起来

    27、归括起来归为一个汇编操作数。为一个汇编操作数。#include void do_strcpy(const char*src,char*dest)/字符串复制函数字符串复制函数char ch;_asm/注:本章节所有示例中均默认注:本章节所有示例中均默认CPU是是 ARM状态,实际应用中可能需要加以判状态,实际应用中可能需要加以判断。断。loop:ldrb ch,src,#1/读取下一个字符读取下一个字符strb ch,dest,#1/存储下一个字符存储下一个字符cmp ch,#0/检查文本终点检查文本终点bne loop/若非终点转移到若非终点转移到loop 例例4.4 字符串字符串复制复制

    28、_inline voidenable_IRQ(void)int tmp;_asm MRS tmp,CPSR BICtmp,tmp,#0 x80 MSR CPSR_c,tmp_inline voiddisable_IRQ(void)int tmp;_asm MRS tmp,CPSR ORR tmp,tmp,#0 x80 MSR CPSR_c,tmp例、例、使能和禁止中断使能和禁止中断 int main(void)disable_IRQ();enable_IRQ();2在汇编中使用在汇编中使用C定义的定义的全局变量全局变量内嵌汇编不用单独编辑汇编语言文件,比较简洁,但是有诸多限制,当汇编的代码较多

    29、时一般放在单独的汇编文件中,这时就需要在汇编和C之间进行一些数据的传递,最简便的办法就是使用全局变量【例4-5】在汇编中使用C定义的全局变量/C程序#include int pubvar=5;/C定义的全局变量extern asmdata(void);int main()printf(old value of pubvar is:%d,pubvar);asmdata();printf(new value of pubvar is:%d,pubvar);return 0;汇编程序AREA asmfunc,CODE,READONLYEXPORT asmdataIMPORT pubvarasmdat

    30、aldr r0,=pubvar;r0pub地址ldr r1,r0;r1r0mov r2,#3;r2#3mul r3,r1,r2 ;r3r1*r2str r3,r0;r0r3mov pc,lr;从子程序返回END【例4-6】在C中调用汇编的函数(函数不多于4个参数);汇编程序AREA asmfunc,CODE,READONLYEXPORT do_strcpydo_strcpyloopldrb r4,r0,#1;r4r0,r0r0+1cmp r4,#0;检查文本终点beq over;若终点转移到overstrb r4,r1,#1;r1r4,r1r1+1b loopovermov pc,lr;从子程

    31、序返回END/C程序#include extern void do_strcpy(const char*src,char*dest);int main()const char*s=my test string!;char d128;do_strcpy(s,d);printf(old:%srn,s);printf(new:%srn,d);return 0;【例4-7】在C中调用汇编的函数(函数多于4个参数);汇编程序:AREA addcode,CODE,READONLY;段addcode,代码段 code32 ;ARM指令EXPORT myadd_sixmyadd_six stmfd r13,r

    32、4,r5 ;将r4,r5压入堆栈,但R13不变 ldr r4,r13 ;将第5个参数从堆栈中提出 ldr r5,r13,#4 ;将第6个参数从堆栈中提出 add r0,r0,r1 add r0,r0,r2 add r0,r0,r3 add r0,r0,r4 add r0,r0,r5 ;32位结果保存在R0中 sub r13,r13,#8 ldmfd r13,r4,r5 ;从堆栈中恢复r4,r5 mov r15,r14 ;返回主程序 END/C主程序#define UINT unsigned intextern UINT myadd_six(UINT a,UINT b,UINT c,UINT d

    33、,UINT e,UINT f);int main(void)myadd_six(1,2,3,4,5,6);return 0;4在汇编中调用在汇编中调用C的函数的函数 在汇编语言中调用C语言的函数,需要在汇编中IMPORT对应的C函数名,然后将C的代码放在一个独立的C文件中进行编译,剩下的工作由连接器来处理。【例4-8】在汇编语言中调用C语言的函数(参数不多于4个)。/C函数 prog1_c.cvoid prog1_c(int p1,int p2,int p3)printk(%0 x%0 x%0 xrn,p1,p2,p3);/输出参数值;汇编程序 prog1_asm.sIMPORT prog1_

    34、c;声明prog1_c函数AREA PROG1_ASM,CODE,READONLYprog1_asmSTR lr,sp,#-4!;保存当前lrldr r0,=0 x1;参数1ldr r1,=0 x2;参数2ldr r2,=0 x3;参数3bl prog1_c;调用C函数LDR pc,sp,#4;将lr装进pc(返回main函数)END【例4-9】在汇编语言中调用C语言的函数(参数多于4个)。/C函数 prog2_c.cvoid prog2_c(int p1,int p2,int p3,int p4,int p5,int p6)printk(%0 x%0 x%0 x%0 x%0 x%0 xrn,

    35、p1,p2,p3,p4,p5,p6);/输出参数值;汇编程序 prog2_asm.sIMPORT prog2_c;声明prog2_c函数AREA PROG2_ASM,CODE,READONLYEXPORT prog2_asmprog2_asmSTR lr,sp,#-4!;保存当前lrldr r0,=0 x1;参数1ldr r1,=0 x2;参数2ldr r2,=0 x3;参数3ldr r3,=0 x4;参数4ldr r4,=0 x6str r4,sp,#-4!;参数6入栈ldr r4,=0 x5str r4,sp,#-4!;参数5入栈bl prog2_cADD sp,sp,#4;清除栈中参数5

    36、,本语句执行完后sp指向参数6ADD sp,sp,#4;清除栈中参数6,本语句执行完后sp指向lrLDR pc,sp,#4;将lr装进pc(返回main函数)END4.5 ARM 汇编语言实验基础4.5.1 ADS软件组成4.5.2 使用CodeWarrior IDE4.5.3 使用AXD IDEADS全称为ARM Developer Suite,是ARM公司推出的新一代ARM集成开发工具。现在常用的ADS版本是ADS1.2,它取代了早期的ADS1.1和ADS1.0。ADS用于无操作系统的ARM系统开发,是对裸机(可理解成一个高级单片机)的开发。ADS有极佳的测试环境和良好的侦错功能,它可使硬

    37、件开发者更深入地从底层去理解ARM处理器的工作原理和操作方法,为日后自行设计打基础,为BootLoader的编写和调试打基础。4.5.1 ADS集成开发环境简介1命令行开发工具命令行开发工具命令行开发工具在实际应用中相对来说比较广泛,使用它的好处在于可以将许多编译命令写在一个脚本文件中,然后只执行该脚本文件就可以让工具自动完成所有编译、链接工作生成可执行代码。命令行开发工具中常用的命令如下。(1)armccarmcc是ARM C编译器,用于将用ANSI C编写的程序编译成32位的ARM指令代码。armcc命令使用时可附带参数。在命令控制台环境下,输入以下命令:armcc help将可以查看ar

    38、mcc的语法格式以及最常用的一些操作选项。armcc的基本语法格式为 armcc options file1 file2filen4.5.1 ADS软件组成(2)armcpparmcpp是ARM C+编译器,它将ISO C+或EC+编译成32位的ARM指令代码。该编译器的命令选项和armcc的选项基本一样,这里不再重复。(3)tcctcc是Thumb C编译器,它将ANSI C源代码编译成16位的Thumb指令代码。tcc的编译选项和用法类似armcc,具体使用请参考ADS软件的在线帮助文件。(4)tcpptcpp是Thumb C+编译器,它将ISO C+和EC+源码编译成16位Thumb指令

    39、代码。它的编译选项和用法类似armcc,具体使用请参考ADS软件的在线帮助文件。4.5.1 ADS软件组成(5)armasmarmasm是ARM和Thumb的汇编器,它对用ARM汇编语言和Thumb汇编语言写的源代码进行汇编。在命令行输入armasmhelp将会看到armasm汇编器的用法以及它的编译选项。armasm的基本语法格式有两种:armasm options sourcefile objectfile armasm options-o objectfile sourcefile 4.5.1 ADS软件组成ADS软件组成(6)armlinkarmlink是ARM链接器,该命令既可以将编

    40、译得到的一个或多个目标文件和相关的一个或多个库文件进行链接,生成一个可执行文件,也可以将多个目标文件部分链接成一个目标文件,以供进一步地链接。ARM链接器生成的是ELF格式的可执行映像文件。armlink的语法格式如下:armlink option-list input-file-list(7)armsdarmsd是ARM和Thumb的符号调试器,它能够进行源码级的程序调试。用户可以在用C或汇编语言写的代码中进行单步调试,设置断点,查看变量值和内存单元的内容。armsd的语法格式如下:armsd options 2ARM运行时库运行时库ADS提供两种运行时库来支持C和C+代码的编译,一种是AN

    41、SI C库函数,另一种是C+库函数。ANSI C库函数包含在ISO C标准中定义的函数以及被C和C+编译器所调用的支持函数。C+库函数包含由ISO C+标准定义的函数。3GUI开发环境开发环境ADS GUI开发环境包含CodeWarrior和AXD两种,其中Code Warrior是集成开发工具,而AXD是调试工具。CodeWarrior for ARM是一套完整的集成开发工具,充分发挥了ARM RISC的优势,使产品开发人员能够很好的应用尖端的片上系统技术。该工具是专为基于ARM RISC的处理器而设计的,它可加速并简化嵌入式开发过程中的每一个环节,使得开发人员只须通过一个集成软件开发环境就

    42、能研制出ARM产品。AXD(ARM eXtended Debugger)即ARM扩展调试器。调试器本身是一个软件,用户通过这个软件使用调试代理可以对包含有调试信息的、正在运行的可执行代码进行变量的查看、断点的控制等调试操作。ADS软件组成4实用程序实用程序ADS除了提供上述工具外,它还提供以下的实用工具来配合前面介绍的命令行开发工具的使用。(1)Flash downloaderFlash downloader是用于把二进制映像文件下载到ARM开发板上的Flash存储器的工具。(2)fromELFfromELF是ARM映像文件转换工具。该命令将ELF格式的文件作为输入文件,将该格式转换为各种输出

    43、格式的文件,包括plain binary(BIN格式映像文件)、Motorola 32-bit S-record format(Motorola 32位S格式映像文件)、Intel Hex 32 format(Intel 32位格式映像文件)和Verilog-like hex format(Verilog十六进制文件)。fromELF命令也能够为输入映像文件产生文本信息,如代码和数据长度。(3)armarARM库函数生成器将一系列ELF格式的目标文件以库函数的形式集合在一起,用户可以把一个库传递给一个链接器以代替几个ELF文件。ADS软件组成5支持软件仿真支持软件仿真ADS为用户提供ARMul

    44、ator软件,使用户可以在软件仿真的环境下或者在基于ARM的硬件环境下调试用户的应用程序。ARMulator是一个ARM指令集仿真器,集成在ARM的调试器AXD中,它提供对ARM处理器的指令集的仿真,为ARM和Thumb提供精确的模拟。用户可以在硬件尚未做好的情况下,开发程序代码。ADS软件主要由上述5个部分组成,下面将介绍在实际开发中使用频繁的CodeWarrior和AXD工具的基本使用。ADS软件组成1创建项目工程创建项目工程建立项目工程是嵌入式开发的第1步,因为工程将所有的源代码文件组织在一起,并能够决定最终生成文件存放的路径、输出的格式等。运行ADS1.2开发软件(CodeWarrio

    45、r for ARM Developer Suite),打开CodeWarrior集成开发环境,如图7-1所示。在CodeWarrior中新建一个工程的方法有两种,可以在工具栏中单击New按钮,也可以在File菜单中选择New命令,如图7-1所示,这样就会打开一个如图7-2所示的新建工程对话框。在Project列表框中有7种可选择的工程类型。ARM Executable Image:用于将ARM指令代码生成一个ELF格式的可执行映像文件;ARM Object Library:用于将ARM指令代码生成一个armar格式的目标文件库;Empty Project:用于创建一个不包含任何库或源文件的工程

    46、;Makefile Importer Wizard:用于将Visual C的nmake或GNU make文件转换成CodeWarrior IDE工程文件;4.5.2使用CodeWarrior IDE Thumb ARM Interworking Image:用于将ARM指令和Thumb指令的混和代码生成一个可执行的ELF格式的映像文件;Thumb Executable Image:用于将Thumb指令代码生成可执行的ELF格式的映像文件;Thumb Object Library:用于将Thumb指令的代码生成一个armar格式的目标文件库。4.5.2使用CodeWarrior IDE4.5.2

    47、使用CodeWarrior IDE2编译和链接项目工程编译和链接项目工程在编译casmtest项目之前,要先进行目标生成选项的设置工作,这些选项包括编译器选项、汇编选项、链接器选项等,它们将决定CodeWarrior IDE如何处理工程项目,并生成特定的输出文件。单击Edit菜单,选择DebugRel Settings命令,或者按Alt+F7组合键,显示如图7-10所示的对话框。图7-10的最左边部分是目标设置面板,它包括以下几个大的设置选项。(1)Target设置选项 Target Settings:包括Target Name、Linker、Pre-linker、Post-linker等设置

    48、;Access Paths:主要用于项目的路径设置;Build Extras:主要用于Build附加的选项设置;Runtime Settings:包括一般设置、环境设置等;File Mappings:包含映射信息、文件类型、编辑语言等;Source Trees:包含源代码树结构信息以及路径选择等;ARM Target:定义输出image文件名、类型等。(2)Language Settings设置选项 ARM Assembler:对ARM汇编语言的支持选项设置;ARM C Compiler:对C语言的支持选项设置;ARM C+Compiler:对C+语言的支持选项设置;Thumb C Compi

    49、ler:对Thumb C语言的支持选项设置;Thumb C+Compiler:对Thumb C+语言的支持选项设置。4.5.2使用CodeWarrior IDE(3)Linker设置选项 ARM Linker:对输出的链接类型、RO Base、RW Base地址等选项设置;ARM fromELF:定义输出文件格式以及路径等。(4)Editor设置选项 Custom Keywords:对客户关键字高亮颜色的设置。(5)Debugger设置选项 Other Executables:当调试该目标板时制定其他的可执行文件来调试;Debugger Settings:对调试器的一些基本设置;ARM Deb

    50、ugger:选择调试时的调试器(AXD、Armsd或其他调试器);ARM Runner:选择运行时的调试器(AXD、Armsd或其他调试器)。(6)Miscellaneous设置选项 ARM Features:设置一些受限制的特性。4.5.2使用CodeWarrior IDEAXD是ADS软件中独立于CodeWarrior IDE的图形软件。1打开调试文件打开调试文件2设置断点设置断点调试时,用户往往希望在程序执行到某处时查看所关心的变量值,此时可以通过设置断点达到要求。将光标移动到要进行断点设置的代码处,在Execute菜单中,选择Toggle Breakpoint命令或按F9键,就会在光标

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:ARM嵌入式系统原理与应用-第4章-ARM汇编语言及C语言程序设计基础.pptx
    链接地址:https://www.163wenku.com/p-3376514.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库