ARM汇编语言伪指令
ARM汇编伪指令与伪操作

应用示例:
GBLA Test1 Test1 SETA 0xaa GBLL Test2 Test2 SETL {TRUE} GBLS Test3 Test3 SETS “Testing”
4.给通用寄存器列表定义名称RLIST
RLIST伪操作用于给一个通用寄存器列表定义名称, 使用该伪操作定义的名称可以在LDM/STM中使用。
ADRL{cond}
register,expr
目标寄存器
地址表达式
地址表达式expr的取指范围: ➢当地址值是字节对齐时,其取指范围为-64K~64K; ➢当地址值是字对齐时,其取指范围为-256K~256K;
3.小范围地址读取伪指令ADR
ADR伪指令将基于PC相对偏移的地址值或基于寄 存器相对偏移的地址值读取到寄存器中。
操作符
语法格式
ARM 或 ARM
CODE32
CODE32
THUMB 或 THUMB
CODE16
CODE16
功能描述 指示编译器将要处理的是 32 位的 ARM 指令 指示编译器将要处理的是 16 位的 Thumb 指令
[例6-35]
AREA ToThumb,CODE,READONLY ENTRY ARM start ADR R0,into_thumb+1 BX R0 THUMB into_thumb MOVS R0,#10 …
[例6-36]:
AREA Example,CODE,READONLY GET include_s.s GET C:\test\include_init.s …
2.文件原样包含INCBIN
INCBIN伪操作将一个文件包含到当前源 文件中,该文件按原样包含,不进行汇编处理。 可以使用INCBIN来包含可执行文件、文字或 其他数据。
第4章 ARM伪指令及程序设计

1.1 ARM汇编伪指令--ADR
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
语法 LDR rd, =const For example LDR r0, =0xFF => LDR r0, =0x55555555=>
MOV r0, #0xFF LDR r0, [PC, #Imm12] … … DCD 0x55555555
1.3 ARM汇编伪指令--NOP
NOP--空操作伪指令 NOP伪指令在汇编时将被替换成ARM中的空操 作,如可能为 " MOV R0 ,R0 "等.NOP伪指令不 影响CPSR中的条件标志位.
2.1ARM汇编语言语句格式(1)
ARM 汇编语言程序中符号的定义规则: 符号区分大小写,同名的大,小写符号会被编译器认为是两 个不同的符号. 符号由大小写字母,数字以及下划线组成. 符号在其作用范围内必须唯一. 自定义的符号名不能与系统的保留字相同. 符号名不应与指令或伪操作同名. 程序中的变量和常量 变量;变量有数字变量,逻辑变量和串变量3种类型 数字常量;使用EQU伪操作来定义数字常量. 标号;标号代表一个地址,段内标号的地址在汇编时确定, 而段外标号的地址在连接时确定.
ARM编程进阶之一-ARM汇编伪指令

