ARM汇编语言程序设计PPT精品文档

上传人:工**** 文档编号:567940227 上传时间:2024-07-22 格式:PPT 页数:84 大小:474KB
返回 下载 相关 举报
ARM汇编语言程序设计PPT精品文档_第1页
第1页 / 共84页
ARM汇编语言程序设计PPT精品文档_第2页
第2页 / 共84页
ARM汇编语言程序设计PPT精品文档_第3页
第3页 / 共84页
ARM汇编语言程序设计PPT精品文档_第4页
第4页 / 共84页
ARM汇编语言程序设计PPT精品文档_第5页
第5页 / 共84页
点击查看更多>>
资源描述

《ARM汇编语言程序设计PPT精品文档》由会员分享,可在线阅读,更多相关《ARM汇编语言程序设计PPT精品文档(84页珍藏版)》请在金锄头文库上搜索。

1、ARM 嵌入式系统嵌入式系统第第4章章 ARM汇编程序设计汇编程序设计1ARM程序设计基础 u伪操作(derective)u伪指令(Pseudo-instruction)uARM汇编语言语句格式uARM汇编语言的程序格式u相关的程序示例 2伪操作u符号定义伪操作u数据定义伪操作u汇编控制伪操作u其他伪操作3符号定义伪操作u定义全局变量:GBLA、GBLL和GBLSu定义局部变量:LCLA、LCLL和LCLSu变量赋值:SETA、SETL、SETSu通用寄存器列表定义名称:RLIST 4GBLA、GBLL和GBLSuGBLA、GBLL和GBLS语法格式:GBLA(GBLL或或GBLS)全局变量名

2、全局变量名 GBLA objectsize ;全局的数字变量;全局的数字变量objectsize ,为,为0Objectsize SETA 0xff ;将该变量赋值为;将该变量赋值为0xff SPACE objectsize ;引用该变量;引用该变量 GBLL statusB;全局的逻辑变量;全局的逻辑变量statusB ,为,为FalsestatusB SETL TRUE;将该变量赋值为真;将该变量赋值为真 全局:作用范围为包含该变量的源程序全局:作用范围为包含该变量的源程序5LCLA、LCLL和LCLSuLCLA、LCLL和和LCLS语法格式:LCLA(LCLL或或LCLS)局部变量名局部

3、变量名 MACRO ;声明一个宏;声明一个宏$label message $a ;宏的原型;宏的原型 LCLS err ;声明一个局部变量;声明一个局部变量err,为空串,为空串err SETS “error no: ” ;向该变量赋值;向该变量赋值$label ;代码;代码 INFO 0,err:CC:STR:$a ;使用该串变量;使用该串变量 MEND ;宏定义结束;宏定义结束局部:作用范围为包含该局部变量的宏代码的一个实例局部:作用范围为包含该局部变量的宏代码的一个实例6SETA、SETL、SETSuSETA、SETL和和SETS语法格式:变量名变量名SETA(SETL或或SETS)表达

4、式表达式在向变量赋值前,必须先声明该变量在向变量赋值前,必须先声明该变量 7RLISTuRLIST语法格式:名称名称RLIST寄存器列表寄存器列表 Context RLIST r0-r6,r8,r10-r12,r15;将寄存器列表名称定义为;将寄存器列表名称定义为Context ,可在,可在ARM指令指令LDM/STM中通过该名称访问寄存器列表。排列顺序无中通过该名称访问寄存器列表。排列顺序无关关 8数据定义伪操作 uDCBuDCW(DCWU)uDCD(DCDU)uDCFD(DCFDU)uDCFS(DCFSU)uSPACEuMAPuFIELD9DCB 语法格式:标号标号DCB表达式表达式 表达

