ARM汇编语言程序设计
第四章 ARM汇编程序设计
R0,=0x3FF5000 R1,0xFF R1,[R0] R0,=0x3FF5008 R1,0x01 R1,[R0] PRINT_TEXT
PRINT_TEXT …… MOV PC,LR …… END
第五节 ARM汇编程序示例
start MOV r0, #3 MOV r1, #3 MOV r2, #2 BL arithfunc stop MOV r0, #0x18 LDR r1, =0x20026 SWI 0x123456 arithfunc CMP r0, #num MOVHS pc, lr ADR r3, JumpTable ADR LDR JumpTable DCD DCD DoAdd ADD MOV DoSub SUB MOV r3, JumpTable pc, [r3,r0,LSL#2] DoAdd DoSub
第一节 ARM汇编指示命令
其他常用的汇编指示命令 – 边界对齐:ALIGN – 段定义:AREA – 指令集定义:CODE16和CODE32 – 汇编结束:END – 程序入口:ENTRY – 常量定义:EQU – 声明一个符号可以被其他文件引用:EXPORT和GLORBAL – 声明一个外部符号:IMPORT和EXTERN
第四节 ARM汇编程序结构
顺序 分支 循环
– –
–
–
MOV r0,#10 loop … SUBS r0,r0,#1 BNE loop
子程序
第四节 ARM汇编程序结构
子程序
AREA ENTRY Start LDR LDR STR LDR LDR STR BL …… Init,CODE,READONLY
第一节 ARM汇编指示命令
第5章(ARM汇编程序设计)
第2章 嵌入式处理器体系结构 子程序执行完毕后,可以使用MOV、B/BX、STM等指令返 回,如: MOV PC,LR 或 B LR/BX 或 STMFD 能,如: … ADR BX R1,DELAY+1 R1 … MOV LR,PC ;保存返回地址到LR,此处直接使用PC值即可 LR SP!,{ R0-R7,PC }
第2章 嵌入式处理器体系结构 内置变量、 三.ARM内置变量、预定义寄存器 内置变量 3.1 内置变量 ARM汇编器中定义了一些内置变量,这些内置变量不能使用 伪指令设置,内置变量如下表所示
第2章 嵌入式处理器体系结构
第2章 嵌入式处理器体系结构 3.2 预定义寄存器 ARM汇编器对ARM的寄存器进行了预定义(包括ATPCS对R0R15的定义),所有的寄存器和协处理器名都是大小写敏感的。
第2章 嵌入式处理器体系结构 2.8 查表操作 … LDR R3,=DISP_TAB ;取得表头 LDR R2,[ R3,R5 LSL #2 ] ;根据R5的值查表 … DISP_TAB DCD 0xC0,0xF9,0xA4,0x99,0x92 ;所查表格 DCD 0x84,0xF5,0x78,0x80,0x82
第2章 嵌入式处理器体系结构 2.10 对信号量的支持 SWP用于支持信号量的操作,实现系统任务之间的同步或互 斥。 DISP_SEM EQU 0x40002A00 … DISP_WAIT MOV R1,#0 LDR R0,= DISP_SEM SWP R1,R1,[ R0 ] ;取出信号量并设置为0 CMP R1,#0 … ;判断是否有信号 BEQ DISP_WAIT ;若没有信号则等待
第2章 嵌入式处理器体系结构
第2章 嵌入式处理器体系结构 b.逻辑表达式
ARM汇编语言程序设计
ARM汇编语言程序设计1.ARM汇编语言概述2.ARM寄存器3.ARM指令ARM指令包括数据处理指令、传输指令、分支指令和其他特殊指令。
(1)数据处理指令:包括算术运算、逻辑运算、移位和旋转、比较和测试等。
(2)传输指令:用于数据的加载和存储,包括复制、分配和堆栈操作等。
(3)分支指令:用于控制程序流,包括无条件跳转、条件跳转和中断处理等。
4.ARM程序设计(1)初始化:程序开始时需要进行系统和寄存器的初始化。
可以将堆栈指针初始化,设置另外的寄存器和内存变量等。
(2)输入输出:程序可能需要从外部设备读取数据或向外部设备写入数据。
可以使用传输指令实现数据的输入和输出。
(3)运算处理:根据程序的需求,进行各种运算处理。
可以使用数据处理指令实现数据的加减乘除、逻辑运算等。
(4)循环和条件控制:根据需要,使用分支指令控制程序的流程。
可以使用无条件跳转、条件跳转和循环指令实现程序的循环和条件控制。
(5)结束:在程序执行完毕后,可以进行清理工作,例如释放内存、关闭设备等。
5.ARM程序设计实例下面是一个简单的ARM汇编程序示例,实现从数组中找到最大值并输出:.global _start.section .dataarray: .word 1, 3, 5, 2, 4max: .word 0.section .text_start:loop:next:在上述示例中,程序首先将数组的地址和最大值的地址加载到寄存器中。
然后使用循环和条件控制指令依次比较数组元素,找到最大值并将其存储在max变量中。
最后将最大值输出,并结束程序。
arm汇编语言程序设计
ARM汇编语言程序设计
6、 DCQ(或DCQU)
语法格式: 标号 DCQ(或DCQU) 表达式 作用: DCQ(或DCQU)伪指令用于分配一片以8个字节为单位的连续存 储区域并用伪指令中指定的表达式初始化。 用DCQ分配的存储单元是字对齐的,而用DCQU分配的存储单元 并不严格字对齐。 使用示例: DataTest DCQ 100 ;分配一片连续的存储单元并初始化 为指定的值。
ARM汇编语言程序设计
1、IF、ELSE、ENDIF
语法格式: IF 逻辑表达式 指令序列1 ELSE 指令序列2 ENDIF 作用: IF、ELSE、ENDIF伪指令能根据条件的成立与否决定是否执行 某个指令序列。当IF后面的逻辑表达式为真,则执行指令序列1, 否则执行指令序列2。其中,ELSE及指令序列2可以没有,此时,当 IF后面的逻辑表达式为真,则执行指令序列1,否则继续执行后面 的指令。 IF、ELSE、ENDIF伪指令可以嵌套使用。
ARM汇编语言程序设计
1、 DCB
语法格式: 标号 DCB 表达式 作用: DCB伪指令用于分配一片连续的字节存储单元并用伪指令中指 定的表达式初始化。其中,表达式可以为0~255的数字或字符串。 DCB也可用“=”代替。 使用示例: Str DCB “This is a test!” ;分配一片连续的字节 存储单元并初始化。
ARM汇编语言程序设计
1、IF、ELSE、ENDIF 使用示例: GBLL Test ; 声明一个全局的逻辑变量,变量名为Test ⋯⋯ IF Test = TRUE 指令序列1 ELSE 指令序列2 ENDIF
ARM汇编语言程序设计
5、 DCFS(或DCFSU)
语法格式: 标号 DCFS(或DCFSU) 表达式 作用: DCFS(或DCFSU)伪指令用于为单精度的浮点数分配一片连续的字 存储单元并用伪指令中指定的表达式初始化。每个单精度的浮点数占据 一个字单元。 用DCFS分配的字存储单元是字对齐的,而用DCFSU分配的字存储单 元并不严格字对齐。 使用示例: FDataTest DCFS 2E5,-5E-7 ;分配一片连续的字存储单元 并初始化为指定的单精度数。
第3章ARM汇编语言程序设计
2.局部变量定义伪操作LCLA、LCLL和LCLS
(1)语法格式 LCLA、LCLL和LCLS伪指令用于定义一个 ARM程序中的局部变量并将其初始化。 语法格式如下: <lclx> <variable> (2)使用说明 (3)示例
3.变量赋值伪操作SETA、SETL和SETS
(1)语法格式 伪指令SETA、SETL和SETS用于给一个已 经定义的全局变量或局部变量赋值。 语法格式如下: Variable <setx> expr (2)使用说明 (3)示例
(2)用于定义局部变量的LCLA、LCLL和 LCLS。
(3)用于对变量赋值的SETA、SETL和 SETS。
(4)为通用寄存器列表定义名称的RLIST。
1.全局变量定义伪操作GBLA、GBLL和GBLS
(1)语法格式 GBLA、GBLL和GBLS伪操作用于定义一个 ARM程序中的全局变量并将其初始化。 语法格式如下: <gblx> <variable> (2)使用说明 (3)示例
4.通用寄存器列表定义伪操作RLIST
(1)语法格式 RLIST伪操作可用于对一个通用寄存器列 表定义名称,使用该伪操作定义的名称可在 ARM指令LDM/STM中使用。 语法格式如下: Name RLIST {list-of-registers} (2)使用说明 (3)示例
3.2.3 数据定义(Data Definition)伪操作
{label} DCFS{U} fpliteral{,fpliteral}
(2)使用说明 (3)示例
5.DCFD(或DCFDU)
(1)语法格式 DCFD(或DCFDU)伪指令用于为双精度
的浮点数分配一片连续的字存储单元并用伪指 令中指定的表达式初始化。
ARM教材第5章ARM汇编程序设计.
第5章ARM汇编程序设计ARM编译器,如ADS集成开发环境,一般都支持汇编语言的程序设计。
本章介绍ARM 程序设计的一些基本概念,如ARM汇编语言的伪指令、汇编语言的语句格式和汇编语言的程序结构等到,并在些基础上介绍一些常用的ARM汇编子程序的设计。
4.1 ARM伪指令ARM汇编程序由汇编指令、伪指令和宏指令组成,伪指令不介汇编指令那样在处理器的运行期间执行,而是在汇编器对汇编程序进行汇编时处理。
宏是一段独立的汇编程序代码,它是通过伪指令定义的,在程序中宏指令即调用宏指令。
当程序被汇编时,汇编程序对每个宏调用进行展开,用宏定义代汇编程序中的宏指令。
由于指令也发球汇编伪指令的一部分,因此本书将宏指令放在汇编伪一起介绍。
与单片机汇编程序设计一样,在ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,它们没有相对应的操作友码,通常称这些特殊指令助记符为伪指令,它们所完成的操作称为伪操作。
伪指令在源程序中的作用是为完成汇编程序做各种准备工作,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成了。
在ARM的光荣称号程序中,有如下几种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令以及其他伪指令。
4.1.1 符号定义(Symbol Definition)伪指令符号定义伪指令用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等。
常见的符号定义伪指令有以下几种:●用于宝玉局变量的GBLA、GBLL和GBLS;●用于定义局部变量的LCLA、SETL、LCLS;●用于对变量赋值的SETA、SETL、SETS;●为通用寄存器列表定义名称的RLIST;●为一个协处理器的寄存器定义名称的伪指令CN;●为一个协处理器定义名称的伪指令CP;●为一个CFP寄存器定义名称的伪指令DN和SN;●为一个FPA浮点寄存器定义名称的伪指令FN。
1.GBLA、GBLL和GBLS语法格式:GBLA(GBLL或GBLS) 全局变量名GBLA、GBLL和GBLS伪指令用于定义一个ARM程序中的全局变量,并半其初始化。
第二讲_ARM汇编语言程序设计
•在ARM汇编语言中,子程序调用是通过BL指令来完成的。 BL指令的语法格式如下: •BL subname •其中,subname是被调用的子程序的名称。
子程序的返回
在返回调用子程序时,转移链接指令保存到LR寄存器 (r14)中的值需要拷贝回程序寄存器PC(r15)。
跳转表思想
•在程序设计中,有时为使程序完成一定的 功能,需要调用一系列子程序中的一个,而 决定究竟调用哪一个由程序的计算值确定。 跳转表是解决该问题的有效方案。跳转表是 利用程序计数器PC在通用寄存器文件中的可 见性来实现的,如下例所示:
第二讲
ARM汇编语言程序设计
ARM汇编语言程序设计
ARM汇编中的文件格式 ARM汇编语言语句格式 ARM汇编语言程序格式 ARM汇编语言编程的重点 ARM汇编程序实例
一、ARM汇编中的文件格式
ARM 源程序文件(可简称为源文件)可以由任意一 种文本编辑器来编写程序代码,它一般为文本格式。在 ARM程序设计中,常用的源文件可简单分为以下几种:
• 这是ARM中典型的数据理指令,格式 如下所示:
ADD r0, r1, r2 ;r0 <= r1 + r2
立即数操作
• 在数据处理指令中,第二操作数除了 可以是寄存器,还可以是一个立即数,如 下所示: • ADD R3, r3,#1 ;r3 <= r3 + 1 • AND R8, r7,#0xff ;r8 <= r7[7:0] •需要特别注意的是:在32位指令编码中, 有效立即数是由一个8位的立即数循环右移 2n位得到。
• CODE32 • INTO_ARM • ADR R0,INTO_THUMB+1 • BX R0 • ….. • CODE16 • INTO_THUMB ……. • ADR R5,INTO_ARM • BX R5
arm汇编语言程序设计步骤
arm汇编语言程序设计步骤以ARM汇编语言程序设计步骤为标题,本文将详细介绍ARM汇编语言程序设计的步骤和相关知识。
一、ARM汇编语言简介ARM汇编语言是一种低级程序设计语言,用于编写针对ARM架构的机器码指令。
它是一种直接操作硬件的语言,具有高效性和灵活性。
二、ARM汇编语言程序设计步骤1. 确定程序目标和需求:在开始编写ARM汇编程序之前,首先要明确程序的目标和需求。
这包括确定程序的功能、输入和输出,以及所需的数据结构和算法。
2. 了解ARM架构:ARM架构具有多种版本和变体,每个版本都有不同的特性和指令集。
在编写ARM汇编程序之前,应该熟悉所用的ARM架构的特性和指令集。
3. 编写伪指令和数据段:ARM汇编语言中,伪指令用于定义常量、变量和数据段。
在编写程序之前,需要使用伪指令定义所需的数据段,并为程序分配必要的内存空间。
4. 编写指令段:指令段是ARM汇编程序的核心部分,包含实际执行的指令。
在编写指令段时,需要使用合适的指令来实现程序的功能。
指令可以包括算术运算、逻辑运算、分支跳转等。
5. 调试和测试:编写完ARM汇编程序后,需要进行调试和测试以确保程序的正确性和稳定性。
可以使用调试工具和模拟器来调试程序,并通过输入不同的测试数据进行测试。
6. 优化性能:在完成调试和测试后,可以对程序进行性能优化。
ARM汇编语言具有很高的性能优化空间,可以通过优化算法、减少指令数和利用硬件特性等方式来提升程序的执行效率。
7. 文档编写和维护:编写完ARM汇编程序后,应该撰写相应的文档来记录程序的功能、设计和使用方法。
文档应该清晰明了,方便其他人理解和使用。
三、ARM汇编语言编程技巧1. 熟悉寄存器:ARM架构包含多个通用寄存器和特殊寄存器,熟悉不同寄存器的用途和特性对于编写高效的ARM汇编程序非常重要。
2. 使用合适的指令:ARM汇编语言提供了丰富的指令集,选择合适的指令可以提高程序的效率。
需要根据程序需求和算法特点选择合适的指令。
arm汇编语言程序设计
arm汇编语言程序设计ARM汇编语言程序设计一、引言ARM汇编语言是一种低级语言,用于编写底层程序,如操作系统、嵌入式系统等。
它具有高效、灵活、可移植等特点,被广泛应用于各种嵌入式设备中。
本文将介绍ARM汇编语言程序设计的基本概念、语法规则以及常用指令,以帮助读者快速入门和理解该领域的知识。
二、基本概念1. 寄存器:ARM处理器具有16个通用寄存器,分别用R0~R15表示。
这些寄存器用于存储数据、地址和中间结果,并且在程序执行过程中可以被读取和写入。
2. 指令:ARM汇编语言的指令包括数据处理指令、分支指令、加载存储指令等。
这些指令用于执行各种操作,如算术运算、逻辑运算、条件判断等。
3. 标志位:ARM处理器的标志位用于记录执行过程中的状态信息,如进位标志、溢出标志等。
这些标志位对于程序的正确执行非常重要。
三、语法规则1. 指令格式:ARM汇编指令由操作码和操作数组成,其中操作码表示指令的类型,操作数表示指令的操作对象。
指令格式一般为“操作码操作数1, 操作数2, ...”。
2. 注释:注释以分号开头,用于对指令进行解释和说明。
注释对于程序的可读性和维护性非常重要,应当充分利用。
3. 标签:标签用于标识程序中的某个位置或标记某个指令,以便在其他地方进行引用。
标签一般以英文字母开头,后面可以跟随数字或下划线等字符。
4. 伪指令:伪指令是一种特殊指令,用于约定程序的起始地址、存储空间的分配等。
伪指令一般以句点开头,如“.data”表示数据段,“.text”表示代码段。
四、常用指令1. 数据处理指令:数据处理指令用于进行算术运算、逻辑运算等操作。
例如,“ADD”指令用于将两个操作数相加,并将结果存放在目标寄存器中。
2. 分支指令:分支指令用于实现程序的跳转和循环等控制流程。
例如,“B”指令用于无条件跳转到指定标签处执行。
3. 加载存储指令:加载存储指令用于实现数据的读取和写入。
例如,“LDR”指令用于将指定地址处的数据加载到寄存器中。
第3章ARM汇编语言程序设计GNU汇编ppt课件
时将程序计数器PC指向子程序的入口点,当子程序执行完毕需要返回调用处时, 只需要将存放在LR中的返回地址重新复制给程序计数器PC即可。在调用子程序的 同时,也可以完成参数的传递和从子程序返回运算的结果,通常可以使用寄存器 R0~R3完成。 以下是使用BL指令调用子程序的汇编语言源程序的基本结构:
.string/.asciz/.ascii
语法格式 .string/.asciz/.ascii 表达式{,表达式}...
作用
.string/.asciz/.ascii定义多个字符串。 注意:ascii伪操作定义的字符串需要自动添加结尾字符'\0'
举例
.string "abcd","hello"
bne 1f @跳转到1标号去执行 局部标号代表它所在的地址,因此也可以当作变量或
者函数来使用。
Linux汇编程序中的分段
(1).section伪操作
用户可以通过.section伪操作来自定义一个段,格式如下 :
.section section_name [, "flags"[, %type[,flag_specif
地址表达式expr的取值范围如下:
当地址值是字节对齐时,其取指范围为−255B~255B;
当地址值是字对齐时,其取指范围为−1020B~1020B。
ARM伪指令——小范围的地址读取
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的 地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被 编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB 指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错 误,编译失败。
第4章ARM汇编语言程序设计
(4)定义结构化内存表首地址/数据域
•
•
•
•
格式 MAP expr{,base_register} {label} FIELD expr 示例 定义一个内存表,其首地址为0x100。该表包含3个 域:A的长度为16个字节,位置为0x100;B的长度为 32个字节,位置为0x110;S的长度为256个字节,位 置为0x130。 MAP 0x100 A FIELD 16 B FIELD 32 S FIELD 256 一个寄存器相关的首地址定义结构化内存表。 MAP 0,R9;将结构化内存表的首地址设为R9的值 FIELD 4 LAB FIELD 4 LDR r0,LAB;相当于LDR R0,[R9,#4] 23
第4章 ARM汇编语言程序设计
(3)分配存储空间SPACE
• • • •
格式 {label} SPACE expr 说明 Label-可选的程序标号; Expr-分配的字节数。 示例 分配连续100字节的存储单元并初始化为0。 DataSpace SPACE 100
22
第4章 ARM汇编语言程序设计
14
第4章 ARM汇编语言程序设计
1)符号定义伪操作
(1)全局变量定义GBLA、GBLL及GBLS (2)局部变量定义LCLA、LCLL及LCLS 格式:GBLA/ GBLL/ GBLS variable 格式:LCLA/ GCLL/ GCLS variable 说明 • variable -全局/局部变量名称 • A-算术变量(初始化为0) • L-逻辑变量(初始化为假F) • S-字符串变量(初始化为空)
两种常用的ARM编译开发环境
•
ADS/SDT、RealView MDK等ARM公司推出的 开发工具 GNU ARM开发工具 ARM汇编语言的伪操作、宏指令在不同 的编译环境下有不同的编写形式和规则
第四章ARM汇编语言程序设计-PPT精选文档
Start
AREA Init, CODE, READONLY ENTRY Start LDR R0, =0x3FF5000 LDR R1, 0xFF BL PRINT_TEXT …. …. PRINT_TEXT …. …. MOV PC, LR END
;FULL SEGMENT DEFINITION-----Intel 8086 ;-----stack segment-------STACK SEGMENT DB 64 DUP(?) STACK ENDS ;-----data segment-------DATA SEGMENT ;data definitions are placed here DATA ENDS ;-----code segment-------CODE SEGMENT MAIN PROC FAR ASSUME CS: CODE, DS: DATA, SS: STACK MOV AX, DATA MOV DS, AX - ----MOV AH, 4CH INT 21H MAIN ENDP CODE ENDS END MAIN
第四章 ARM汇编语言程序设计
4.1 汇编语言程序格式 4.2 ARM汇编器的伪操作
4.3 汇编语言上机过程 4.4 汇编语言程序设计
4.1 汇编语言程序格式
4.1.1 汇编语言程序的组成
AREA Init, CODE, READONLY ENTRY LDR R0, =0x3FF5000 LDR R1, 0xFF STR R1, [R0] LDR R0, =0x3FF5008 LDR R1, 0x01 STR R1, [R0] …. END
示例:
Str DCB “This is a test!”
• DCW
arm汇编语言程序设计步骤
arm汇编语言程序设计步骤ARM汇编语言程序设计步骤一、概述ARM汇编语言是一种基于ARM架构的低级语言,用于编写底层程序和驱动程序。
在进行ARM汇编语言程序设计时,我们需要按照以下步骤进行。
二、确定需求在开始编写ARM汇编语言程序之前,我们需要明确程序的需求和目标。
这包括确定程序要实现的功能、输入和输出的格式、程序的性能要求等。
三、了解ARM架构在编写ARM汇编语言程序之前,我们需要了解ARM架构的特点和指令集。
ARM架构是一种精简指令集计算机(RISC)架构,具有高效的指令执行和低能耗的特点。
四、选择开发工具在进行ARM汇编语言程序设计时,我们需要选择合适的开发工具。
常用的开发工具包括ARM汇编器、调试器和模拟器。
这些工具可以帮助我们编译、调试和运行ARM汇编语言程序。
五、编写程序在编写ARM汇编语言程序时,我们需要按照以下步骤进行:1. 定义数据段:首先,我们需要定义程序的数据段。
数据段用于存储程序中使用的变量和常量。
在ARM汇编语言中,我们可以使用伪指令来定义数据段。
2. 定义代码段:然后,我们需要定义程序的代码段。
代码段包含程序的指令和算法。
在ARM汇编语言中,我们可以使用伪指令和指令来定义代码段。
3. 编写算法:在编写ARM汇编语言程序时,我们需要根据需求编写相应的算法。
算法是程序的核心部分,用于实现程序的功能和逻辑。
4. 调用系统服务:在ARM汇编语言中,我们可以通过调用系统服务来实现一些常用的功能,如输入输出、内存管理等。
调用系统服务需要使用特定的指令和参数。
5. 进行优化:在编写ARM汇编语言程序时,我们可以进行一些优化操作,以提高程序的性能和效率。
优化操作包括减少指令数量、减少内存访问次数、合并循环等。
六、编译和调试在完成ARM汇编语言程序的编写后,我们需要进行编译和调试。
编译是将汇编语言程序转换为机器码的过程,可以使用ARM汇编器进行编译。
调试是对程序进行测试和调试的过程,可以使用调试器和模拟器进行调试。
第4章ARM汇编语言程序设计
例 4.9
LCLA Test3 LCLL Test4
使用示例:
Test3 ;声明一个局部的数值变量,变量名为Test3 SETA 0xaa ;将该变量赋值为0xaa Test4 ;声明一个局部的逻辑变量,变量名为Test4 SETL {TRUE} ;将该变量赋值为真
4.2.2数据定义伪操作
DCB DCW(DCWU) DCD(DCDU) DCDO DCI DCQ(DCQU) DCFS(DCFSU) DCFD(DCFDU) SPACE FIELD MAP LTORG
1.AREA
格 式:AREA 段名 属性1,属性2,……
功 能:AREA伪操作用于定义一个代码段、 数据段或特定属性的段。 其中,段名若以数值开头,则该段名需用 “|”括起来,如|1_test|,用C的编译器产生 的代码一般也用“|”括起来。属性字段表示 该代码段(或数据段)的相关属性,多个 属性用逗号分隔。
4.1汇编语言程序格式
• • • • 4.1.1汇编语言的基本概念 4.1.2汇编语言源程序的组成 4.1.3汇编语言程序中常用的符号 4.1.4汇编语言程序中的表达式和运算符
4.1.1汇编语言的基本概念
4.1.2汇编语言源程序的组成
1.汇编语言源程序的结构
AREA Init,CODE,READONLY ENTRY Start LDR R0,=0x3FF5000 LDR R1,#0xFF STR R1,[R0] LDR R0,=0x3FF5008 LDR R1,#0x01 STRR1,[R0] … END
4.1.3汇编语言程序中常用的符号
在汇编语言程序设计中,经常使用各种符号表 示变量、常量和地址 符号由大小写字母、数字以及下划线组成。 符号区分大小写,同名的大、小写符号会被 编译器认为是两个不同的符号。 符号在其作用范围内必须唯一,即在其作用 范围内不可有同名的符号。 自定义的符号名不能与系统的保留字相同。 符号名不应与指令或伪指令同名。
ARM汇编语言程序设计总结.
ARM汇编语言程序设计总结一、常用指令1. 存储器访问指令LDRSTRLDRLoad 32-bit word to Memory.Syntax LDR{ cond } Rd, [Rn]LDR{ cond } Rd, [Rn, offset]LDR{ cond } Rd, [Rn, offset]!LDR{ cond } Rd, labelLDR{ cond } Rd, [Rn], offsetDescription LDR{ cond } Rd, [Rn] (zero offset)Rn is used as address value.LDR{ cond } Rd, [Rn, offset] (Pre-indexed offset)Rn and offset are added and used as address value.LDR{ cond } Rd, [Rn, offset]{!} (Pre-indexed offset with update)Rn and offset are added and used as address value. The new address value is written to Rn.LDR{ cond } Rd, label (Program-relative)The assembler calculates the PC offset and generatesLDR{ cond } Rd, [R15, offset]. LDR{ cond } Rd, [Rn], offset (Post-indexed offset)Rn is used as address value. After memory transfer, the offset is added to Rn.STRStore register 32-bit words to Memory. The address must be 32-bit word-aligned.Syntax STR{ cond } Rd, [Rn]STR{ cond } Rd, [Rn, offset]STR{ cond } Rd, [Rn, offset]!STR{ cond } Rd, labelSTR{ cond } Rd, [Rn], offsetDescription STR{ cond } Rd, [Rn] (zero offset)Rn is used as address value.STR{ cond } Rd, [Rn, offset] (Pre-indexed offset)Rn and offset are added and used as address value.STR{ cond } Rd, [Rn, offset]! (Pre-indexed offset with update)Rn and offset are added and used as address value. The new address value is written to Rn.STR{ cond } Rd, label (Program-relative)The assembler calculates the PC offset and generatesSTR{ cond } Rd, [R15], offset. STR{ cond } Rd, [Rn], offset (Post-indexed offset)Rn is used as address value. After memory transfer, the offset is added to Rn.2. —般数据处理指令ADD SUB ADC SBCAND, ORR, EOR,CMP TSTUMULL, UMLAL, SMULL, and SMLALMUL, MLA, and MLSADCAdd with Carry.Syntax ADC{ cond }{S} Rd, Rn, Op2Description Add Rn and Op2 and Carry flag and store result to Rd. ADC is typical used for multi-word arithmetic.Condition Flags If S is specified update flags: N, Z, C, V.storeresult in R4SUBSubtract registers.Syntax Description Condition Flags SUB{ cond }{S} Rd, Rn, Op2subtracts the value of Op2 from the value in Rn. If S is specified update flags: N,乙C, V.Example SUBS R8,R6,#240 〃R8=R6-240 SBCSBC{ cond }{S} Rd, Rn, Op2 synthesize multiword arithmetic. If S is specified update flags: N,乙 C, V.ANDLogical AND operation.Syntax Description Condition Flags AND{ cond }{S} Rd, Rn, Op2Load Rd with logical AND of Rn with Op2. Rd := Rn AND Op2 If S is specified, N, Z flags are updated. C flag may be updated bycalculation of Op2. ExampleAND R9,R2,#0xFF00 // Load R9 with R2 and value in 0xFF00ORRLogical OR operation.ORR{ cond }{S} Rd, Rn, Op2OR operations on the values in Rn and Op2.If S is specified, N, Z flags are updated. C flag may be updated byORR R2, R0, R5 // Rd = R0 or R5CMPCompare. Used in combination with conditional branch instructions.Syntax CMP { cond } Rn, Op2Description subtracts the value of Op2 from the value in Rn (equals to the SUBSinstruction with a discarded result).This instruction updates the condition flags, but do not place a result in a register. Condition FlagsN, Z, C and V flags are updated.ExampleCMP R2, R9 //Subtract value of R9 from R2TSTTest. Syntax TST{ cond } Rn, Op2Descriptionperforms a bitwise AND operation on the value in Rn and the value of Op2.Subtract with carry. Syntax Description Condition FlagsSyntax Description Condition Flags calculation of Op2.ExampleThis is similar to the ANDS instruction, except that the result is discarded.Condition Flags N and Z flags are updated according the result. C flag may be updatedduring the calculation of Op2.Example TSTNE r1,r5,ASR r1MULMultiply (32-bit by 32-bit, bottom 32-bit result).Syntax MUL{ cond }{S} Rd, Rm, RsDescription multiplies the values from Rm and Rs, and places the least significant 32 bits of the result in Rd.Condition Flags If S is specified:N and Z flags according to the result.the C flag in ARM architecture v4 and earlier will be corrupted.the C flag in ARM architecture v5 and later is not affected.Example MUL R10, R2, R5 〃R10:= R2*R53. 分支控制指令B, BL, BX, BLX, and BXJBBranch to label. Used to jump to a specific program location.Syntax B{ cond } labelDescription The jump distance must be within -252 to +258 bytes for conditional and ±2 KBytes for unconditional branch.Condition Flags not modified.Example CMP R1,#1// compare R10 with #10BEQ val_ok // jump to label val_okBLBranch with Link. Use to call subroutines.Syntax Descriptiondistance must be withinBL{ cond } labelCopy address of next instruction to R14 and jump to label. ThejumpBXBranch indirect and switch CPU mode (Thumb / ARM) as required.Syntax BX{ cond } RmDescription Condition FlagsBranch to address in Rm. Change to ARM mode if bit 0 of Rm is clear. not modified.ExampleBX R5 // branch in direct to address fun cti on4. ARM 伪指令1•符号定义伪指令GBLA, GBLL, and GBLS LCLA, LCLL, and LCLS2.数据定义伪指令Condition Flagsnot modified.DCBDCD and DCDU 5. 条件代码Con diti on Codeinclude a condition code field. This{cond}A conditional instruction is only executed on match of the condition flags in theProgramStatus Register . For example, the BEQ ( B instruction with EQ condition) branches only if the {cond} field is empty the instruction is always executed.Examples:Most ARM instructions and the Thumb Branch instruction field is marked in the CPU instructions withZ flag is set. If the6•移位类型The ARM CPU has very powerful shift operations that can be used together with standard CPU instructions. The various shift types are explained below:Logical Shift Right (LSR)Logical shift right is encoded with LSR #n or LSR Rs in the bit 31 and the Carry flag (C) holds the last bit shifted out.3130 29lla--------------------------------------------------------------------------------------------------------------------------- rb■IArithmetic Shift Right (ASR)Arithmetic shift right is encoded with ASR #n or ASR Rs in the Op2 field. The sign bit (bit 31of value) is shifted into the high bit 31 and the Carry flag (C) holds the last bit shifted out.Rotate Right (ROR)Rotate right is encoded with ROR #n in the Op2 field. Bit 0 of the value is shifted into bit 31.The Carry flag (C) holds the last bit shifted out.31302&Bit211Q■h -■!lBh*■Op2 field. The value 0 is shifted intoBitLogical Shift Left (LSL)Logical shift left is encoded with LSL #n or LSL Rs in the bit 0 and the Carry flag (C) holds the last bit shifted out.Op2 field. The value 0 is shifted into313Bit------ 亦 3029Bil2-- ■1i■a■iIRotate Right Exte nded (RRX)Rotate right extended is encoded with RRX in the shiftedinto bit 31. The shifted out bit 0 is written to C. 31 30 29Binary operators RealView Compilati on Tools for 口 Visio n Versio nAssembler Guide 4.0Home > Assembler Reference > Expressions, literals, and operators> Binary operators Binary operators are written between the pair of subexpressions they operate on.Binary operators have lower precedence than unary operators. Binary operators appear in this section in order of precedence.NoteThe order of precedence is not the same as in C, see Multiplicative operatorsMultiplicative operators have the highest precedence of all binary operators. They act only on numeric expressions.Table 3.9 shows the multiplicative operators.Table 3.9. Multiplicative operators*A*BMultiply / A/BDivide:MOD: |% A:MOD:B A modulo BOp2 field. The value of the Carry flag (C) isOperator precedence in armasm and CString manipulation operatorsTable 3.10 shows the string manipulation operators. In In the slicing operators LEFT and RIGHT:A must be a stringB must be a numeric expression.Table 3.10. String manipulation operators:CC:」A:CC:B B concatenated onto the end of A:LEFT: J A:LEFT:B J The left-most B characters of A:RIGHT: A:RIGHT:B ]The right-most B characters of AShift operatorsShift operators act on numeric expressions, shifting or rotating the first operand by the amount specified by the second.Table 3.11 shows the shift operators.Table 3.11. Shift operators:ROL: A:ROL:B Rotate A left by B bits:ROR :A:ROR:B Rotate A right by B bits:SHL: << A:SHL:B Shift A left by B bits:SHR : >> A:SHR:BShift A right by B bitsNoteSHR is a logical shift and does not propagate the sign bit.CC, both A and B must be strings.Addition, subtraction, and logical operatorsAddition and subtraction operators act on numeric expressions.bitwise , that is, Logical operators act on numeric expressions. The operation is performed independently on each bit of the operands to produce the result.Table 3.12 shows addition, subtraction, and logical operators.Table 3.12. Addition, subtraction, and logical operators+ A+B Add A to B- A-B[Subtract B from A:AND:」& A:AND:B] Bitwise AND of A and B|EOR:」 A A:EOR:B| Bitwise Exclusive OR of A and B:OR: |1]A:OR:B Bitwise OR of A and BRelational operatorsTable 3.13 shows the relational operators. These act on two operands of the same type to produce a logical value.The operands can be one of:numericprogram-relativeregister-relativestrings.Strings are sorted using ASCII ordering. String A is less than string B if it is a leading substring of string B, or if the left-most character in which the two strings differ is less in string A than in string B.Arithmetic values are unsigned, so the value of 0>-1 is {FALSE}. Table 3.13. Relational operatorsBoolean operatorsThese are the operators with the lowest precedence. They perform the standard logical operations on their operands.In all three cases both A and B must be expressions that evaluate to either {FALSE}. Table 3.14 shows the Boolean operators.Table 3.14. Boolean operators:LAND: | && A:LAND:B JLogical AND of A and B:LEOR: J A:LEOR:B J Logical Exclusive OR of A and B :LOR: n II 1 A:LOR:B Logical OR of A and B= == A=B A equal to B>A>B A greater than B>=A>=B A greater than or equal to B<A<B A less than B<=A<=B A less than or equal to B/=l <> != A/=B| A not equal to B{TRUE} or。
第2章3_ARM汇编程序设计
在ARM嵌入式系统中,一般用C语言等高级语言对 各个应用接口模块功能的实现进行程序设计,但在 某些地方用汇编语言更方便、简单。 在一些关键部分,例如用来初始化电路以及用来为 软件(高级语言编写)做运行前准备的启动代码必 须用汇编语言编写。
汇编语言的代码效率很高,一般用于对硬件的直接 控制。
符号说明 (1)label lable后面要带冒号‘:’ 例如:_start: b reset_handler。
(2)给符号赋值 三种方式:= .set .equ (3)符号名 由数字、字母或‚.‛,‚_‛组成,不可以数字 开头,大小写敏感。
汇编器预定义的寄存器名称
R0~R15 A1~A4 V1~V8 SB SL FP IP SP LR PC CPSR SPSR F0~F7 S0~S31 D0~D15 P0~P15 C0~C15 ARM 处理器的通用寄存器 入口参数、处理结果、暂存寄存器;是 R0~R3 的同义词 变量寄存器,R4~R11 静态基址寄存器,R9 栈界限寄存器,R10 帧指针寄存器,R11 内部过程调用暂存寄存器,R12 栈指针寄存器,R13 链接寄存器,R14 程序计数器,R15 当前程序状态寄存器 程序状态备份寄存器 浮点数运算加速寄存器 单精度向量浮点数运算寄存器 双精度向量浮点数运算寄存器 协处理器 0~15 协处理器寄存器 0~15
GNU环境下汇编语句与编译说明
GNU环境下ARM汇编语言程序设计主要 是面对在ARM平台上进行嵌入式LINUX的开发。 GNU标准中提供了支持ARM汇编语言的 汇编器as(arm-elf-as)、交叉编译器gcc ld(arm-elfgcc)和链接器ld(arm-elf-ld)。
ARM汇编语言程序设计基础.
第9章ARM汇编语言程序设计基础ADS IDE(集成开发环境)⏹ARM应用软件的开发工具根据功能的不同,可以分为编辑软件、编译软件、汇编软件、链接软件、调试软件、嵌入式实时操作系统、函数库、评估板,JTAG仿真器以及在线仿真器等。
目前有多家公司可以提供以上不同类型的开发工具,用户采用ARM处理器进行嵌入式系统开发时,选择合适的开发工具可以加快开发进度,节省开发成本。
ADS工具包的组成⏹ADS是ARM公司推出的集成开发工具包,是专门用于ARM相关应用开发和调试的综合性软件。
目前常用的版本是1.2,在功能和易用性上比早期的SDT都有提高,是一款功能强大又易于使用的开发工具。
ARM ADS包含有编译器、链接器、CodeWarrior IDE、调试器、指令集模拟器、ARM开发包和应用库等部分,可以用ADS来开发、编译、调试采用包括C、C++和ARM汇编语言编写的程序。
ADS工具包的组成⏹ 1. 编译器⏹ADS提供多种编译器,以支持ARM和Thumb指令的编译。
⏹ 2. 链接器⏹Armlink(ARM链接器)可以将编译得到的一个或多个目标文件和相关的一个或多个库文件进行链接,生成一个可执行文件,也可以将多个目标文件部分链接成一个目标文件,以供进一步的链接。
ADS工具包的组成⏹ 3. CodeWarrior IDE⏹CodeWarrior IDE(集成开发环境)包括工程管理器、代码生成接口、语法敏感编辑器、源文件和类浏览器、源代码版本控制系统接口以及文本搜索引擎等。
ADS仅在其PC机版本中集成了该IDE。
⏹CodeWarrior IDE为管理和开发项目提供了简单多样化的图形用户界面,用户可以使用ADS的CodeWarrior IDE为ARM和Thumb处理器开发用C、C++或者ARM汇编语言编写的程序代码。
ADS工具包的组成⏹(1)调试器类型⏹ADS中包含有3个调试器,分别是ARM扩展调试器AXD(ARM eXtended Debugger.⏹(2)调试方式⏹在ARM体系中,可以选择Multi-ICE(Multi-processor in-circuit emulator)ARMulator或Angel多种调试方式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
是由物理寄存器r1来存放r0所代表的值。
Chavezwang@
计算机学院嵌入式实验室
19
北京理工大学珠海学院
嵌入式系统设计及应用开发
内联汇编中虚拟寄存器举例
int main(void) #include <stdio.h> void test_inline_register(void) { int i; int r5,r6,r7; __asm { MOV i,#0 loop: MOV r5,#0 MOV r6,#0 MOV r7,#0 ADD i,i,#1 CMP i,#3 BNE loop } }
北京理工大学珠海学院
嵌入式系统设计及应用开发
何时使用内联汇编和嵌入型汇编
程序中使用饱和算术运算(Saturating arithmetic),如SSAT16 和 USAT16指令。
程序中需要对协处理器进行操作。 在C或C++程序中完成对程序状态寄存器的操作
注:使用内联汇编编写的程序代码效率也比较高
③ 不能在程序中使用“.”或{PC}得到当前指令地址值。
④ 在16进制常量前加“0x”。
⑤ 建议不要对堆栈进行操作。
Chavezwang@
计算机学院嵌入式实验室
16
北京理工大学珠海学院
嵌入式系统设计及应用开发
内联汇编的限制2
⑥ 编译器可能会使用r12和r13寄存器存放编译的中间结果, 在计算表达式值可能会将寄存器r0~r3、r12及r14用于子程 序调用。另外在内联汇编中设置程序状态寄存器CPSR中的 标志位NZCV时,要特别小心。内联汇编中的设置很可能会 和编译器计算的表达式的结果冲突。
编译器使用一套规则的来设置寄存器的用法
CPSR 标志位可被函数调用所破坏 一些和编译过的代码交互工作的汇编码在接口层必 须满足的规范
寄存器变量 必须保护
- 如果 RWPI选项有效,作为栈的基地址 - 如果软件堆栈检查有效,作为栈的限制值
Scratch register (corruptible)
Stack Pointer Link Register Program Counter
合内联汇编的语法规 则。 int f(int x) { STMFD sp!, {r0} ADD r0, x, 1 EOR x, r0, x // 保存r0 – 不合法,因 int r0; __asm { 为在读之前没有对寄存器寄存器写操作
{
__asm
{ ADD r0, x, 1
LDMFD sp!, {r0}
9
Chavezwang@
计算机学院嵌入式实验室
北京理工大学珠海学院
嵌入式系统设计及应用开发
相互调用必须遵循AAPCS
Register
作为函数传递的参数值
r0 r1 r2 r3 r4 r5 r6 r7 r8 r9/sb r10/sl r11
r12 r13/sp r14/lr r15/pc
IAR汇编器支持的伪指令 简单汇编语言程序设计
Chavezwang@
计算机学院嵌入式实验室
3
北京理工大学珠海学院
嵌入式系统设计及应用开发
汇编语言程序设计规范-段
段:相对独立的指令或数据序列,具有特点的名 称 段:
– –
代码段:内容为执行代码 数据段:存放代码代码运行时需要用到 的数据
Chavezwang@
计算机学院嵌入式实验室
5
北京理工大学珠海学院
嵌入式系统设计及应用开发
注意
源文件中段之间的相对位置与可执行的映 像文件中段的相对位置可能不相同
ZI RO-DATA RW RO-CODE CODE B
A
RO
Chavezwang@
计算机学院嵌入式实验室
} return x; }
Chavezwang@
// 不需要恢复寄存器.
}
EOR x, r0, x
return x; }
计算机学院嵌入式实验室 13
北京理工大学珠海学院
嵌入式系统设计及应用开发
内联汇编语法
① __asm("instruction[;instruction]"); // 必须为单条指令 __asm{instruction[;instruction]} ② __asm{ ... instruction ... } ③ asm("instruction[;instruction]"); // 必须为单条指令 asm{instruction[;instruction]} ④ asm{ ... instruction ... }
extern void mystrcopy(char *d, const char *s); int main(void) { const char *src = “Source”; char dest[10]; CALL ... mystrcopy(dest, src); ... }
mystrcopy LDRB r2, [r1], #1 STRB r2, [r0], #1 CMP r2, #0 BNE mystrcopy MOV pc, lr
Chavezwang@ 计算机学院嵌入式实验室 14
北京理工大学珠海学院
嵌入式系统设计及应用开发
内联汇编( Inline assembler
使用C变量代替寄存器
/* Q flag is bit 27 of PSR */ const int Q_Flag=0x08000000; __inline int Clear_Q_flag (void) { int old_psr, new_psr, result;
ARM 汇编语言程序 设计
北京理工大学珠海学院
嵌入式系统设计及应用开发
特别说明
开发工具不同所以的 编译语言伪指令不同
– – –
GCC ADS IAR
Chavezwang@
计算机学院嵌入式实验室
2
北京理工大学珠海学院
嵌入式系统设计及应用开发
汇编语言程序设计
汇编程序设计规范⑦ 可以使用内联汇编码更改处理器模式。然而,更改处理
器模式会禁止使用 C或 C++ 操作数或对已编译 C 或 C++ 代码的调用,直到将处理器模式更改回原设置之后之前的函
数库才可正常使用。
⑧ 为 Thumb 状态编译 C 或 C++ 时,内联汇编程序不可用且 不汇编 Thumb 指令。
Chavezwang@ 计算机学院嵌入式实验室 17
- r14值压栈以后,r14可作为一个临时寄存器使用
Chavezwang@
计算机学院嵌入式实验室
10
北京理工大学珠海学院
嵌入式系统设计及应用开发
在C程序中调用汇编
在汇编程序中用export name来定 义 在C程序中直接调用 一般的链接即可
AREA StringCopy, CODE, READON EXPORT mystrcopy
多个段在程序编译链接时最终形成一个可执行的 代码段
计算机学院嵌入式实验室 4
Chavezwang@
北京理工大学珠海学院
嵌入式系统设计及应用开发
段的设置规则
一个或多个代码段,代码段的属性为只读 0个或多个包含初始化数据的数据段,数据 段的属性为可读/写 0个或多个不包含初始化数据的数据段,数 据段的属性为可读/写
北京理工大学珠海学院
嵌入式系统设计及应用开发
内联汇编的限制3
持。
⑨ 尽管可以使用通用协处理器指令指定 VFP 或 FPA 指令,但内联汇编程序不为它们提供直接支
不能用内联汇编代码更改 VFP 向量模式。内联汇
编可包含浮点表达式操作数,该操作数可使用编译
程序生成的 VFP 代码求出操作数值。因此,仅由 编译程序修改 VFP 状态很重要。 ⑩ 内嵌汇编不支持的指令:BX、BLX、BXJ和 BKPT指令。而LDM、STM、LDRD和STRD指令
6
混合使用C/C++/汇编
北京理工大学珠海学院
嵌入式系统设计及应用开发
混合使用C/C++/汇编
内联汇编和嵌入型汇编的使用 从汇编代码访问 C 全局变量 在C++中使用C头文件 C、C++ 和 ARM 汇编语言之间的调用
Chavezwang@
计算机学院嵌入式实验室
8
② 如果一条指令不能在一行中完成,使用反斜杠“/”将其连接。
③ 内联汇编中的注释语句可以使用C或C++风格的。 ④ 汇编语言中使用逗号“,”作为指令操作数的分隔符,所以如果在C语 言中使用逗号必须用圆括号括起来。如,__asm {ADD x, y, (f(), z)}。 ⑤ 内联汇编语言中的寄存器名被编译器视为C或C++语言中的变量,所以内 联汇编中出现的寄存器名不一定和同名的物理寄存器相对应。而且这些 寄存器名在使用前必须声明,否则编译器将提示警告信息。
不是一个真正的汇编文件
通过优化器实现 代码可能被改变
只支持在ARM 模式 (not Thumb) 可以有自己独立的函数,但通 常是内嵌在C函数中
__asm
{ MRS old_psr, CPSR BIC new_psr, old_psr, #Q_Flag AND result, old_psr, #Q_Flag MSR CPSR_f, new_psr } return result; }
Chavezwang@ 计算机学院嵌入式实验室 20
{
test_inline_register (); printf("test inline register\n");