ARM编程进阶之一-ARM汇编伪指令到目前为止,我们已经具备编写较为复杂的ARM 汇编程序的能力,但要编写较为复杂且实用的程序,我们就不得不掌握ARM 汇编的伪指令(pseudo- instruction)。
千万别把汇编伪操作(directive)与汇编伪指令(pseudo- instruction)弄混了,directive 不会被编译器编译为机器指令,但pseudo- instruction 会。
而pseudo-instruction 与指令(instruction)的区别在于,1 条instruction 与1 条机器指令对应,而编译器会把1 条pseudo-instruction 编译为1 条或多条机器指令。
ARM 汇编伪指令共4 条:ldr、adr、adrl、nop1、ldr首先我们来回答基本寻址模式与基本指令一文中提出的问题。
如果我们需要mov r0, #10000 这样的指令,应该怎么办?(常数10000 不能在机器指令32bit 中的低12bit 中被表示出来)。
当你进行编译的时候,Error:All70E 的错误就会出现,如下图。
其实,这个问题很容易解决,只需要将mov r0, #10000 换为ldr r0, =10000 即可。
为什么这样就可以了呢?因为,这里的ldr r0, =10000 并非我们已经学过的ldr 指令,而是一条伪指令,编译器会将这条伪指令替换为:ldr r0, [pc, #-4]DCD 10000DCD 所分配的内存空间中存放了整数10000,该内存空间被称为literal pool,中文名称文字池。
由于整个程序都是由编译器编译的(包括文字池的分配),所以很显然编译器能够知道ldr 指令在内存中的地址与文字池在内存中的位置之间的偏移量,因此编译器就可以正确地使用以pc 为基址,采用相对寻址的ldr 指令将文字池中的数取出加载到寄存器r0 中。
由此可见,编译器对于ldr r0, =10000 这条伪指令的处理,其实质是:。
ARM汇编伪指令详解

ARM汇编伪指令详解(转载)2007-09-13 00:40ARM汇编程序分析过程中,比较难理解的是他的伪操作、宏指令和伪指令。
在读vivi时遇到很多不懂的,所以在此对引导程序中出现伪操作、宏指令和伪指令进行总结,*****************************************************一、GET option.s// GET和INCLUDE功能相同功能:引进一个被编译过的文件。
格式:GET filename其中:fiename 汇编时引入的文件名,可以有路径名。
GET符号在汇编时对宏定义,EQU符号以及存储映射时是很有用的,在引入文件汇编完以后,汇编将从GET符号后开始。
在被引入的文件中可能有GET符号再引入其他的文件。
GET符号不能用来引入目标文件。
*****************************************************二、INTPND EQU 0x01e00004//EQU可以用“*”代替,在阅读源程序时注意。
功能:对一个数字常量赋予一个符号名。
格式:name EQU expression其中:name 符号名。
Expression 寄存器相关或者程序相关的固定值。
使用EQU定义常量,与C语言中用#define定义一个常量相同。
例:num EQU 2 ;数字2赋予符号num*****************************************************三、GBLL THUMBCODE[ {CONFIG} = 16THUMBCODE SETL {TRUE}CODE32|THUMBCODE SETL {FALSE}][ THUMBCODECODE32 ;for start-up code for Thumb mode]//其中[=IF ,|=ELSE ,]= ENDIF, CODE32 表明一下操作都在ARM状态。
ARM汇编语言伪指令

鲁东大学 LUDONG UNIVERSITY
VersionNumber
Example
GBLA VersionNumber SETA 21
Debug
GBLL Debug SETL {TRUE}
GBLS VersionString VersionString SETS "Version 1.0"
鲁东大学 LUDONG UNIVERSITY
MEND
数据定义伪指令
鲁东大学 LUDONG UNIVERSITY
数据定义指令(Data definition directives):用于进行 数据空间分配。
SPACE DCB DCD, DCDU
MAP, FIELD
SPACE
鲁东大学 LUDONG UNIVERSITY
The SPACE directive reserves a zeroed block of memory.
伪指令举例
鲁东大学 LUDONG UNIVERSITY
AREA ThumbSub, CODE, READONLY ENTRY CODE32 ;ARM
header ADR r0, start + 1 CODE16 ;Thumb.
start MOV r0, #10
doadd MOV pc, lr
END
GBLA, GBLL, GBLS LCLA, LCLL, LCLS SETA, SETL,SETS
全局变量声明
鲁东大学 LUDONG UNIVERSITY
GBLA, GBLL, GBLS
-- 声明一个全局的算术、逻辑和串变量
Directives GBLA
Variable Type arithmetic
第6讲ARM汇编伪指令与伪操作

n ARM 将Keil 公司收购之后,正式推出了针对ARM 微控制器的开发工具RealView Microcontroller Development Kit ( 简称Real View MDK 或者 MDK) ,它将ARM 开发工具RealView Development Suite (简称RVDS) 的编译器RVCT 与Keil的工程管理、调试仿真工具集成在一起,是 一款非常强大的ARM 微控制器开发工具。
•ADR伪指令格式 •ADR{cond} register,expr
•指令执行的条件码 •加 载 的 目 标 寄 存 •地 址 表 达
器
式
• 地址表达式expr的取指范围:
▪当地址值是字节对齐时,其取指范围为-255~255;
▪当地址值是字对齐时,其取指范围为-1020~1020;
第6讲ARM汇编伪指令与伪操作
•应用示例(源程序):
• ...
• ADR
R0,Delay
• ...
•Delay
• MOV
R0,r14
• ...
•使用伪指令将程序标号 Delay的地址存入R0
第6讲ARM汇编伪指令与伪操作
• ARM伪指令——小范围的地址读取
• ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地 址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器 替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现 该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
• ARM伪指令——小范围的地址读取
• ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地 址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器 替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现 该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
ARM伪指令

ARM伪指令.txt珍惜生活——上帝还让你活着,就肯定有他的安排。
雷锋做了好事不留名,但是每一件事情都记到日记里面。
在 ARM 汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作。
伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成。
在 ARM 的汇编程序中,有如下几种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令以及其他伪指令。
符号定义( Symbol Definition )伪指令符号定义伪指令用于定义 ARM 汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。
常见的符号定义伪指令有如下几种:—用于定义全局变量的 GBLA 、 GBLL 和 GBLS 。
—用于定义局部变量的 LCLA 、 LCLL 和 LCLS 。
—用于对变量赋值的 SETA 、 SETL 、 SETS 。
—为通用寄存器列表定义名称的 RLIST 。
1、 GBLA、GBLL 和GBLS语法格式:GBLA ( GBLL 或 GBLS )全局变量名GBLA 、 GBLL 和 GBLS 伪指令用于定义一个 ARM 程序中的全局变量,并将其初始化。
其中:GBLA 伪指令用于定义一个全局的数字变量,并初始化为 0 ;GBLL 伪指令用于定义一个全局的逻辑变量,并初始化为 F (假);GBLS 伪指令用于定义一个全局的字符串变量,并初始化为空;由于以上三条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。
使用示例:GBLA Test1 ;定义一个全局的数字变量,变量名为 Test1Test1 SETA 0xaa ;将该变量赋值为 0xaaGBLL Test2 ;定义一个全局的逻辑变量,变量名为 Test2Test2 SETL ;将该变量赋值为真GBLS Test3 ;定义一个全局的字符串变量,变量名为 Test3Test3 SETS “ Testing ”;将该变量赋值为“ Testing ”2、 LCLA、LCLL 和LCLS语法格式:LCLA ( LCLL 或 LCLS )局部变量名LCLA 、 LCLL 和 LCLS 伪指令用于定义一个 ARM 程序中的局部变量,并将其初始化。
嵌入式系统原理与应用常用Arm汇编伪指令

常用Arm汇编伪指令
在Arm汇编语言程序中,有一些特殊指令用于对汇编过程进行控制,这些指令不是可执行指令也没有对应的机器码,只用于汇编过程中为汇编程序提供汇编信息,这些指令称为伪指令,它们所完成的操作称为伪操作。
常用的伪指令有以下几种:符号定义伪指令、数据定义伪指令、汇编控制伪指令、信息报告伪指令以及杂项伪指令。
下面列出了上述几种常用的Arm汇编伪指令。
1. 符号定义伪指令
符号定义伪指令用于定义汇编程序中的变量、对变量赋值以及定义寄存器别名等操作。
表2.1 符号定义伪指令
2. 数据定义伪指令
数据定义伪指令一般用于为特定的数据分配存储单元,并可对分配的存储单元进行初始化。
表2.2 数据定义伪指令
3. 汇编控制伪指令
汇编控制伪指令用于控制汇编程序的执行流程。
表2.3 汇编控制伪指令
4. 信息报告伪指令
报告伪指令用于汇编报告指示。
表2.4 信息报告伪指令
5. 杂项伪指令
杂项伪指令是未包含在表2.1至2.4中且在汇编程序设计中常用的伪指令。
表2_5 杂项伪指令。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ARM汇编语言伪指令ARM汇编语言伪指令ARM中伪指令不是真正的ARM指令或者Thumb指令,这些伪指令在汇编编译时对源程序进行汇编处理时被替换成对应的ARM或Thumb指令(序列)。
ARM伪指令包括ADR、ADRL、LDR和NOP等。
1、ADR(小范围的地址读取伪指令)该指令将基于PC的地址值或基于寄存器的地址值读取到寄存器中。
语法格式ADR{cond} register, expr其中,cond为可选的指令执行的条件register为目标寄存器expr为基于PC或者基于寄存器的地址表达式,其取值范围如下:当地址值不是字对齐时,其取值范围为-255~255.当地址值是字对齐时,其取值范围为-1020~1020当地址值是16字节对齐时,其取值范围将更大在汇编编译器处理源程序时,ADR伪指令被编译器替换成一条合适的指令。
通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能。
因为ADR伪指令中的地址是基于PC或者基于寄存器的,所以ADR读取到的地址为位置无关的地址。
当ADR伪指令中的地址是基于PC时,该地址与ADR伪指令必须在同一个代码段中。
示例start MOV r0,#10 ;因为PC值为当前指令地址值加8字节ADR r4, start ;本ADR伪指令将被编译器替换成SUB r4,pc,#0xc2、ADRL(中等范围的地址读取伪指令)该指令将基于PC或基于寄存器的地址值读取到寄存器中。
ADRL伪指令比ADR伪指令可以读取更大范围的地址。
ADRL伪指令在汇编时被编译器替换成两条指令,即使一条指令可以完成该伪指令的功能。
语法格式ADRL{cond} register,expr示例start MOV r0,#10 ;因为PC值为当前指令地址值加8字节ADRL r4,start+60000 ;本ADRL伪指令将被编译器替换成下面两条指令ADD r4,pc,#0xe800ADD r4,r4,#0x2543、LDR(大范围的地址读取伪指令)LDR伪指令将一个32位的常数或者一个地址值读取到寄存器中语法格式LDR{cond} register, =[expr|label-expr]其中,expr为32位的常量。
编译器将根据expr的取值情况,如下处理LDR伪指令:当expr表示的地址值没有超过MOV或MVN指令中地址的取值范围时,编译器用合适的MOV或MVN指令代替该LDR伪指令当expr表示的地址值超过了MOV或者MVN指令中地址的取值范围时,编译器将该常数放在数据缓冲区中,同时用一条基于PC的LDR指令读取该常数。
label-expr为基于PC的地址表达式或者是外部表达式。
当label-expr为基于PC的地址表达式时,编译器将label-expr表示的数值放在数据缓冲区(literal pool)中,然后将该LDR伪指令处理成一条基于PC到该数据缓冲区单元的LDR指令,从而将该地址值读取到寄存器中。
这时,要求该数据缓冲区单元到PC的距离小于4KB。
当label-expr为外部表达式,或者非当前段的表达式时,汇编编译器将在目标文件中插入一个地址重定位伪操作,这样连接器将在连接时生成该地址。
LDR伪指令主要有以下两种用途:当需要读取到寄存器中的数据超过了MOV及MVN指令可以操作的范围时,可以使用LDR 伪指令将该数据读取到寄存器中。
将一个基于PC的地址值或者外部的地址值读取到寄存器中。
由于这种地址值是在连接时确定的,所以这种代码不是位置无关的。
同时LDR伪指令的PC值到数据缓冲区中的目标数据所在的地址的偏移量要小于4KB。
示例将0xff0读取到R1中LDR R1,=0xFF0汇编后将得到:MOV R1,0xFF0将0xfff读取到R1中LDR R1,=0xFFF汇编后将得到:LDR R1,[PC,OFFSET_TO_LPOOL]…LPOOL DCD 0xFFF将外部地址ADDR1读取到R1中LDR R1,=ADDR1汇编后将得到:LDR R1,[PC,OFFSET_TO_LPOOL]…LPOOL DCD ADDR14、NOP空操作伪指令在汇编时将被替换成ARM中的空操作,如MOV R0,R0NOP伪指令不影响CPSR中的条件标志位ARM汇编程序中的符号在ARM汇编语言中,符号(symbols)可以代表地址(addresse)、变量(variables)和数字常量(numeric constants)。
当符号代表地址时,又称为标号(lable)。
当标号以数字开头时,其作用范围为当前段(当前段没有使用ROUT伪操作时),这种标号又称为局部标号(lacal lable)。
符号变量包括变量、数字常量、标号和局部标号。
1、变量在程序中,变量的值在汇编处理过程中可能会发生改变。
在ARM汇编中变量有数字变量、逻辑变量和串变量3种类型。
变量的类型在程序中是不可以改变的。
数字变量的取值范围为数字常量和数字表达式所能表示的数值;逻辑变量的取值范围为{true}和{flash};串变量的取值范围为串表达式可以表达的范围。
在ARM汇编语言中,使用GBLA、GBLL及GBLS声明全局变量;使用LCLA、LCLL及LCLS声明局部变量;使用SETA、SETL及SETS为这些变量赋值。
2、数字常量数字常量是32位的整数。
在ARM汇编语言中,使用EQU来定义数字常量。
数字常量一经定义就不可修改。
进行大小比较时,认为数字常量都是无符号数。
3、汇编时变量的替换如果在串变量前有一个$字符,在汇编时编译器将用改串的数值来取代该串变量。
对于数字变量来说,如果该变量前面有一个$字符,在汇编时编译器将该数字变量的数值转换成十六进制的串,然后用该十六进制的串取代$字符后的数字变量。
对于逻辑变量来说,如果该逻辑变量前面有一个$字符,在汇编时编译器将该逻辑变量替换成它的取值(T或者F)如果程序中需要字符$,则用$$来表示,编译器将不进行变量替换,而是将$$当作$.通常情况下,包含在两个竖线(|)之间的$并不表示进行变量替换。
但是如果竖线(|)是在双引号内,则将进行变量替换。
使用“.”来表示变量名称的结束。
4、标号标号是表示程序中的指令或者数据地址的符号。
根据标号的生成方式可分为3种:基于PC的标号。
基于PC的标号是位于目标指令前或者程序中数据定义伪操作前的标号。
这种标号在汇编时将被处理成PC值加上(或减去)一个数字常量。
常用于表示跳转指令的目标地址,或者代码段中所嵌入的少量数据。
基于寄存器的标号。
基于寄存器的标号常用MAP和FIELD未定义操作,也可以该用EQU 伪定义。
这种标号在汇编时将被处理成寄存器的值加上(或减去)一个数据常量。
常用于访问数据段中的数据。
绝对地址。
绝对地址是一个32位数据。
它可以寻址232 -1,即直接可以寻址整个内存空间。
5、局部标号局部标号主要在局部范围内使用。
它由两部组成:开头是一个0-99直接的数字,后面紧接一个通常表示该局部变量作用范围的符号。
局部变量的作用范围通常为当前段,也可以用伪操作ROUT来定义局部变量的作用范围。
局部变量定义的语法格式如下:N{routname},其中,N为0~99之间的数字。
routname为符号,通常为该变量作用范围的名称(用ROUT伪操作定义的)。
局部变量引用的语法格式如下:%{F|B}{A|T}N{routname}其中,N为局部变量的数字号。
routname 为当前作用范围的名称(用ROUT伪操作定义的)%表示引用操作F指示编译器只向前搜索B指示编译器只向后搜索A指示编译器搜索宏的所有嵌套层次T指示编译器搜索宏的当前层次如果F和B都没有指定,编译器先向前搜索,再向后搜索如果A和T都没有指定,编译器搜索所有从当前层次到宏的最高层次,比当前层次低的层次不再搜索。
如果指定了routname,编译器向前搜索最近的ROUT伪操作,若routname与该ROUT 伪操作定义的名称不匹配,编译器报告错误,汇编失败。
ARM汇编语言中的表达式表达式是由符号、数值、单目或多目操作符以及括号组成的。
1、字符串表达式字符串表达式由字符串、字符串变量、操作符以及括号组成。
字符串的最大长度为512字节,最小长度为0.下面介绍字符串表达式的组成元素。
字符串:由包含在双引号内的一系列的字符组成。
字符串的长度受到ARM汇编语言语句长度的限制。
当在字符串中包含美元符号$或者引号"时,用$$表示一个$,用""表示一个"。
字符串变量:用伪操作GBLS或者LCLS声明,用SETS赋值。
操作符:(1)LEN:返回字符串的长度:LEN:A其中,A为字符串变量(2)CHR:可以将0~255之间的整数作为含一个ASCII字符的字符串。
当有些ASCII字符不方便放在字符串中时,可以使用CHR将其放在字符串表达式中。
:CHR:A其中,A为某一字符的ASCII值(3)STR:将一个数字量或者逻辑表达式转换成串。
对于32位的数字量而言,STR将其转换成8个十六进制数组成的串;对于逻辑表达式而言,STR将其转换成字符串T或者F:STR:A其中,A为数字量或者逻辑表达式(4)LEFT:返回一个字符串最左端一定长度的子串A:LEFT:B其中,A为源字符串,B为数字量,表示LEFT将返回的字符个数(5)RIGHT:返回一个字符串最右端一定长度的子串A:RIGHT:B其中,A为源字符串,B为数字量,表示RIGHT将返回的字符个数(6)CC:用于连接两个字符串。
A:CC:B其中,A为第1个源字符串。
B为第2个源字符串。
CC操作符将字符串B连接在字符串A 的后面。
2、数字表达式数字表达式由数字常量、数字变量、操作符和括号组成数字变量用伪操作GBLA或者LCLA声明,用SETA赋值,它代表一个32位的数字量。
操作符:(1)NOT:按位取反:NOT:A其中,A为一个32位数字量(2)+、—、×、/及MOD算术操作符A+B,A-B,A×B,A/BA:MOD:B表示A除以B的余数(3)ROL,ROR,SHL,SHR移位A:ROL:B将整数A循环左移B位A:SHL:B将整数A左移B位(4)AND、OR及EOR按位逻辑操作符A:AND:B将数字表达式A和B按位作逻辑与操作3、基于寄存器和基于PC的表达式基于寄存器的表达式表示了某个寄存器的值加上(或者减去)一个数字表达式基于PC的表达式表示了PC寄存器的值加上(或减去)一个数字表达式。
基于PC的表达式通常由程序中的标号与一个数字表达式组成。
相关的操作符:(1)BASE:返回基于寄存器的表达式中的寄存器编号。
:BASE:A A为基于寄存器的表达式(2)INDEX:返回基于寄存器的表达式相对于其基址寄存器的偏移量。
:INDEX:A A为基于寄存器的表达式(3)+、﹣:正负号,可以放在数字表达式或者基于PC的表达式前面。