5、式取值范围:128255的数字或字符串。DCB:“=”NullstringDCB“Null string”,0;构造一个以;构造一个以0结尾的字符串结尾的字符串10DCW(或DCWU) 语法格式:标号标号DCW(或(或DCWU)表达式表达式 DCW:半字对齐DCWU:不严格半字对齐。表达式取值范围:3276865535data1DCW128,num1+8;num1必须是已经定义过的必须是已经定义过的 11DCD(或DCDU) 语法格式:标号标号DCD(或(或DCDU)表达式表达式DCD:“ & ”DCD:字对齐DCDU:不严格字对齐。data1DCD1,5,20;其值为其值为1,5,20dat

6、a2DCDmemaddr+4;分配一个字单元,其值为程序中标号;分配一个字单元,其值为程序中标号memaddr加加4个字节个字节12DCFD(或DCFDU)语法格式:标号标号DCFD(或(或DCFDU) 表达式表达式每个双精度的浮点数占据两个字单元。DCFD:字对齐DCFDU:不严格字对齐DCFD1E308,-4E100DCFDU100000,.1,3.1E26 13DCFS(或DCFSU) 语法格式:标号标号 DCFS(或(或DCFSU) 表达式表达式每个单精度的浮点数占据一个字单元。DCFS:字对齐DCFSU:不严格字对齐DCFS1E3,-4E-9DCFSU1.0,-.1,3.1E6 14

7、SPACE语法格式:标号标号SPACE表达式表达式分配一片连续的存储区域并初始化为0。其中,表达式为要分配的字节数。SPACE:“ ”Datastruc SPACE 280;分配连续;分配连续280字节的存储单元并初始化为字节的存储单元并初始化为015MAP语法格式:MAP 表达式表达式 ,基址寄存器,基址寄存器用于定义一个结构化的内存表的首地址。MAP:“ ”通常与FIELD伪指令配合使用来定义结构化的内存表。MAP0x80,R9;定义结构化内存表首地址的值为;定义结构化内存表首地址的值为0x80R916FILED语法格式:标号标号 FIELD 表达式表达式定义一个结构化内存表中的数据域。F

8、ILED也可用“#”代替。MAP0;定义结构化内存表首地址为;定义结构化内存表首地址为0constaFIELD 4;consta的长度为的长度为4字节,相对位置为字节,相对位置为0constbFIELD 4;constb的长度为的长度为4字节,相对位置为字节,相对位置为4xFIELD 8;x的长度为的长度为8字节,相对位置为字节,相对位置为0x8yFIELD 8;y的长度为的长度为8字节,相对位置为字节,相对位置为0x10stringFIELD 256;y的长度为的长度为256字节,相对位置为字节,相对位置为0x18 MOV R9,#4096LDR R5,R9,constb;将内存表中数据域将

9、内存表中数据域constb读取到读取到R5中中17汇编控制伪操作 汇编控制(Assembly Control)伪操作用于控制汇编程序的执行流程,常用的汇编控制伪操作包括以下几条:uIF、ELSE、ENDIFuWHILE、WENDuMACRO、MENDuMEXIT 18IF、ELSE、ENDIF语法格式:IF逻辑表达式逻辑表达式指令序列指令序列1 ELSE指令序列指令序列2 ENDIF示例:IF Version=“1.0”;指令指令;伪指令;伪指令ELSE;指令指令;伪指令;伪指令ENDIF19WHILE、WEND 语法格式:WHILE逻辑表达式逻辑表达式指令序列指令序列WEND示例:count

10、SETA1WHILEcount$;“-“示例:abc SETS “this string contains only “ double quote”def SETS “this string contains only $ double quote”46字符串表达式 l操作符uLEN :LEN: AuCHR :CHR: AuSTR :STR: AuLEFT A :LEFT: BuRIGHT A :RIGHT: BuCC A :CC: B47字符串表达式 l示例 GBLS STRING1 GBLS STRING2STRING1 SETS “AAACCC”STRING2 SETS “BB”:CC:

11、(STRING1:LEFT:3);STRING2:“BBAAA”48数字表达式 u整数数字量示例:aSETA34906AddrDCD0xA10EDCD2_11001010c3SETA8_74007DCQ0x123456789abcdef49数字表达式 u浮点数字量单精度浮点数表示范围:3.4e+381.18e-38双精度浮点数表示范围:1.8e+3082.23e-308示例:DCFD1E308,-4E100DCFS1.0DCFD3.725e15DCFS0x7FC00000DCFD&FFF000000000000050数字表达式u操作符lNOT按位取反:NOT:Al、/ 及MOD算术操作符AB,

12、AB,AB,A / B,A:MOD:BlROL、ROR、SHL及SHR移位(循环移位)操作A:ROL:B,A:ROR:B,A:SHL:B,A:SHR:BlAND、OR、EOR按位逻辑操作符A:AND:B,A:OR:B,A:EOR:B51逻辑表达式u关系操作符lA=BlABlA=BlA=BlX/=BlAB52逻辑表达式u逻辑操作符l:LNOT:AlA:LAND:BlA:LOR:BlA:LEOR:B53其他常用操作符 u?操作符?操作符返回某代码行所生成的可执行代码的长度,例如:?X返回定义符号X的代码行所生成的可执行代码的字节数。uDEF操作符DEF操作符判断是否定义某个符号,例如:DEF:X如

13、果符号X已经定义,则结果为真,否则为假。 54汇编语言的程序格式 u段:section,段是相对独立的、具有特定名称的指令或数据序列u段:代码段、数据段l代码段:存放执行代码l数据段:存放代码运行时需要用到的数据。u一个汇编程序至少应该有一个代码段u在程序编译链接时最终形成一个可执行的映像文件(ELF格式)u可执行映像文件通常由以下几部分构成:l一个或多个代码段,代码段的属性通常为只读l零个或多个包含初始化数据的数据段,数据段的属性为可读写l零个或多个不包含初始化数据的数据段,数据段的属性为可读写。u链接器(ARM Linker)根据系统默认或用户设定的规则,将各个段安排在存储器中的相应位置。

14、55汇编语言的程序格式AREAInit,CODE,READONLYENTRYStartLDRR0,=0x3FF5000LDRR1,=0xFFSTRR1,R0LDRR0,=0x3FF5008LDRR1,=0x01STRR1,R0B.END 56汇编语言的子程序调用 语句格式:BL子程序名子程序名 u调用u将子程序的返回地址存放在连接寄存器LR中u将程序计数器PC指向子程序的入口点u返回将存放在LR中的返回地址重新拷贝给程序计数器PCu参数传递可以使用寄存器R0R3完成57汇编语言的子程序调用AREAInit,CODE,READONLYENTRYStartLDRR0,=0x3FF5000LDRR1

15、,=0xFFSTRR1,R0LDRR0,=0x3FF5008LDRR1,=0x01STRR1,R0BLSubr B.SubrMOVPC,LREND 58程序示例u例一:数据块拷贝,利用例一:数据块拷贝,利用LDR/STR指令指令u项目名:项目名:Example1.mcp,文件名:,文件名:Example1.su思考题思考题l编译后的编译后的Code长度是多少长度是多少?l编译后的编译后的RW Data长度是多少长度是多少?l当设置当设置RW Base时情况又如何时情况又如何?加载时域加载时域,运行时域运行时域l如何提高访问连续存储区的效率如何提高访问连续存储区的效率?Example1.DOC5

16、9程序示例u例二:数据块拷贝,利用例二:数据块拷贝,利用LDM/STM指令指令u项目名:项目名:Example2.mcp,文件名:,文件名:Example2.su思考题思考题l采用采用LDM/STM指令的优点有哪些指令的优点有哪些?l编写程序编写程序,实现以下功能实现以下功能:当设置当设置RW Base时时,当加载时域和运行时域不同时当加载时域和运行时域不同时,采用采用LDM/STM指令指令搬移搬移RW Data到新的位置到新的位置.提示提示:使用使用|Image$RO$Base|,|Image$RO$Limit| |Image$RW$Base|,|Image$RW$Limit|Example

17、2.DOC60程序示例u例三:例三:ADR伪指令伪指令u项目名:项目名:Example3.mcp,文件名:,文件名:Example3.su思考题思考题lADR伪指令的主要用途伪指令的主要用途?Example3.DOC61程序示例u例四:例四:LDR伪指令伪指令u项目名:项目名:Example4.mcp,文件名:,文件名:Example4.su思考题思考题l如何加入如何加入LDRR4,=Darea+6004语句语句?lLDR伪指令的主要用途伪指令的主要用途?Example4.DOC62程序示例u例五:利用跳转表实现程序跳转例五:利用跳转表实现程序跳转u项目名:项目名:Example5.mcp,文

18、件名:,文件名:Example5.su思考题思考题l如何利用跳转表实现如何利用跳转表实现SWI处理处理?LDR R0,LR,#-4;取取SWI指令机器码指令机器码BIC R0,R0,#0xFF000000;取取24位立即数位立即数Example5.DOC63程序示例u例六:基于例六:基于S3C4510B的串行通信程序的串行通信程序u项目名:项目名:Example6.mcp,文件名:,文件名:Example6.su思考题思考题l如何利用中断方式实现双向串行通信如何利用中断方式实现双向串行通信?Example6.DOC64程序示例u例九:使用多寄存器传送指令进行现场保护例九:使用多寄存器传送指令进

19、行现场保护u项目名:项目名:Example9.mcp,文件名:,文件名:Example9.su思考题思考题lLDR SP, =StackUser+30*4?Example9.DOC65汇编语言与C/C+的混和编程u汇编语言与C/C+的混合编程方式:l在C/C代码中嵌入汇编指令l在汇编程序和C/C的程序之间进行变量的互访l汇编程序、C/C程序间的相互调用u汇编语言l初始化l驱动l关键算法uC/C+l结构化l移植66汇编语言与C/C+的混和编程u例七:汇编语言与例七:汇编语言与C/C+的混和编程的混和编程u项目名:项目名:Example7.mcpu文件名:文件名:Example7_asm.su文件

20、名:文件名:Example7_c.cExample7.DOC67系统的初始化过程 初始化代码初始化代码:在用户的应用程序运行之前完成系统初始化工作的代码在用户的应用程序运行之前完成系统初始化工作的代码初始化代码直接对初始化代码直接对ARM微处理器内核及硬件控制器编程,多采用汇编语言微处理器内核及硬件控制器编程,多采用汇编语言编程,初始化代码一般应包含如下典型任务:编程,初始化代码一般应包含如下典型任务:l定义程序入口点定义程序入口点l设置异常向量设置异常向量l初始化存储器系统初始化存储器系统l初始化堆栈指针寄存器初始化堆栈指针寄存器l初始化临界初始化临界I/O设备设备l初始化初始化C代码的运行

21、环境代码的运行环境l改变处理器的运行模式和状态改变处理器的运行模式和状态l使能中断使能中断l进入进入C代码运行代码运行68系统的初始化过程u定义程序入口点定义程序入口点初始化代码必须定义整个程序的入口点(初始化代码必须定义整个程序的入口点(Entry Point) 伪操作伪操作Entry链接器的设置链接器的设置确定整个程序的入口点确定整个程序的入口点69系统的初始化过程u设置异常向量设置异常向量 异常向量表的常见程序实现:异常向量表的常见程序实现:AREA Init,CODE, READONLYENTRYBReset_HandlerBUndef_HandlerBSWI_HandlerBPreA

22、bort_HandlerBDataAbort_HandlerB.BIRQ_HandlerBFIQ_HandlerReset_Handler 70系统的初始化过程系统的初始化过程u初始化存储器系统初始化存储器系统 初始化存储器系统主要包含对系统存储器控制器的初始初始化存储器系统主要包含对系统存储器控制器的初始化,如果系统具有存储器管理单元(化,如果系统具有存储器管理单元(MMU),也必须对也必须对其进行初始化。其进行初始化。基于基于ARM微处理器的系统一般都需要外扩大容量的存储微处理器的系统一般都需要外扩大容量的存储器,这些存储器需要专门的存储器控制器控制其读、写器,这些存储器需要专门的存储器控

23、制器控制其读、写操作。操作。 71系统的初始化过程系统的初始化过程存储器类型和时序的配置存储器类型和时序的配置 基于基于ARM微处理器的系统常用三种类型的存储器:微处理器的系统常用三种类型的存储器:FLASHSRAMDRAM系统的运行速度瓶颈在于对存储器的访问,因此对存储器接系统的运行速度瓶颈在于对存储器的访问,因此对存储器接口时序的优化非常重要口时序的优化非常重要72系统的初始化过程系统的初始化过程u存储器的地址分配与地址重映射(存储器的地址分配与地址重映射(Remap)存储器的地址分配也就是将物理存储器定位在存储器的地址分配也就是将物理存储器定位在4GB地址空间的具体位置地址空间的具体位置

24、ARM微处理器常采用两种方式来完成地址分配微处理器常采用两种方式来完成地址分配:l固定的存储器地址分配固定的存储器地址分配即物理存储器的起始地址一般是不改变的,这种方式相对较简单即物理存储器的起始地址一般是不改变的,这种方式相对较简单l存储器地址重映射(存储器地址重映射(Remap)使物理存储器的起始地址可以在有效的地址空间内任意改变,即物理存使物理存储器的起始地址可以在有效的地址空间内任意改变,即物理存储器的地址是不固定的,这种方式相对较复杂一些储器的地址是不固定的,这种方式相对较复杂一些73系统的初始化过程系统的初始化过程FLASH中断向量表中断向量表程序程序(RO)RAM堆栈堆栈数据数据

25、数据数据(RW)FLASH中断向量表中断向量表程序程序(RO)内部内部RAM数据数据(RW)内部内部RAM中断向量表中断向量表FLASH堆栈堆栈程序程序数据数据外部外部SRAMSDRAM外部外部SRAMSDRAM4G存储空间存储空间4G存储空间存储空间4G存储空间存储空间固定的存储器地址分配固定的存储器地址分配存储器地址重映射(存储器地址重映射(Remap)74系统的初始化过程系统的初始化过程u初始化堆栈指针寄存器初始化堆栈指针寄存器 sp_SVCsp_IRQsp_FIQsp_ABTsp_UNDsp_USR75系统的初始化过程系统的初始化过程初始化堆栈的示例代码,共初始化了三种模式下的堆栈指针

26、寄存器:初始化堆栈的示例代码,共初始化了三种模式下的堆栈指针寄存器:MODEMASKEQU0x1FFIQMODEEQU0x11IRQMODEEQU0x12SVCMODEEQU0x13SVCStackEQU0x03FE0100FIQStackEQU0x03FE0200IRQStackEQU0x03FE030076系统的初始化过程系统的初始化过程MRSR0,CPSR;CPSR-R0BICR0,R0,#MODEMASK;将将CPSR中的模式位清零中的模式位清零ORRR1,R0,#SVCMODE;设置模式位为管理模式设置模式位为管理模式MSRCPSR_cxsf, R1;切换处理器到管理模式切换处理器到

27、管理模式LDRSP,=SVCStack;设置该模式下的堆栈设置该模式下的堆栈BICR0,R0,#MODEMASK;将将CPSR中的模式位清零中的模式位清零ORRR1,R0,#FIQMODE;设置模式位为设置模式位为FIQ模式模式MSRCPSR_cxsf, R1;切换处理器到切换处理器到FIQ模式模式LDRSP,=FIQStack;设置该模式下的堆栈设置该模式下的堆栈BICR0,R0,#MODEMASK;将将CPSR中的模式位清零中的模式位清零ORRR1,R0,#IRQMODE;设置模式位为设置模式位为IRQ模式模式MSRCPSR_cxsf, R1;切换处理器到切换处理器到IRQ模式模式LDRS

28、P,=IRQStack;设置该模式下的堆栈设置该模式下的堆栈 77系统的初始化过程系统的初始化过程u初始化临界(初始化临界(Critical) I/O设备设备 临界临界I/O设备是指那些在使能中断之前必须进行初始化的设备是指那些在使能中断之前必须进行初始化的设备。如果不对这些设备进行必要的初始化,他们可能会设备。如果不对这些设备进行必要的初始化,他们可能会在中断使能后产生一些没有意义的中断请求,从而影响程在中断使能后产生一些没有意义的中断请求,从而影响程序的运行序的运行.78系统的初始化过程系统的初始化过程u初始化初始化C代码的运行环境代码的运行环境 程序代码通过编译、链接后生成可执行映像文件

29、程序代码通过编译、链接后生成可执行映像文件(IMAGE)一个简单的可执行映像文件通常由三部分构成:一个简单的可执行映像文件通常由三部分构成:RO、RW 、 ZIRO包含程序代码和只读数据包含程序代码和只读数据RW包含定义并初始化的全局变量包含定义并初始化的全局变量ZI包含定义但未初始化的全局变量包含定义但未初始化的全局变量可执行映像文件最初总是存储在可执行映像文件最初总是存储在FLASH中,其中的中,其中的RO部分既可在部分既可在FLASH中运行,也可在高速的中运行,也可在高速的RAM中运行;而中运行;而RW和和ZI部分必须拷贝到部分必须拷贝到可写的可写的RAM中,因此,初始化中,因此,初始化

30、C代码的运行环境,就是将以上部分从代码的运行环境,就是将以上部分从FLASH中拷贝到中拷贝到RAM的过程。的过程。 79系统的初始化过程系统的初始化过程u改变处理器的运行模式和状态改变处理器的运行模式和状态 ARM微处理器在复位或上电状态下的默认模式为管理模式微处理器在复位或上电状态下的默认模式为管理模式(Supervisor Mode),而在初始化代码中可能需要切换到),而在初始化代码中可能需要切换到其他模式进行必要的操作,如初始化各个模式下的堆栈指针其他模式进行必要的操作,如初始化各个模式下的堆栈指针寄存器,因此,在系统的初始化过程中处理器模式一般会经寄存器,因此,在系统的初始化过程中处理

31、器模式一般会经历如下变化:历如下变化:80系统的初始化过程系统的初始化过程u使能中断使能中断 如果系统需要使用中断,初始化代码应该使能中断。中断使如果系统需要使用中断,初始化代码应该使能中断。中断使能可以通过清除能可以通过清除CPSR中的中断禁止位来完成中的中断禁止位来完成81系统的初始化过程系统的初始化过程u进入进入C代码运行代码运行 最简单的情况:最简单的情况:IMPORTC_Entry ;定义一个外部标号,一般不使用;定义一个外部标号,一般不使用mainBC_Entry ;跳转到该处执行;跳转到该处执行 在在ARM的的ADS编译环境中,还另外提供了一种进入编译环境中,还另外提供了一种进入

32、C代码的机制:代码的机制:IMPORT_mainB_main_main( )是编译器提供的一个函数,负责完成库函数的初始化和对是编译器提供的一个函数,负责完成库函数的初始化和对C代码运行环境代码运行环境的初始化,最后自动跳转到的初始化,最后自动跳转到main( )函数执行,此时应用程序的主函数名必须是函数执行,此时应用程序的主函数名必须是main( )。用户可以根据需要选择是否使用用户可以根据需要选择是否使用main( )函数,如果想让系统自动完成初始化过程,函数,如果想让系统自动完成初始化过程,可以使用可以使用main( )函数;如果所有的初始化过程都由用户自己完成,则不使用函数;如果所有的

33、初始化过程都由用户自己完成,则不使用main( )函数。函数。82进一步阅读进一步阅读u汇编语言伪操作和伪指令的详细用法汇编语言伪操作和伪指令的详细用法u汇编语言和汇编语言和C/C+的混合编程的混合编程u系统的初始化过程(介绍完具体器件后讲述)系统的初始化过程(介绍完具体器件后讲述)83阶段测验阶段测验nLDR伪指令与伪指令与LDR加载指令的功能和应用有何区别加载指令的功能和应用有何区别,举例举例说明?说明?n指令指令MOV R0,#0x12345678是否正确,为什么?是否正确,为什么?n在非特权模式下能否对在非特权模式下能否对CPSR寄存器设置?能否读取寄存器设置?能否读取CPSR寄存器的值?寄存器的值?n在非特权模式下如何使能在非特权模式下如何使能/禁止禁止IRQ或或FIQ中断?中断?n计算计算X的的n次方的值(不考虑溢出)次方的值(不考虑溢出)计算前,计算前,X-R0,n-R1,计算后,结果计算后,结果-R084

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号