ARM常用的伪指令

合集下载

ARM汇编语言伪指令

ARM汇编语言伪指令

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位的常量。

ARM伪指令

ARM伪指令

ARM伪指令——中等范围的地址读取
ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地 址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址 。在汇编编 译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能 用两条指令实现,则产生错误,编译失败。 ADRL伪指令格式 ADRL{cond} register,expr
... ADRL ... Delay MOV ... R0,r14 R0,Delay 0x20 0x24
编译后的反汇编代码:
... ADD ADD ... 0xFF68 MOV ... r0,r14 r1,pc,#40 r1,r1,#FF00
使用伪指令将程序标号 Delay的地址存入R0
ADRL伪指令被汇编成两条指令
ARM汇编程序设计
AREA Word, CODE, READONLY ; name this block of code num EQU 20 ; Set number of words to be copied ENTRY start LDR r0, =src ; r0 = pointer to source block LDR r1, =dst ; r1 = pointer to destination block MOV r2, #num ; r2 = number of words to copy wordcopy LDR r3, [r0], #4 ; a word from the source STR r3, [r1], #4 ; store a word to the destination SUBS r2, r2, #1 ; decrement the counter BNE wordcopy ; ... copy more stop MOV r0, #0x18 ; angel_SWIreason_ReportException LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SWI 0x123456 ; ARM semihosting SWI AREA BlockData, DATA, READWRITE src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4 dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 END ; mark the first instruction to call

ARM编程进阶之一-ARM汇编伪指令

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汇编伪指令详解

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状态。

第3章 3.4 ARM伪指令及应用程序举例

第3章 3.4 ARM伪指令及应用程序举例

局部变量的作用范围为:包含该局部变量的宏代码的 一个实例
August 9, 2013
Neusoft Institute of Information
• 3、 SETA,SETL,SETS • 用于给ARM程序中的变量赋值。 –SETA:给一个算术变量赋值。 –SETL:给一个逻辑变量赋值。 –SETS:给一个串变量赋值。 • 语法格式: variable <setx> expression expression:赋给变量的值。
Neusoft Institute of Information
• 1、GBLA,GBLL,GBLS • 用于声明一个ARM程序中的全局变量,并将其初始化。 –GBLA:声明一个全局算术变量,并初始化成0。 –GBLL:声明一个全局逻辑变量,并初始化成 {FALSE}。 –GBLS:声明一个全局串变量,并初始化成空串 “”。 • 语法格式: <gblx> variable
„„
MOV R0,R14
August 9, 2013
Neusoft Institute of Information
3、LDR ——大范围的地址读取 LDR伪指令用于加载32位立即数或一个地 址值到指定的寄存器。在汇编编译源程序时,LDR伪 指令被编译器替换成一条合适的指令。若加载的常 数未超过MOV或MVN的范围,则使用MOV或MVN指令代 替该LDR伪指令,否则汇编器将常量放入文字池,并 使用一条程序相对偏移的LDR指令从文字池读出常量。 语法格式: LDR{cond} register,=expr 其中: Register:加载的目标寄存器。 expr:32位常量或地址表达式。
August 9, 2013
Neusoft Institute of Information

嵌入式系统原理与应用常用Arm汇编伪指令

嵌入式系统原理与应用常用Arm汇编伪指令

常用Arm汇编伪指令
在Arm汇编语言程序中,有一些特殊指令用于对汇编过程进行控制,这些指令不是可执行指令也没有对应的机器码,只用于汇编过程中为汇编程序提供汇编信息,这些指令称为伪指令,它们所完成的操作称为伪操作。

常用的伪指令有以下几种:符号定义伪指令、数据定义伪指令、汇编控制伪指令、信息报告伪指令以及杂项伪指令。

下面列出了上述几种常用的Arm汇编伪指令。

1. 符号定义伪指令
符号定义伪指令用于定义汇编程序中的变量、对变量赋值以及定义寄存器别名等操作。

表2.1 符号定义伪指令
2. 数据定义伪指令
数据定义伪指令一般用于为特定的数据分配存储单元,并可对分配的存储单元进行初始化。

表2.2 数据定义伪指令
3. 汇编控制伪指令
汇编控制伪指令用于控制汇编程序的执行流程。

表2.3 汇编控制伪指令
4. 信息报告伪指令
报告伪指令用于汇编报告指示。

