1 / 24

ARM 程序设计

ARM 程序设计. 广嵌教育 www.gdemb.com. 第四章 ARM 程序设计. 4.1 ARM 伪操作 4.2 ARM 汇编伪指令 4.3 ARM 汇编语言语句格式 4.4 ARM 汇编语言程序格式 4.5ARM 汇编程序设计 4.6 ARM 汇编语言中的子程序调用. 4.1 ARM 伪操作. 伪操作是 ARM 汇编语言源程序里的一些特殊指令助记 符,作用主要是为完成汇编程序做各种准备工作,在源程 序进行汇编时由汇编程序处理,而不是在程序运行期间由 CPU 执行。这些伪操作只在汇编过程中起作用,当汇编结 束,伪指令的使命也就随之结束。

afric
Download Presentation

ARM 程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ARM程序设计 广嵌教育www.gdemb.com

  2. 第四章 ARM程序设计 • 4.1 ARM伪操作 • 4.2 ARM汇编伪指令 • 4.3 ARM汇编语言语句格式 • 4.4 ARM汇编语言程序格式 • 4.5ARM汇编程序设计 • 4.6 ARM汇编语言中的子程序调用

  3. 4.1 ARM伪操作 伪操作是ARM汇编语言源程序里的一些特殊指令助记 符,作用主要是为完成汇编程序做各种准备工作,在源程 序进行汇编时由汇编程序处理,而不是在程序运行期间由 CPU执行。这些伪操作只在汇编过程中起作用,当汇编结 束,伪指令的使命也就随之结束。 ADS编译环境下的伪操作有如下几种: • 符号定义伪操作 • 数据定义伪操作 • 汇编控制伪操作 • 信息报告伪操作 • 其他伪操作

  4. 4.1 ARM伪操作-符号定义伪操作 符号定义伪操作用于定义 ARM 汇编程序中的变量,对变量赋值以及 定义寄存器的别名等操作。 常见的符号定义伪操作有如下几种: • 用于定义全局变量的 GBLA 、 GBLL 和 GBLS 。 • 用于定义局部变量的 LCLA 、 LCLL 和 LCLS 。 • 用于对变量赋值的 SETA 、 SETL 、 SETS 。 • 为一个通用寄存器列表定义别名--RLIST • 为一个协处理器的寄存器定义名称--CN • 为一个协处理器定义名称--CP • 为一个双精度的VFP寄存器定义名称--DN • 为一个单精度的VFP寄存器定义名称--SN • 为一个浮点寄存器定义名称--FN

  5. 4.1 ARM伪操作-符号定义伪操作 例: • GBLA Test1 ;定义一个全局的数字变量,变量名为 Test1。 Test1 SETA 0xaa ;将该变量赋值为 0xaa。 • LCLS Test6 ;定义一个局部的字符串变量,变量名为Test6 。 Test6 SETS “ Testing ”;将该变量赋值为 “Testing ”。 • GBLL codedbg ;声明一个全局逻辑变量 codedbg SETL{TRUE} ;设置变量为{TRUE} • List RLIST {R0-R3} • Power CN 6 • DSP CP 8

  6. 4.1 ARM伪操作-数据定义伪操作 数据定义伪操作一般用于为特定的数据分配存储单元,同时可完成已配 存储单元的初始化。常见的数据定义伪操作有如下几种: • DCB 用于分配一片连续的字节存储单元并用指定的数据初始化。 • DCW ( DCWU ) 用于分配一片连续的半字存储单元并用指定的数据初始化。 • DCD ( DCDU ) 用于分配一片连续的字存储单元并用指定的数据初始化。 • DCFD ( DCFDU )用于为双精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。 • DCFS ( DCFSU ) 用于为单精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。 • DCQ ( DCQU ) 用于分配一片以 8 字节为单位的连续的存储单元并用指定的数据初始化。 • SPACE 用于分配一片连续的存储单元,并用0初始化。 • MAP 用于定义一个结构化的内存表首地址 ,与FIELD配合使用。 • FIELD 用于定义一个结构化的内存表中的数据域 • LTORG用于声明一个数据缓冲池(文字池)的开始

  7. 4.1 ARM伪操作-数据定义伪操作 例: • Str DCB “This is a test!” ;分配一片连续的字节存储单元并初始化。 • DataTest DCW 1 ,2 ,3 ;分配一片连续的半字存储单元并初始化。 • FDataTest DCFD 2E115 , -5E7 ;分配一片连续的字存储单元并初始 • ;化为指定的双精度数。 • FDataTest DCFS 2E5 , -5E - 7 ;分配一片连续的字存储单元并初始 化为指定的单精度数。 • DataSpace SPACE 100 ;分配连续 100 字节的存储单元并初始化为0 • MAP 0x100 , R0 ;定义结构化内存表首地址的值为 0x100 + R0 。 • MAP 0x100 ;定义结构化内存表首地址的值为 0x100 。 A FIELD 16 ;定义 A 的长度为 16 字节,位置为 0x100 B FIELD 32 ;定义 B 的长度为 32 字节,位置为 0x110 S FIELD 256 ;定义 S 的长度为 256 字节,位置为 0x130

  8. 4.1 ARM伪操作-数据定义伪操作 • DCB 也可用 “= ”代替 • DCD 也可用 “& ”代替 • SPACE 也可用 “ % ” 代替 • MAP 也可用 “ ^ ” 代替 • FILED 也可用 “# ”代替 • EQU 可用 “ * ” 代替

  9. 4.1 ARM伪操作-汇编控制伪操作 汇编控制伪操作用于控制汇编程序的执行流程,如:条件汇编、宏定义、 重复汇编控制等。常用的汇编控制伪操作包括以下几条: • IF 、 ELSE 、 ENDIF • WHILE 、 WEND • MACRO 、 MEND 、MEXIT 1.IF、ELSE和ENDIF伪操作能够根据条件,把一段代码包括在汇 编程序内或将其排除在程序之外 。 2.MACRO和MEND伪操作用于宏定义。MACRO标识宏定义的开 始,MEND标识宏定义的结束。用MACRO及MEND定义的一段代 码,称为宏定义体,这样在程序中就可以通过宏操作多次调用该 代码段。 MEXIT,退出宏定义。 3.WHILE和WEND伪操作用于根据条件重复汇编相同的一段源程 序。

  10. 4.1 ARM伪操作-信息报告伪操作 信息报告伪伪操作用于汇编报告指示。 • ASSERT,断言错误伪操作,用于保证源程序被汇编时满足相关的条件。如果条件不满足,则ASSERT伪操作报告错误类型,并终止汇编。 • INFO,汇编诊断信息显示伪操作。用于显示用户自定义的错误信息。 • OPT,设置列表选项伪操作。通过OPT伪操作可以在源程序中设置类表选项。 • TTL伪操作在列表文件的页顶部显示一个标题。 • SUBT伪操作在列表文件页标题的下面显示一个子标题。

  11. 4.1 ARM伪操作-其他伪操作 • AREA--用于定义一个代码段或数据段。 • ALIGN--通过添加填充字节的方式,使当前位置满足一定的对其方式。 • CODE16 、 CODE32--伪操作通知编译器,其后的指令序列为 16 位的 Thumb 指令或为32 位的 ARM 指令。 • ENTRY --用于指定汇编程序的入口,一个源文件中最多只有一个ENTRY。一个程序中至少有一个ENTRY。 • END--用于通知编译器已经到了源程序的结尾。每个源程序包含一个END。 • EQU--用于为程序中的数字常量、标号等定义一个等效的字符名称,类似于 C 语言中的# define 。 • EXPORT (或 GLOBAL )--用于在程序中声明一个全局的标号(区分大小 写),该标号可在其他的文件中引用。 • IMPORT ( EXTERN )--用于通知编译器要使用一个在其他的源文件中定义的标号。 • GET (或 INCLUDE )--用于将一个源文件包含到当前的源文件中 。 • INCBIN-用于将一个目标文件或数据文件包含到当前的源文件中。 • ROUT-用于给一个局部变量定义作用范围 。

  12. 4.2 ARM汇编伪指令 ARM中伪指令不是真正的ARM指令或Thumb指令,这些伪指令 在编译器对源程序进行汇编处理时被替换成相应的ARM或Thumb指令 序列。ARM伪指令包括ADR、ADRL、LDR和NOP。 • ADR--小范围的地址读取伪指令 该指令将基于PC的地址值或基于寄存器的地址值读取到寄存器 中。当地址值是字对齐时,地址的取址范围是-1020~1020字节。 在处理源程序时,ADR伪指令通常被编译器替换成一条ADD指令或 SUB指令来实现该ADR伪指令的功能。读取的地址必须和ADR指令在 同一个代码段中。 语法格式: ADR{cond} register,expr 例:start MOV r0,#10 ADR r4,start ; SUB r4,pc,#0xc

  13. 4.2 ARM汇编伪指令 • ADRL--中等范围的地址读取伪指令 该指令将基于PC或寄存器的地址值读取到寄存器中。ADRL伪 指令与ADR伪指令的不同之处在于它可以读取更大范围的地址, ADRL伪指令在汇编时被编译器替换成2条数据处理指令。 语法格式: ADR{cond}L register , expr 例: start MOV r0,#10 ADRL r4,start + 60000 ; ADD r4,pc,#0xe800 ; ADD r4,r4,#0x254 • NOP--空操作伪指令 NOP伪指令在汇编时将被替换成ARM中的空操作,如可能为 “MOV R0 ,R0 “等。NOP伪指令不影响CPSR中的条件标志位。

  14. 4.2 ARM汇编伪指令 • LDR--大范围的地址读取伪指令 LDR伪指令将一个32位的立即数或者一个地址值读取到寄存器中。 LDR伪指令主要有以下2种用途: • 当需要读取到寄存器中的数据超过了MOV及MVN指令可操作的范围时,可使用LDR伪指令将该数据读取寄存器中。 • 将一个基于PC的地址值或者外部的地址值读取到寄存器中。 语法格式: LDR{cond} register ,=[expr | label-expr] 例: LDR r3,=0xff0 ; MOV r3,#0xff0 LDR r1,=0xfff ; LDR r1,[pc,offset_to_litpool] ; ... ; litpool DCD 0xfff LDR r2,=place ; loads the address of place into r2 ; LDR r2,[pc,offset_to_litpool] ; ... ; litpool DCD place

  15. 4.3 ARM汇编语言语句格式 • ARM 汇编语言程序中符号的定义规则: • 符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。 • 符号由大小写字母、数字以及下划线组成。 • 符号在其作用范围内必须唯一。 • 自定义的符号名不能与系统的保留字相同。 • 符号名不应与指令或伪操作同名。 • 程序中的变量和常量 • 变量;变量有数字变量、逻辑变量和串变量3种类型 • 数字常量;使用EQU伪操作来定义数字常量。 • 标号;标号代表一个地址,段内标号的地址在汇编时确定,而段外标号的地址在连接时确定。

  16. 4.3 ARM汇编语言程序格式 在 ARM ( Thumb )汇编语言程序中,以段为单位组织源文 件的。段是相对独立的指令或数据序列,具有特定的名称。段可以 分为代码段和数据段,代码段的内容为执行码,数据段存放代码运 行时需要用到的数据。多个段在程序编译链接时最终形成一个可执 行的映象文件。 可执行映象文件通常由以下几部分构成: • 一个或多个代码段,代码段的属性为只读。 • 0个或多个包含初始化数据的数据段,数据段的属性为可读写。 • 0个或多个不包含初始化数据的数据段,这些数据段被初始化为0,数据段的属性为可读写。

  17. 4.3 ARM汇编语言程序格式 代码段示例: • 汇编语言源程序的基本结构: AREA Init , CODE , READONLY ENTRY Start LDR R0 , =0x3FF5000 LDR R1 , 0xFF STR R1 , [R0] LDR R0 , =0x3FF5008 LDR R1 , 0x01 STR R1 , [R0] ┉┉ END

  18. 4.3 ARM汇编语言程序格式 ARM体系中通常有以下3种方式控制程序的执 行流程: • 在正常执行过程中,每执行一条ARM指令,程序计数器(PC)的值加4个字节;每执行一条Thumb指令,程序计数器寄存器(PC)加2个字节。整个过程是按顺序执行。 • 跳转指令,程序可以跳转到特定的地址标号处执行,或者跳转到特定的子程序处执行。 • 当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。

  19. 4.4 ARM汇编程序设计 • 顺序结构程序 顺序结构是按照逻辑操作顺序,从某一条指令开始逐条顺序执行,直至某一条指令为止。 AREA EXAMPLE,CODE,READONLY ENTRY ;程序入口 Start ;程序开始 MOV R0,#10 ;将立即数10放入寄存器R0 MOV R1,#3 ;将立即数3放入寄存器R1 ADD R0,R0,R1 ;将R1和R0相加,结果放入R0 END ;程序结束

  20. 4.4 ARM汇编程序设计 • 选择分支结构程序 单分支结构程序

  21. 4.4 ARM汇编程序设计 • 选择分支结构程序 多分支结构

  22. 4.5 ARM汇编语言中的子程序调用 在 ARM 汇编语言程序中,子程序的调用一般是通过 BL 指令来实现的。在程序中,使用指令: BL 子程序名 该指令在执行时完成如下操作:将子程序的返回地址 存放在连接寄存器 LR 中,同时将程序计器PC 指向子程 序的入口点,当子程序执行完毕需要返回调用处时,只 需要将存放在 LR 中的返回地址重新拷贝给程序计数器 PC即可。在调用子程序的同时,也可以完成参数的传递 和从子程序回运算的结果,通常可以使用寄存器 R0 ~ R3 完成。

  23. 4.5 ARM汇编语言中的子程序调用 BL 指令调用子程序的汇编语言源程序的基本结构: AREA Init , CODE , READONLY ENTRY Start LDR R0 , =0x3FF5000 LDR R1 , 0xFF STR R1 , [R0] LDR R0 , =0x3FF5008 LDR R1 , 0x01 STR R1 , [R0] BL PRINT_TEXT ┉┉ PRINT_TEXT ┉┉ MOV PC,LR ┉┉ END

  24. The end Thank you

More Related