表2.4 信息报告伪指令
5. 杂项伪指令
杂项伪指令是未包含在表2.1至2.4中且在汇编程序设计中常用的伪指令。

表2_5 杂项伪指令。

[计算机]ARM伪指令

[计算机]ARM伪指令

ARM伪指令一、符号定义(Symbol Definition )伪指令 (2)1、GBLA、GBLL 和GBLS (2)2、LCLA、LCLL 和LCLS (2)3、SETA、SETL 和SETS (3)4 、RLIST (3)二、数据定义(Data Definition )伪指令 (3)1、DCB (4)2、DCW(或DCWU) (4)3、DCD(或DCDU) (4)4、DCFD(或DCFDU) (5)5、DCFS(或DCFSU) (5)6、DCQ(或DCQU) (5)7、SPACE (5)8、MAP (6)9、FILED (6)三、汇编控制(Assembly Control )伪指令 (6)1、IF、ELSE、ENDIF (6)2、WHILE、WEND (7)3、MACRO、MEND (7)4、MEXIT (8)四、其他常用的伪指令 (8)1、AREA (8)2、ALIGN (9)3、CODE16、CODE32 (9)4、ENTRY (10)5、END (10)6、EQU (10)7、EXPORT(或GLOBAL) (10)8、IMPORT (11)9、EXTERN (11)10、GET(或INCLUDE) (11)11、INCBIN (12)12、RN (12)13、ROUT (12)五、以“。

”开头的伪指令 (13)1、.word (13)2、.balignl (13)在 ARM 汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作。

伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成。

在 ARM 的汇编程序中,有如下几种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令以及其他伪指令。

一、符号定义(Symbol Definition )伪指令符号定义伪指令用于定义 ARM 汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。

ARM GUN 伪指令

ARM GUN 伪指令

1.宏定义.macro 宏名 参数名列表 @伪指令.macro定义一个宏宏体.endm @.endm表示宏结束如果宏使用参数,那么在宏体中使用该参数时添加前缀“\”。

宏定义时的参数还可以使用默认值。

可以使用.exitm伪指令来退出宏。

2.段定义section伪操作用户可以通过.section伪操作来自定义一个段,格式如下:.section section_name [, "flags"[, %type[,flag_specific_arguments]]]flag的值为 a 允许段 w 可写段 x 执行段预定义的段名 .text @代码段 .data @初始化数据段 .bss @未初始化数据段定义入口点 :.globl _start_start:注意: 源程序中.bss段应该在.text之前当用预定义段名可以直接使用,当是自定义时段定义要完整。

3.数据定义伪操作: .byte 1b,.short 2b,.long 4b,.quad 8b,.float,.string/.asciz/. ascii,重复定义伪操作.rept,赋值语句.equ/.set注意:.ascii伪操作定义的字符串需要自行添加结尾字符'\0'4. 函数定义伪操作:格式函数名:函数体返回语句一般的,函数如果需要在其他文件中调用, 需要用到.global伪操作将函数声明为全局函数。

为了不至于在其他程序在调用某个C函数时发生混乱,对寄存器的使用我们需要遵循APCS准则。

函数编译器将处理为函数代码为一段.global的汇编码。

5.常数1)十进制数以非0数字开头,如:123和9876;2)二进制数以0b开头,其中字母也可以为大写;3)八进制数以0开始,如:0456,0123;4)十六进制数以0x开头,如:0xabcd,0X123f;5)字符串常量需要用引号括起来,中间也可以使用转义字符,如: "You are welcome!\n";6)当前地址以"."表示,在汇编程序中可以使用这个符号代表当前指令的地址;7)表达式:在汇编程序中的表达式可以使用常数或者数值, "-"表示取负数, "~"表示取补,"<>"表示不相等,其他的符号如:+、-、*、/、%、<、<<、>、>>、|、&、^、!、==、>=、<=、&&、||跟C语言中的用法相似。

ARM--4

ARM--4

1、通用伪指令包括:1符号定义伪指令2数据定义伪指令3汇编控制伪指令4及其他一些常用伪指令等。

2、GBLA DATE1 ;声明一个全局数字变量DA TE1GBLL DATE1 ;声明一个全局逻辑变量DA TE2GBLS DATA3 ;声明一个全局的字符串变量DATE33、SETA、SETL和SETS语法格式:变量名SETA(SETL或SETS)表达式SETA、SETL、SETS是变量赋值伪指令,用于给一个已经定义的全局变量或局部变量赋值。

SETA用于给一个数字变量赋值;SETL用于给一个逻辑变量赋值;SETS用于给一个字符串变量赋值;指令示例:GBLA EXAMP1;先声明一个全局数字变量EXAMP1EXAMP1 SETA 0xaa ;将变量EXAMP1赋值为0xaa4、数据定义伪指令1)DCB语法格式:标号DCB 表达式指令示例:String DCB“This is a test!”;分配一片连续的字节存储单元并初始化。

DATA2 DCB 15,25,62,00 ;为数字常量15,25,62,00分片内存单元2)DCW(或DCWU)语法格式:标号DCW(或DCWU)表达式指令示例:DATA1 DCW 1,2,3 ;分配一片连续的半字存储单元并初始化为1,2,3。

DA TA2 DCWU 45,0x2a*0x2a;分配一片非半字对准存储单元并初始化。

3)DCD(或DCDU)语法格式:标号DCD(或DCDU)表达式指令示例:DATA1 DCD 4,5,6 ;分配一片连续的字存储单元并初始化。

4、AREA语法格式:AREA 段名属性1,属性2,……①CODE属性:用于定义代码段,默认为READONL Y。

②DATA属性:用于定义数据段,默认为READWRITE。

③READONL Y属性:指定本段为只读,代码段默认为READONL Y。

④READWRITE属性:指定本段为可读可写,数据段的默认属性为READWRITE。

ARM伪指令介绍

ARM伪指令介绍

以上三条伪指令用于声明局部变量,在其作用范围内变量名必须唯一。 以上三条伪指令用于声明局部变量,在其作用范围内变量名必须唯一。 9
ARM系统硬件设计基础 第4章 ARM系统硬件设计基础
3、变量赋值伪指令SETA、SETL、SETS 变量赋值伪指令SETA、SETL、 SETA
SETA伪指令可以为一个算术变量赋值; SETA伪指令可以为一个算术变量赋值; 伪指令可以为一个算术变量赋值 SETL伪指令可以为一个逻辑变量赋值; SETL伪指令可以为一个逻辑变量赋值; 伪指令可以为一个逻辑变量赋值 SETS伪指令可以为一个字符串变量赋值。 SETS伪指令可以为一个字符串变量赋值。 伪指令可以为一个字符串变量赋值 语法格式: SETA(SETL或SETS) 语法格式: 变量名 SETA(SETL或SETS) 表达式 例: DATE1 DATE1 GBLA SETA LCLL STATUS SETL GBLS STRNG SETS DATE1 DATE1 0xf2003b*2 xf2003b*2 2003b* STATUS {TRUE} STRING “Linux” ;声明全局算术变量DATE1 声明全局算术变量DATE1 DATE ;为这个变量赋值 ;声明局部逻辑变量STATUS 声明局部逻辑变量STATUS ;为这个逻辑变量赋值 ;声明一个全局字符串变量STRING 声明一个全局字符串变量STRING ;为STRING赋值”Linux” STRING赋值”Linux” 赋值
,=DATA1 LDR R0,=DATA1 (2)方便记忆 =DATA1 LDR R0,=DATA1
直接加载变量123456 LDR R0,=123456 ;直接加载变量123456 =SECTION+04 LDR R1,=SECTION+04 [R1 LDR R0,[R1] (3)方便修改 (4)不必关心存储空间 编译程序会自动安排变量的存储空间 11 ;先加载存储单元地址

四、ARM汇编语言伪指令

四、ARM汇编语言伪指令

字节对准。例如,expression等于10,该段将按1KB对
准。 • CODE 代码段,缺省为READONLY • COMDEF 通用段定义。该段可包括代码和数据,在多 个源文件中同名的COMDEF段必须相同 • COMMON 通用数据段,不能定义任何代码和数据, 通常由链接器初始化为零
TM
12
指导性伪指令
(1)AREA
• DATA 包含数据,但不包含指令,缺省READWRIT。 • INTERWORK 表明代码段可以适用ARM/Thumb
interworking功能。
• NOINIT 表明数据段初始化为零,只为指示符保留空间 • READONLY 表明该段只读。 • READWRITE 表明该段可读可写。
Development Suite (简称RVDS) 的编译器RVCT
与Keil的工程管理、调试仿真工具集成在一起,是 一款非常强大的ARM 微控制器开发工具。
TM
4

2. GNU ARM开发工具

GNU是“GNU„s Not Unix”的递归缩写。在1983年
9月27日由Richard Stallman公开发起GNU计划,
TM
16
数据定义伪指令
(1)DATA 定义此标号是程序内的数据区
例: Thumb-fn AREA example ,CODE ; ; MOV pc ,lr
Thumb-Data
DATA
DCB 1,3,4
TM
17
数据定义伪指令
(2)DCB或“=”
功能:分配一个或多个字节.
(3)DCD或“&” 功能:分配一个或多个字,从4个字节边界开始. (4)DCW 功能:分配一个或多个半字以半字边界开始的内存 区域.

arm伪指令

arm伪指令

一、变量定义伪指令1、GBLA 变量名;定义全局数字变量并初始化为02、GBLS 变量名;定义全局字符串变量并初始化为空串3、GBLL 变量名;全局逻辑变量,初始false4、变量名SETA 数值:数字变量赋值5、变量名SETS 字符串;字符串变量赋值6、变量名SETL 逻辑{true/flase};7、LCLA 变量名;局部数字变量初始化08、LCLS 变量名;9、LCLL 变量名;10、MACRO MEND;定义宏11、$;变量替换二、数据定义伪指令1、标号DCB 表达式;分配一个字节的存储单元并使用指定数据初始化2、标号DCW/DCWU 表达式;分配连续的半字(2字节)存储单元并使用指定数据初始化3、标号DCD 表达式;分配连续的字存储单元并使用指定数据初始化4、标号DCQ/DCQU 表达式;分配连续的8字节存储单元并使用指定数据初始化5、标号DCFS/DCFSU 表达式;为单精度浮点数分配连续的字存储单元并使用指定数据初始化6、标号DCFD/DCFDU 表达式;为双精度浮点数分配连续的字存储单元并使用指定数据初始化7、SPACE 表达式;分配一块连续的存储单元并初始化为08、MAP 表达式[,基址寄存器];用于定义一个结构化的内存表的首地址,可以用^代替9、{Lable}FIELD 表达式;分配一块连续的存储单元,可以使用#代替,用于定义一个结构体的内存表数据域三、控制伪指令1、IF、ELSE、ENDIF;条件编译指令2、WHILE、WEND;条件循环执行指令3、MACRO、MEND;宏指令4、MEXIT;宏定义中跳转指令四、地址加载伪指令1、ADR;小范围的地址读取伪指令2、ADRL;中等范围的地址读取伪指令3、LDR;大范围的地址读取伪指令4、NOP;空操作伪指令五、声明引用伪指令1、名称EQU 表达式{,类型};定义字符名称指令2、EXPORT(或GLOBLE)标号{[WEAK]};声明全局标号指令3、IMPORT 标号{[WEAK]};在其他源文件中定义标号的指令4、EXTERN 标号{[WEAK]};5、GET(或INCLUDE) 文件名;包含源文件指令6、INCBIN 文件名;包含目标文件或数据文件包指令7、名称RN 表达式;定义寄存器别名指令8、{名称} ROUT;定义局部变量的作用范围指令六、段域伪指令1、AREA 段名属性1,属性2,……2、ALIGN {表达式{,偏移量}};对其指令3、CODE16(CODE32);指示指令序列类型指令。

ARM汇编伪指令

ARM汇编伪指令

ARM汇编伪指令在ARM汇编语言源程序中有些特殊助记符,它们没有相对应的操作码或者机器码,通常称为伪指令,它们所完成的操作称为伪操作。

伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,由汇编程序在源程序的汇编期间进行处理,仅在汇编过程中起作用。

在ARM的汇编程序中,有以下几种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令以及其他伪指令。

一、符号定义伪指令作用:用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等。

符号定义有如下几种伪指令:用于定义局部变量的LCLA、LCLL和LCLS。

用于定义全局变量的GBLA、GBLL和GBLS。

用于对变量赋值的SETA、SETL和SETS。

为通用寄存器列表定义名称的RLIST。

(1)LCLA、LCLL和LCLS格式:LCLA/LCLL/LCLS 局部变量名说明:LCLA、LCLL和LCLS伪指令用于定义一个汇编程序中的局部变量并初始化。

其中:LCLA定义一个局部的数字变量,初始化为0。

LCLL定义一个局部的逻辑变量,初始化为F。

LCLS定义一个局部的字符串变量,初始化为空串。

这3条伪指令用于声明局部变量,在其局部作用范围内变量名必须惟一,例如在宏内。

例:LCLA num1 ;定义一个局部数字变量,变量名为num1 LCLL I2 ;定义一个逻辑变量,变量名为I2LCLS str3 ;定义一个字符串变量,变量名为str3num1 SETA 0xabcd ;将该变量赋值为0xabcdI2 SETL {FALSE} ;将该变量赋值为真str3 SETS “HELLO”;将该变量赋值为“HELLO”(2)GBLA、GBLL和GBLS格式:GBLA/GBLL/GBLS 变量名说明:GBLA、GBLL和GBLS伪操作定义一个汇编程序中的全局变量并初始化。

其中:GBLA定义一个全局数字变量,并初始化为0。

GBLL定义一个全局逻辑变量,并初始化为F。

介绍12个ARM常用的伪指令

介绍12个ARM常用的伪指令

介绍12个ARM常用的伪指令1、AREAAREA 伪指令用于定义一个代码段或数据段。

语法格式:AREA 段名属性1 ,属性2 ,……其中,段名若以数字开头,则该段名需用“ | ” 括起来,如|1_te st| 。

属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。

常用的属性如下:— CODE 属性:用于定义代码段,默认为READonLY 。

— DATA 属性:用于定义数据段,默认为READWRITE 。

— READonLY 属性:指定本段为只读,代码段默认为READonLY 。

— READWRITE 属性:指定本段为可读可写,数据段的默认属性为R EADWRITE 。

— ALIGN 属性:使用方式为ALIGN表达式。

在默认时,ELF (可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为0 ~31 ,相应的对齐方式为表达式2次方。

— COMMON 属性:该属性定义一个通用的段,不包含任何的用户代码和数据。

各源文件中同名的COMMON段共享同一段存储单元。

一个汇编语言程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段。

使用示例:AREA Init ,CODE ,READONLY该伪指令定义了一个代码段,段名为Init ,属性为只读2、ALIGNALIGN 伪指令可通过添加填充字节的方式,使当前位置满足一定的对其方式。

语法格式:ALIGN { 表达式{ ,偏移量}}其中,表达式的值用于指定对齐方式,可能的取值为2的幂,如1 、2 、4 、8 、16 等。

若未指定表达式,则将当前位置对齐到下一个字的位置。

偏移量也为一个数字表达式,若使用该字段,则当前位置的对齐方式为:2 的表达式次幂+偏移量。

使用示例:AREA Init ,CODE ,READonLY ,ALIEN =3 ;指定后面的指令为8字节对齐。

指令序列END3、ENTRYENTRY 伪指令用于指定汇编程序的入口点。

arm伪操作-伪指令-宏指令

arm伪操作-伪指令-宏指令

可通过下面的 指令访问数据结构中的信息: LDR R0, b ;LDR R0, Datastruc+4
例:判断当前内存的使用情况是否超过程序 分配的可用内存的方法。
startofmem EQU 1000 ;分配内存首地址 endofmem EQU 2000 ;分配内存末地址 MAP startofmem ;内部首地址为startofmem a FIELD 4 ;字段a长度为4,相对位置为0 b FIELD 4 ;字段b长度为4,相对位置为4 x FIELD 8 ;字段x长度为8,相对位置为8 y FIELD 8 ;字段y长度为8,相对位置为16 s FIELD max ;字段s长度为max,相对位置为24 endofstru ASSERT FIELD 0 ;endofstru用于检查内存是否越界
1.1.1两种常见的ARM编译开发环境
ADS/SDT IDE开发环境:它由ARM公司开 发,使用了CodeWarrior公司的编译器; EmbestIDE开发环境:集成了GNU开发工具 的IDE开发环境,由GNU的汇编器as、交叉 编译器gcc、和链接器ld等组成。 这两种开发环境的编译器都完全支持ARM 指令集,但伪指令不同,代码风格不同。
数据定义伪操作
LTORG:声明一个数据缓冲池的开始。 SPACE:分配一块内存单元,并用0初始化。 MAP:定义一个结构化的内存表的首地址。 FIELD:定义结构化内存表中的一个数据域。 DCB:分配一段字节内存单元,并初始化。 DCD、DCDU:分配一段字内存单元,并初始 化。
1、 LTORG 用于声明一个数据缓冲池(文字池)的开始。 语法格式:
LTORG 例:start BL func …… func LDR R1,=0x8000 …… MOV PC,LR LTORG Data SPACE 4200 END 默认数据缓冲池为空

ARM GNU 汇编伪指令简介,编译器和开发工具,用GNU工具开发基于ARM的嵌入式系统

ARM GNU 汇编伪指令简介,编译器和开发工具,用GNU工具开发基于ARM的嵌入式系统

ARM GNU 汇编伪指令简介1 ARM GNU 汇编伪指令简介(1)abort.abort 停止汇编(2)align.align absexpr1,absexpr2以某种对齐方式,在未使用的存储区域填充值. 第一个值表示对齐方式,4, 8,16或32. 第二个表达式值表示填充的值(3)if...else...endif.if.else.endif: 支持条件预编译(4)include.include "file": 包含指定的头文件, 可以把一个汇编常量定义放在头文件中(5)comm.comm symbol, length:在bss段申请一段命名空间,该段空间的名称叫symbol, 长度为length. Ld连接器在连接会为它留出空间(6)data.data subsection: 说明接下来的定义归属于subsection数据段(7)equ.equ symbol, expression: 把某一个符号(symbol)定义成某一个值(expression).该指令并不分配空间(8)global.global symbol: 定义一个全局符号, 通常是为ld使用(9)ascii.ascii "string": 定义一个字符串并为之分配空间(10)byte.byte expressions: 定义一个字节, 并为之分配空间(11)short.short expressions: 定义一个短整型, 并为之分配空间(12)int.int expressions: 定义一个整型,并为之分配空间(13)long.long expressions: 定义一个长整型, 并为之分配空间(14)word.word expressions: 定义一个字,并为之分配空间, 4 bytes(15)macro/endm.macro: 定义一段宏代码, .macro表示代码的开始, .endm表示代码的结束, .exitm 跳出宏, 示例如下:.macro SHIFTLEFT a, b.if \b < 0mov \a, \a, ASR #-\b.exitm.endifmov \a, \a, LSL #\b.endm(16)reqname .req register name: 为寄存器定义一个别名(17)code.code [16|32]: 指定指令代码产生的长度, 16表示Thumb指令, 32表示ARM指令(18)ltorg.ltorg: 表示当前往下的定义在归于当前段,并为之分配空间2 ARM GNU专有符号(1)@ 表示注释从当前位置到行尾的字符.(2)# 注释掉一整行.(3); 新行分隔符.3 操作码(1)NOP: nop 空操作, 相当于MOV r0, r0(2)LDR: ldr <register> , =<expression> 相当于PC寄存器或其它寄存器的长转移(3)ADR: adr <register> <label> 相于PC寄存器或其它寄存器的小范围转移(4)ADRL: adrl <register> <label> 相于PC寄存器或其寄存器的中范围转移GNU的编译器和开发工具GNU提供的编译工具包括汇编器as、C编译器gcc、C++编译器g++、连接器ld和二进制转换工具objcopy。

ARM·汇编伪指令

ARM·汇编伪指令

ARM·汇编伪指令在ARM 汇编程序中,有如下几种伪指令*符号定义伪指令*数据定义伪指令*汇编控制伪指令*信息报告伪指令*宏指令以及其他伪指令【符号定义伪指令】定义局部变量LCLA,LCLL,LCLS 定义全局变量GBLA,GBLL,GBLS对变量赋值SETA,SETL,SETS【数据定义伪指令】DCBDCW/DCWUDCD/DCDUDCQ/DCDUDCFS/DCFSUDCFD/DCFDUSPACEF IELDMAP*DCB 表达式用于分配一片连续的字节*DCW/DCWU 表达式用于分配一片连续的半字*DCD/DCDU 表达式用于分配一篇连续的字*DCQ/DCQU 表达式用于分配连续的8 个字节*DCFD/DCFDU 表达式用于为双精度浮点数分配一片连续的字存储单元*DCFS/DCFSU 表达式用于为单精度浮点数分配一片连续的字存储单元*SPACE 表达式用于分配一片连续的存储区域并初始化为0,表达式是要分配的字节数*MAP FILEDMAP 定义一个结构化的内存表的首地址[MAP 0x100, R0] 首地址0x100+R0FILED 定义一个结构化内存表中的数据域[MAP 0x30000000A FILED 4B FILED 4C FILED 4] 【汇编控制伪指令】*MACRO MEND 宏名*IF---ELSE---ENDIF [ | ]*WHILE---- WEND*NEXIT 从宏中退出【一些其他的伪指令】*ASSERT 逻辑表达式必须满足这一条件才可以进行编译*ALIGN [表达式[,偏移量]]AREA Init, CODE, READONLY, ALIGN=3*AREA 段名属性DATA 数据段默认READWRITECODE 代码段默认READONLY*NOINIT 内存单元初始化0*ALIGN*COMMON 通用段(不包括数据段和代码段)*ENTRY*END*EQU (NUM EQU 100)(相当于c 语言中的#define)*EXPORT 声明一个全局变量IMPORT IMPORT Main (引用Main 变量,但Main 不是在这个程序中定义的)EXPORT 和IMPORT 一样,但是源文件中若没有引用,则该标号。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在线学习好工作/
ARM常用的伪指令
AREA就是常见的伪指令之一。

AREA是声明区域段,数据区,代码区等等。

什么是数据段呢?数据段是来定义数据结构体的。

格式是AREA
test,CODE,READONLY。

还有指令CODE16、CODE32,格式就直接写上就是。

目的是声明以下是32位还是16位指令,注意不是切换arm和thunmb模式。

如果是16位,那就是thunmb指令。

操作:这是之前的,如果在这里做一个声明,CODE32,也就是表示ARM指令。

如果这里CODE16,就表示一下代码是16位指令,也就是thunmb指令,
也就是说在编译的时候会按照thunmb指令来进行汇编。

大家注意一点,在这里通过这个切换,并不会改变处理器的运行的处理模式。

不会把ARM指令状态切换为thunmb指令状态。

这个切换是在状态寄存器里面去切换T。

这个地方只是告诉汇编器而已,所以并不会更换运行时候的指令切换方式。

entry:entry伪指令用于指定汇编程序的入口点。

在一个完整的汇编程序中至少要一个entry(也可以多个,当有多个entry时,程序的真正入口点由链接器指定),但在一源文件里最多只能有一个entry(可以没有)。

END:END伪指令用于通知编译器已经到了源程序的结尾。

EQU:EQU伪指令用于为程序中的常量、标号等定义一个等效的字符名称,类似于c语言的#define。

格式是UARTLCON0EQU.0x3FFD00。

比方说:SUNDYCON1
EQU0x3200000,我们定义了一个常量,这个常量可以拿来直接用。

这里注意一点,我们编译先看一下。

这里就出错了。

未知的操作代码。

这是怎么回事?汇编这一块,跟自己的汇编器,编译器是有关系的,有时跟ID的环境都有关。

在ARM里面,特别ADS里面,他对是否顶头,和Tab要求非常严格。

因为我们这里不是一个标准指令,它会看第一个是什么操作码,这里操作码是不识别的,所以这里就出错认不出来。

这是应该怎样做呢?首先把SUNDY顶头,就可以知道只是个伪指令。

EXPOET:export伪指令用于程序中声明一个全局的标号,该标号可在其他的文件中引用。

export可用GLOBAL代替。

标号在程序中区分大小写,weak选项声明其他的同名标号优先于该标号被引用。

IMPORT相当于静态引用。

IMPORT伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号都会被加入到当前源文件的符号表中。

EXTERN相当于动态引用。

EXTERN伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前的源文件中引用,如果当前源文件实际未引用该标号,该标号就不会被加到当前源文件的符号表中。

GET相当于引用文件。

GET伪指令用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。

可以使用INCLUDE代替GET。

RN:RN伪指令用于给一个寄存器定义一个别名。

采用这种方式可以方便程序员记忆该寄存器的功能。

其中,名称为给寄存器定义的别名,表达式为寄存器的编码。

RN的格式:name RN Rn。

鉴于这种方式,这里应该顶头。

比方说这里给一个别名SRegister,SRegister RN R0。

再用就可以MOV SRegjister#0x12。

这样可以通过SRegister来代替R0寄存器。

这就是关于常用的伪指令的符号。

这些都很容易理解,就只有EQU,其实EQU只要记住类似于define就可以了。

汇编语言程序中常见的符号。

之前学过的有很多条件操作符号,比如,EQ,LT,GT,NE等等,用这些东西进行中一些数据运算。

有时需要把某一个值临时存到一个临时的变量里,然后回过头在用到这个变量。

以前是没有办法的,只能去操作,定一些值,把这些值存储到临时寄存器里面,然后用完再把它取出来。

这样很麻烦。

来源:麦子学院
原文链接:/wiki/arm/common/。

相关文档
最新文档