ARM常用的指令符号

合集下载

常用ARM指令

常用ARM指令

常用ARM指令1、内存访问指令基本指令:LDR:memory -> register (memory包括映射到内存空间的非通用寄存器)STR:register -> memory语法:op{cond }{B}{T} Rd , [Rn ]op{cond }{B} Rd , [Rn , FlexOffset ]{!} op{cond }{B} Rd , labelop{cond }{B}{T} Rd , [Rn ], F lexOffsetop:基本指令,如LDR、STRcond:条件执行后缀B:字节操作后缀T:用户指令后缀Rd:源寄存器,对于LDR指令,Rd将保存从memory 中读取的数值;对于STR指令,Rd保存着将写入memory的数值Rn:指针寄存器FlexOffset:偏移量例子:ldr r0, [r1] ;r1作为指针,该指针指向的数存入r0str r0, [r1, #4] ;r1+4作为指针,r0的值存入该地址str r0, [r1, #4]! ;同上,并且r1 = r1 + 4 ldr r1, =0x08100000 ;立即数0x08100000存到r1ldr r1, [r2], #4 ;r2+4作为指针,指向的值存入r1,并且r2=r2+4【label的使用】addr1 ;定义一个名为“addr1”的label,addr1 = 当前地址dcd 0 ;在当前地址出定义一个32bit 的变量~~~ldr r1, label1 ;r1 = addr1,r1即可以作为var1的指针ldr r0, [r1]add r0, r0, #1str r0, [r1] ;变量var1的值加1【FlexOffset的使用】FlexOffset可以是立即数,也可以是寄存器,还可以是简单的表达式2、多字节存取指令(常用于堆栈操作)基本指令:LDM:memory ――> 多个寄存器STM:多个寄存器――> memory语法:op{cond }mode Rn{!}, reglist {^}mode:指针更新模式,对应于不同类型的栈。

ARM中常用的汇编指令

ARM中常用的汇编指令

ARM 中常⽤的汇编指令1 处理器内部数据传输指令MSR & MRS⽤于在状态寄存器和通⽤寄存器之间传送数据MRS: 状态寄存器到通⽤寄存器的传送指令。

({R0-R12} <== CPSR,SPSR)MSR: 通⽤寄存器到状态寄存器的传送指令。

MRS:(CPSR,SPSR==>{R0-R12})MOVMOV 指令⽤于将数据从⼀个寄存器拷贝到另外⼀个寄存器,或者将⼀个⽴即数传递到寄存器⾥⾯,使⽤⽰例如下:2 存储器访问指令ARM 不能直接访问存储器,⽐如 RAM 中的数据,⼀般先将要配置的值写⼊到 Rx(x=0~12)寄存器中,然后借助存储器访问指令将 Rx 中的数据写⼊到寄存器中。

指令描述LDR Rd, [Rn , #offset]从存储器 Rn+offset 的位置读取数据存放到 Rd 中STR Rd, [Rn, #offset]将 Rd 中的数据写⼊到存储器中的 Rn+offset 位置LDR 指令LDR 主要⽤于从存储加载数据到寄存器 Rx 中, LDR 也可以将⼀个⽴即数加载到寄存器 Rx中, LDR 加载⽴即数的时候要使⽤“=”,⽽不是“#”。

在嵌⼊式开发中, LDR 最常⽤的就是读取 CPU 的寄存器值。

上述代码就是读取寄存器中的值,读取到的寄存器值保存在 R1 寄存器中,上⾯代码中 offset 是 0,也就是没有⽤到 offset。

STR 指令LDR 是从存储器读取数据, STR 就是将数据写⼊到存储器中LDR 和 STR 都是按照字进⾏读取和写⼊的,也就是操作的 32 位数据,如果要按照字节、半字进⾏操作的话可以在指令“LDR”后⾯加上B 或 H,⽐如按字节操作的指令就是 LDRB 和STRB,按半字操作的指令就是 LDRH 和 STRH。

MRS R0, CPSR @ 将特殊寄存器 CPSR ⾥⾯的数据传递给 R0,即R0=CPSR1MSR CPSR , R0 @ 将 R0 中的数据复制到 CPSR 中,即 CPSR =R01MOV R0, R1 @ 将寄存器 R1 中的数据传递给 R0,即 R0=R1MOV R0, #0X12 @ 将⽴即数 0X12 传递给 R0 寄存器,即 R0=0X1212LDR R0, =0X0209C004 @ 将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004LDR R1, [R0] @ 读取地址 0X0209C004 中的数据到 R1 寄存器中12LDR R0, =0X0209C004 @ 将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004LDR R1, =0X20000002 @ R1 保存要写⼊到寄存器的值,即R1=0X20000002STR R1, [R0] @ 将 R1 中的值写⼊到 R0 中所保存的地址中1233 压栈和出栈指令我们通常会在 A 函数中调⽤ B 函数,当 B 函数执⾏完以后再回到 A 函数继续执⾏。

常用ARM指令

常用ARM指令

常⽤ARM指令常⽤ARM指令1:数据处理指令 mov mvn MOV(MOVE)指令可完成从另⼀个寄存器、被移位的寄存器或将⼀个⽴即数加载到⽬的寄存器MOV R0,R1;R1的值传到R0MOV R3,#3 ;把常数3传给R3MVN( MOVE Negative)取反后再传值,⽐MOV多了⼀步取反MVN R0, #0 ;把0取反(即-1)传给R0MVN R1,R2 ;把R2的值取反传给R1 算术指令 add sub rsb adc sbc rsc ADD加法指令 ADD R0,R1,R2; R0=R1+R2 ADD R0,R1,#3 ;R0=R1+3 ADC带进位加法指令,即除了加两个数以外,还要把CPSR的C值也要带进来 通常⽤于⼤数(超过32Bit整数)相加,这时单⽤ADD不能处理,必须折成两步,其中⼀步⽤ADC. 以下是做64Bit的加法 ADDS R0,R1,R2; R0=R1+R2,ADDS中S表⽰把进位结果写⼊CPSR ADC R5,R3,R4 ;R5=R3+R4+C 逻辑指令 and orr eor bic AND位与指令 AND R0,R1,R2; R0=R1 & R2 AND R0,R1,#0xFF ;R0=R1 & 0xFF ORR位或指令 ORR R0,R1,R2; R0=R1 | R2 ORR R0,R1,#0xFF ;R0=R1 | 0xFF TST测试某⼀位是否为1,并把结果写⼊CPSR,供下⼀句使⽤ TST R1,#0xffe; 等同于if(R1 & 0xffe) TST R1,#%1;测试最低位是否为1,%表⽰⼆进制 BIC清位操作 BIC R0,R0,#0xF;等同于 R0 &=~(0xF) BIC R0,R0,#%1011;该指令清除 R0 中的位 0 1 3,其余的位保持; %表⽰是⼆进制,0x表⽰⼗六进制 ⽐较指令 cmp cmn tst teq CMP⽐较两个操作数,并把结果存⼊CPSR供下⼀句语句使⽤ CMP R0,R1; ⽐较R0,R1 乘法指令 mvl mla umull umlal smull small MUL R0,R1,R2 ;R0 = R1 × R2MULS R0,R1,R2 ;R0 = R1 × R2,同时设置CPSR中的相关条件标志位 MLA R0,R1,R2,R3 ;R0 = R1 × R2 + R3MLAS R0× R2 + R3,同时设置CPSR中的相关条件标志位 SMULL R0,R1,R2,R3 ;R0 = (R2 × R3)的低32位 ;R1 = (R2 × R3)的⾼32位 加载/存储指令 LDR,STR LDR R0,[R1]; R1的值当成地址,再从这个地址装⼊数据到R0 (R0=*R1) LDR R1,=0x30008000 ; 把地址0x30008000的值装⼊到R1中 STR R0,[R1] ; 把R0的值,存⼊到R1对应地址空间上(*R1 = R0)。

arm 汇编 指令

arm 汇编 指令

arm 汇编指令ARM汇编指令是一种用于编写ARM处理器程序的语言。

ARM处理器广泛应用于嵌入式系统和移动设备等领域。

ARM汇编指令与x86汇编指令有所不同,它基于RISC(精简指令集计算机)架构。

下面是一些基本的ARM汇编指令:1. 数据传输指令:用于在寄存器之间传输数据。

例如:- mov:将数据从一个寄存器传输到另一个寄存器。

- ldr:将数据从内存传输到寄存器。

2. 算术指令:用于执行加法、减法、乘法和除法等操作。

例如:- add:加法操作。

- sub:减法操作。

- mull:乘法操作。

- div:除法操作。

3. 逻辑指令:用于执行逻辑操作,如与、或、非等。

例如:- and:与操作。

- or:或操作。

- xor:异或操作。

4. 移位指令:用于对数据进行左移、右移或无符号右移。

例如:- lsr:无符号右移。

- asr:带符号右移。

- ror:循环右移。

5. 比较指令:用于比较两个寄存器的值。

例如:- cmp:比较两个寄存器的值,若相等则返回0,否则返回1。

6. 跳转指令:用于改变程序的执行流程。

例如:- b:条件跳转。

- bl:无条件跳转。

- bx:带状态跳转。

7. 循环指令:用于实现循环操作。

例如:- loop:内部循环。

- ldp:外部循环。

8. 调用指令:用于实现函数调用。

例如:- blx:带状态调用。

- bx:不带状态调用。

9. 系统调用指令:用于实现与操作系统交互的功能。

例如:- swi:执行系统调用。

10. 存储器访问指令:用于访问内存数据。

例如:- str:将数据存储到内存。

- ldr:从内存中加载数据。

以上仅为ARM汇编指令的一部分,实际上,ARM汇编指令还有很多其他功能。

为了更好地理解和使用ARM汇编指令,可以参考相关的教程和手册,并进行实际操作。

ARM指令集

ARM指令集

ARM指令集6种类型(53种主要助记符):数据处理指令(22种主要助记符)跳转指令(4种主要助记符)Load/Store指令(16种主要助记符)程序状态寄存器指令(2种主要助记符)协处理器指令(5种主要助记符)软件中断指令(2种主要助记符)数据处理指令数据处理指令大致可分为3类:数据传送指令;算术逻辑运算指令;乘法指令比较指令。

数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。

所有ARM数据处理指令均可选择使用S后缀,并影响状态标志。

数据处理指令1MOV 数据传送指令格式:MOV{<cond>}{S} <Rd>,<op1>;功能:Rd=op1op1可以是寄存器、被移位的寄存器或立即数。

例如:MOV R0,#5 ;R0=5MOV R0,R1 ;R0=R1MOV R0,R1,LSL#5 ;R0=R1左移5位数据处理指令22.MVN 数据取反传送指令格式:MVN{<cond>}{S} <Rd>,<op1>;功能:将op1表示的值传送到目的寄存器Rd中,但该值在传送前被按位取反,即Rd=!op1;op1可以是寄存器、被移位的寄存器或立即数。

例如:MVN R0,#0 ;R0=-1数据处理指令33.ADD 加法指令格式:ADD{<cond>}{S} <Rd>,<Rn>,<op2>;功能:Rd=Rn+op2op2可以是寄存器,被移位的寄存器或立即数。

例如:ADD R0,R1,#5 ;R0=R1+5ADD R0,R1,R2 ;R0=R1+R2ADD R0,R1,R2,LSL#5 ;R0=R1+R2左移5位数据处理指令44.ADC 带进位加法指令格式:ADC{<cond>}{S} <Rd>,<Rn>,<op2>;功能:Rd=Rn+op2+carryop2可以是寄存器、被移位的寄存器或立即数;carry为进位标志值。

常用的ARM汇编指令

常用的ARM汇编指令

常⽤的ARM汇编指令转⾃:https:///zb861359/article/details/81027021?utm_source=app1、 IMPORT和EXPORTIMPORT ,定义表⽰这是⼀个外部变量的标号,不是在本程序定义的EXPORT ,表⽰本程序⾥⾯⽤到的变量提供给其他模块调⽤的。

以上两个在汇编和C语⾔混合编程的时候⽤到。

2、AREA语法格式:AREA 段名属性1 ,属性2 ,……AREA伪指令⽤于定义⼀个代码段或数据段。

其中,段名若以数字开头,则该段名需⽤“|”括起来,如:|1_test|。

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

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

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

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

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

— ALIGN 属性:使⽤⽅式为ALIGN表达式。

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

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

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

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

使⽤⽰例:AREA Init ,CODE ,READONLY ; 该伪指令定义了⼀个代码段,段名为Init ,属性为只读。

3、LDR、LDRB、LDRHARM微处理器⽀持加载/存储指令⽤于在寄存器和存储器之间传送数据,加载指令⽤于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。

常⽤的加载存储指令如下:— LDR 字数据加载指令— LDRB 字节数据加载指令— LDRH 半字数据加载指令1) LDR指令有两种⽤法:a、ldr加载指令LDR指令的格式为:LDR{条件} ⽬的寄存器,<存储器地址>LDR指令⽤亍从存储器中将⼀个32位的字数据传送到⽬的寄存器中。

实用ARM指令全

实用ARM指令全

在讲指令之前,先简单地介绍一下Cortex-M3 中支持的算术与逻辑标志。

本书在后面还会展开论述。

它们是:APSR 中的5 个标志位4.2.1 分类指令表表4.2 16位数据操作指令表4.3 16位转移指令IT If-Then表4.4 16位存储器数据传送指令16 数据传送指令没有任何新内容,因为它们是Thumb 指令,在v4T 时就已经定格了——译注表4.5 其它16位指令表4.6 32位数据操作指令UXTH 半字被无符号扩展到32 位(高16 位清0——译注)表4.7 32位存储器数据传送指令表4.8 32位转移指令表4.9 其它32位指令4.2.2 未支持的指令有若干条Thumb 指令没有得到Cortex-M3 的支持,下表列出了未被支持的指令,以及不支持的原因。

表4.10 因为不再是传统的架构,导致有些指令已失去意义未支持的指令以前的功能BLX #im 在使用立即数做操作数时,BLX 总是要切入ARM 状态。

因为Cortex-M3 只在Thumb 态下运行,故以此指令为代表的,凡是试图切入ARM 态的操作,都将引发一个用法fault。

SETEND由ARMv6 引入的,在运行时改变处理器端设置的指令(大端或小端)。

因为Cortex-M3 不支持动态端的功能,所以此指令也将引发faultCM3 也不支持有少量在ARMv7-M 中列出的指令。

比如,ARMv7M 支持Thumb2 的协处理器指令,但是CM3 却不能挂协处理器。

表4.11 列出了这些与协处理器相关的指令。

如果试图执行它们,则将引发用法fault(NVIC 中的NOCP (No CoProcessor)标志置位)。

表4.11 不支持的协处理器相关指令未支持的指令以前的功能MCR 把通用寄存器的值传送到协处理器的寄存器中MCR2把通用寄存器的值传送到协处理器的寄存器中MCRR 把通用寄存器的值传送到协处理器的寄存器中,一次操作两个MRC把协处理器寄存器的值传送到通用寄存器中MRC2 把协处理器寄存器的值传送到通用寄存器中MRRC把协处理器寄存器的值传送到通用寄存器中,一次操作两个LDC 把某个连续地址空间中的一串数值传送至协处理器中STC从协处理器中传送一串数值到地址连续的一段地址空间中还有一个是改变处理器状态指令(CPS),它的一些用法也不再支持。

ARM指令大全

ARM指令大全

ARM指令集详解ARM可以用两套指令集:ARM指令集和Thumb指令集。

本文介绍ARM指令集。

在介绍ARM指令集之前,先介绍指令的格式。

1 指令格式(1)基本格式<opcode>{<cond>}{S} <Rd>,<Rn>{,<opcode2>}其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须的,而{<cond>}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)。

opcode 指令助记符,如LDR,STR 等cond 执行条件,如EQ,NE 等S 是否影响CPSR 寄存器的值,书写时影响CPSR,否则不影响Rd 目标寄存器Rn 第一个操作数的寄存器operand2 第二个操作数指令格式举例如下:LDR R0,[R1] ;读取R1 地址上的存储器单元内容,执行条件ALBEQ DATAEVEN ;跳转指令,执行条件EQ,即相等跳转到DATAEVENADDS R1,R1,#1 ;加法指令,R1+1=R1 影响CPSR 寄存器,带有SSUBNES R1,R1,#0xD;条件执行减法运算(NE),R1-0xD=>R1,影响CPSR 寄存器,带有S(2)第2个操作数在ARM 指令中,灵活的使用第2个操作数能提高代码效率,第2个操作数的形式如下:#immed_8r常数表达式,该常数必须对应8 位位图,即常数是由一个8 位的常数循环移位偶数位得到。

合法常量0x3FC、0、0xF0000000、200、0xF0000001等都是合法常量。

非法常量0x1FE、511、0xFFFF、0x1010、0xF0000010等都是非法常量。

常数表达式应用举例如下:MOV R0,#1 ;R0=1AND R1,R2,#0x0F ;R2 与0x0F,结果保存在R1LDR R0,[R1],#-4 ;读取R1 地址上的存储器单元内容,且R1=R1-4Rm寄存器方式,在寄存器方式下操作数即为寄存器的数值。

arm指令

arm指令

一、加减法指令:1、MOV(move):数据传送指令2、MVN(move negative):数据取反传送指令3、ADD(add):加法4、ADC(add with carry):带进位加法5、SUB(subtract):减法6、RSB(reverse subtract):反向减法7、SBC(subtract with carry):带借位的减法SBC{<cond>}{S} <Rd>,<Rn>,<op2> ;Rd=Rn-op2-carry8、RSC(reverse subtract with carry):带借位的反向减法RSC{<cond>}{S} <Rd>,<Rn>,<op3> ;Rd= op3-Rn-!carry二、逻辑指令1、AND:逻辑与2、ORR(logical or):逻辑或3、EOR(exclusive or):逻辑异或4、BIC(bit clear):位清零5、CLZ(count leading zeros):位计数。

CLZ{<cond>} <Rd>,<Rm>;计算存储在Rm寄存器中各位为0的总个数。

三、乘法指令1、MUL(multiply):32位乘法2、MLA(multiply accumulate):32位乘加MLA{<cond>} {S} <Rd>,<Rn>,<op2>,<op3>;3、SMULL(signed multiplication long):64位有符号数乘法SMULL {<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>;Rdh Rdl=Rn×op2,结果的高32位存入Rdh,低32位存入Rdl。

常用ARM指令

常用ARM指令

常用ARM指令及汇编包括1、ARM处理器寻址方式2、指令集3、伪指令=========================================================== ====================ARM处理器寻址方式1、寄存器寻址:操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值操作MOV R1, R2 ;R2->R1SUB R0, R1,R2 ;R1-R2 -> R02、立即寻址:立即寻址指令中的操作码字段后面的地址码部分就是操作数本身,也就是说,数据就包含在指令当中,取出指令就取出了可以立即使用的操作数SUBS R0,R0,#1 ;R0-1 -> R0MOV R0,#0xff00 ;0xff00 -> R0注:立即数要以"#"为前缀,表示16进制数值时以"0x"表示3、寄存器偏移寻址:是ARM指令集特有的寻址方式,当第2操作数是寄存器偏移方式时,第2个寄存器操作数在与第1个操作数结合之前选择进行移位操作MOV R0,R2,LSL #3 ;R2的值左移3位,结果存入R0,即R0 = R2 * 8ANDS R1,R1,R2,LSL R3 ;R2的值左移R3位,然后和R1相与操作,结果放入R1寄存器偏移寻址可采用的移位操作如下(1)、LSL逻辑左移,寄存器中字的低端空出补0(2)、LSR逻辑右移,寄存器中字的高端空出补0(3)、ASR算术右移,移位中保持符号位不变,即如果源操作数为正数,字高端空出补0,否则补1(4)、ROR循环右移,由字的低端移出的位填入高端空出的位(5)、RRX,操作数右移一位,左侧空位由CPSR的C填充4、寄存器间接寻址:寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需要的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针LDR R1,[R2] ;将R2中的数值作为地址,取出此地址中的数据保存在R1中SWP R1,R1,[R2] ;将R2中的数值作为地址,取出此地址中的数值与R1中的值交换5、基址寻址:将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址,基址寻址用于访问基址附近的存储单元,常用于查表,数组操作,功能部件寄存器访问等。

ARM语法

ARM语法

ARM基础语法By:陈殷齐ARM工作模式:ARM寄存器:CPSR寄存器:基本指令格式:<opcode>{<cond>}{s} <Rd>,<Rn>,{oprand2}Opcode:助记符Cond:条件码S:影响标志位Oprand2:第二操作数,必须为常数表达式或#immed_8r(通过循环右移偶数位可得的8位数)寻址方式:1、寄存器寻址:数据存放在寄存器中MOV R1,R2;(将R2的数据存放到R1中)SUB R1,R2,R3;(将R2-R3装入R1中)2、立即数寻址:数据包含在指令中MOV R0,#0XFF;(将OXFF装入R0中)SUB R0,R1,#1;(R1-1装入R0中)3、寄存器移位寻址:MOV R0,R2,LSL,#3;(将R2左移3位装入R0中)4、寄存器间接寻址:寄存器给出操作数地址码(基址)LDR R2,[R1];(将R1所存地址中的操作数装入R2)5、基址加偏址(前变址模式/不改基址的寄存器值):基址加偏址:LDR R1,[R3,#0X0C];(R3+OX0C的地址里操作数加载到R1)偏置为寄存器:LDR R1,[R2,R3];(R3+R2的地址里操作数加载到R1)加上位移操作:LDR R1,[R2,R3,LSL,#2];(R3左移2位加上R2的地址加载到R1) 后索引方式(改变基址值)LDR R0,[R1],#4;(R1地址的操作数装入R1之后,R1=R1加4)自动变址:LDR R0,[R1,#2]! (R1+2后的地址值里的操作数装入R0,R1=R1+2)LDR R0,[R1];将R1所存地址里的操作数装载到R0。

STR R0,[R1];将R0所存操作数加载到R1地址里的单元。

[]不能省略。

多寄存器操作:寄存器和内存交换指令:运算指令:跳转指令:(分支指令)BX 由寄存器的最后一位决定使用Thumb还是ARM指令。

(1为Thumb)例BX R1,into+1;跳转到into并切换为Thumb指令Label为标号,或地址。

ARM指令里几个特殊符号.

ARM指令里几个特殊符号.

ARM指令里几个特殊符号ARM指令里几个特殊符号类别:嵌入式系统作者:孙晓明, 华清远见嵌入式学院讲师。

总结一下ARM指令里几个特殊符号的意义特殊符号对应指令含义 = DCB分配一片连续的字节存储单元并用指定的数据初始化& DCD 分配一片连续的字存储单元并用指定的数据初始化%SPACE 分配一片连续的存储单元^ MAP 定义一个结构化内存表的首地址# FILED 定义一个结构化内存表的数据域(经常和MAP一起使用,一个定义起始地址,一个定义长度) EQU 为程序中的常量、标号等定义一个等效的字符名称,类似于C语言中的#define! 地址更新[相当于IF|相当于ELSE]相当于ENDIF 常见的数据定义伪指令有如下几种:— DCB 用于分配一片连续的字节存储单元并用指定的数据初始化。

— DCW ( DCWU )用于分配一片连续的半字存储单元并用指定的数据初始化。

— DCD ( DCDU )用于分配一片连续的字存储单元并用指定的数据初始化。

— DCFD( DCFDU )用于为双精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。

— DCFS ( DCFSU )用于为单精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。

— DCQ ( DCQU )用于分配一片以 8 字节为单位的连续的存储单元并用指定的数据初始化。

— SPACE 用于分配一片连续的存储单元— MAP 用于定义一个结构化的内存表首地址— FIELD 用于定义一个结构化的内存表的数据域1、 DCB 语法格式:标号 DCB 表达式 DCB 伪指令用于分配一片连续的字节存储单元并用伪指令中指定的表达式初始化。

其中,表达式可以为 0 ~ 255 的数字或字符串。

DCB 也可用“ = ” 代替。

使用示例:Str DCB “ This is atest ! ” ;分配一片连续的字节存储单元并初始化。

2、 DCW(或DCWU)语法格式:标号 DCW (或 DCWU )表达式 DCW (或 DCWU )伪指令用于分配一片连续的半字存储单元并用伪指令中指定的表达式初始化。

ARM常用汇编指令

ARM常用汇编指令

ARM常⽤汇编指令ARM 汇编程序的框架结构.section .data<初始化的数据>.section.bss<未初始化的数据>.section .text.global _start_start:<汇编代码>注意:⼀般是将上⾯结构进⾏简化.text.global _start_start:<汇编代码>寄存器操作指令:算术和逻辑指令:MOV :⽤于将⼀个寄存器或被移位寄存器或⼀个⽴即数移动到⽬的寄存器MOV r1 ,#8 (注意:#+数,表⽰⼀个⼗进制数,#+0b数,表⽰⼀个⼆进制数,#+0x数,表⽰⼀个⼗六进制数)MVN :对源操作数取反再赋值给⽬的寄存器MOV R1,#8SUB : 将⼀个数减去另外⼀个数再存放如寄存器SUB R1,#8,#6(8-6)ADD:将⼀个数加上另外⼀个数后将其存放如寄存器中ADD R1,R2,R3AND :逻辑与AND R1,R2,#0BIC:位清除BIC R1,R2,#0B1101将R2中所与#b1101中1所对应的位清零后的结果保存在R1中⽐较指令:CMP:顾名思义,⽤于⽐较两个数的⼤⼩,⽐较的结果不过会放在哪个通⽤寄存器中⽽是改在程序状态寄存器中的⼀个标志状态位CMP R1,#0B111010TST:测试位,将两个数按位与TST R1,R2分枝指令:B:条件跳转指令B [条件] 标号(注意:中括号在编写程序时不需要写出)BL :带连接的返回(类似于C语⾔中的⼦函数调⽤,调⽤⼦函数后返回主函数)移位指令:LSL:算术左移位MOV R1,R1,LSL#2(将R1中的数据左移两位存⼊R1)ROR:循环右移MOV R1,R1,#ROR 2(将R1中的数据循环右移后存⼊R1中)程序状态字访问指令:上⾯所学指令都不能对计算机中的程序状态字中的指令进⾏访问和读写,所以需要专⽤计算机指令来将程序状态字中的数据读写到通⽤寄存器中,在进⾏修改后写⼊MRS :将程序状态字中的数据搬出来MRS R0,CPRSMSR:将数据搬回程序状态字中MSR CPRS, R0存储器操作指令:LDR :将内存中的值导出到通⽤寄存器中LDR R0 ,#0XFF ‘STR:将同⽤寄存器中的数据写回到内存中STR R0 ,#0XFF伪指令:定义类伪指令:(1:编译时起作⽤2:起作⽤但是转化为其他机器指令).global 表明⼀个全局的符号 (注意GNU伪指令的特点在前⾯加上⼀个“.”).data 定义⼀个数据段.ascii 定义字符串的数据.byte 定义⼀个字节的数据.word 定义⼀个字的数据.data.equ (类似于C语⾔中定义宏).align ⽤于字节对齐操作类伪指令:nop:空操作指令 \具体实现:mov r0 ,r0ldr:⽤于将⼀个⼤于⼋位的数据装⼊寄存器注意:ldr r0 ,=0x1ff这⾥后⾯是⽤的等号这⾥和其他地⽅有些不⼀样协处理指令:(最重要是就是CP15)作⽤:系统控制mcr:mrc:mrc p15,0, r0 ,c0,c0,0注意:蓝⾊部分是由芯⽚⼿册的cp15寄存器访问列表给出的以访问不同寄存器。

ARM常用指令

ARM常用指令

ARM常用指令ARM常用指令一、数据传送指令1、 mov指令格式: mov{}{s} Rd,op操作: Rd = op;2、 mvn指令格式: mvn{}{s} Rd,op操作: Rd = ~op;二、算术指令1、 add加法指令格式: add{}{s} Rd,Rn,op操作: Rd = Rn + op;2、 adc带进位加法指令格式: adc{}{s} Rd,Rn,op操作: Rd = Rn + op + C;3、 sub减法指令格式: sub{}{s} Rd,Rn,op操作:Rd = Rn - op;4、 sbc带借位减法指令格式: sbc{}{s} Rd,Rn,op操作: Rd = Rn - op - (~C);5、 rsb逆向减法指令格式: rsb{}{s} Rd,Rn,op操作: Rd = op - Rn;6、 rsc带借位的逆向减法指令格式: rsc{}{s} Rd,Rn,op操作: Rd = op - Rn - (~C);三、移位1、 op立即数: #number //#label寄存器: Rm寄存器移位: Rm,<移位符> #number 或 Rm,<移位符> Rs 举例: mov r0,#100 //r0 = 100mov r0,r1 //r0 = r1mov r0,r1,lsr #1 //r0 = r1 >> 1mov r0,r1,lsr r2 //r0 = r1 >> r2add r0,r1,r2,lsr #1 //r0 = r1 + r2 >> 12、移位符lsl 逻辑左移 (unsigned)x << y说明:无符号左移补0lsr 逻辑右移 (unsigned)x >> y说明:无符号右移补0asl 算术左移 (signed)x << y说明:有符号左移补0注意:逻辑左移和算术左移结果一样asr 算术右移 (signed)x >> y说明:有符号右移正数补0,负数补1ror 循环右移 ((unsigned)x >> y) | (x << (32 - y))说明: x逻辑右移y | x逻辑左移 (32 - y)rrx 扩展循环右移 (C << 31) | ((unsigned)x >> 1) 说明:相当于33位循环右移注意:没有y,只移一位四、逻辑指令1、 and逻辑与指令格式: and{}{s} Rd,Rn,op操作: Rd = Rn & op;2、 orr逻辑或指令格式: orr{}{s} Rd,Rn,op操作: Rd = Rn | op;3、 eor逻辑异或指令格式: eor{}{s} Rd,Rn,op操作: Rd = Rn ^ op;4、 bic位清除指令格式: bic{}{s} Rd,Rn,op操作: Rd = Rn & (~op);五、比较指令(默认带S位)1、 cmp比较指令格式: cmp{} Rn,op操作: Rn - op2、 cmn反比较指令格式: cmn{} Rn,op操作: Rn + op3、 tst位测试指令格式: tst{} Rn,op操作: Rn & op4、 teq相等测试指令格式: teq{} Rn,op操作: Rn ^ op六、数据处理指令位图1、 op为寄存器xxxx 000a aaas nnnn dddd cccc cttt mmmm2、 op为立即数xxxx 001a aaas nnnn dddd rrrr bbbb bbbb3、条件xxxx见ARMv4v5v6.pdf P112只有条件为真时才会执行指令,否则忽略该指令,继续下一条4、数据处理指令aaaa见ARMv4v5v6.pdf P1155、条件标志s指令含s则该位为 1 ,否则为 06、寄存器Rd,Rn,Rm分别对应dddd,nnnn,mmmmR0 ---> R150000 ---> 1111没有寄存器的则对应位置为 0,如:mov没有Rn寄存器nnnn位为 0000 ,cmp没有Rd寄存器dddd位为 00007、移位数ccccc立即数方式:最大为 0x1f寄存器方式:第 1 - 4 个c为寄存器编号,第 5 个c为 08、移位符ttt移位符: lsl lsr asr ror立即数编码: 000 010 100 110寄存器编码: 001 011 101 111asl 与 lsl 的编码相同ttt == 110 && ccccc == 00000 表示 rrx9、立即数构造立即数= bbbb bbbb 循环右移 rrrr * 2 次这种方式并不能把所有的32位数都构造出来如: #12345,#0xffff七、常量的装载1、 ldr伪指令格式: ldr Rd,= //ldr只有带'='号时才是伪指令说明:将number或label的值赋给Rd,该指令会伪造成mov、mvn、ldr等可能的指令举例: ldr r0,=0x100 //mov r0,#0x100ldr r0,=0x0 //mvn r0,#0x0ldr r0,=0x12345 //ldr r0,[pc,#offset] //offset是该指令到.word 的偏移量减去8//...//.word 0x123452、 adr / adrl伪指令格式: adr Rd,=label说明:此指令不能用立即数,其他基本和ldr一样,小范围时用adr,大范围用时adrl八、乘法指令1、 mul乘法指令格式: mul{}{s} Rd,Rm,Rs操作: Rd = Rm * Rs;2、 mla乘累加指令格式: mla{}{s} Rd,Rm,Rs,Rn操作: Rd = Rm * Rs + Rn;九、分支指令1、分支指令格式: b{l}{} label位图: xxxx 101L jjjj jjjj jjjj jjjj jjjj jjjj汇编: code[23:0] = (offset - 8) >> 2//offset是label的地址减去当前指令的地址,正数向前跳,负数向后跳code[24] = Lcode[27:25] = 101code[31:28] =操作: if(L == 1)lr = pc - 8 + 4;//保存下一条指令,当把lr的值赋给pc时可实现函数返回pc = pc + (SignExtend_30(code[23:0]) << 2);//SignExtend_30表示有符号扩展30位ARM指令是按每 4 个字节对齐的(所有指令的地址最低两位都为所以可以先右移 2 位保存,取出值后再左移 2 位offset的有效位数是26,共64M,前后各32M2、分支切换指令格式: bx{} Rm操作: pc = Rm & 0xfffffffc;T = Rm[0];格式: blx{} Rm操作: lr = pc + 4 - 8;pc = Rm & 0xfffffffc;T = Rm[0];格式:blx{} label //label必须为thumb指令函数,只能前后各跳32M十、单寄存器load-store指令1、 ldr 32 位数据读取指令格式: ldr{} Rd,addr //addr用法请见内存寻址方式操作: val = *(int *)addr;2、 ldr 16 位数据读取指令格式: ldr{}h Rd,addr操作: Rd = *(short *)addr & 0x0000ffff;3、 ldr 16 位有符号数据读取指令格式: ldr{}sh Rd,addr操作: Rd = *(short *)addr & 0x0000ffff;if(Rd[15] == 1)Rd |= 0xffff0000;4、 ldr 8 位数据读取指令格式: ldr{}b Rd,addr操作: Rd = *(char *)addr & 0x000000ff;5、 ldr 8 位有符号数据读取指令格式: ldr{}b Rd,addr操作: Rd = *(char *)addr & 0x000000ff; if(Rd[7] == 1)Rd |= 0xffffff00;6、 str 32 位数据写入指令格式: str{} Rd,addr操作: *(int *)addr = Rd;7、 str 16 位数据写入指令格式: str{}h Rd,addr操作: *(short *)addr = Rd[15:0];8、 str 8 位数据写入指令格式: str{}b Rd,addr操作: *(char *)addr = Rd[7:0];注:没有str有符号数据写入指令十一、内存寻址方式1、 label举例: ldr r0,labellebel:.word 0x12345操作: r0 = *(int *)label;2、前变址格式: [Rn,op]操作: addr = Rn + op;注: addr只是地址,还没有取值举例: ldr R0,[R1,#8]操作: addr = R1 + 8;R0 = *(int *)addr;3、回写前变址格式: [Rn,op]!操作: addr = Rn + op;Rn = Rn + op;4、后变址格式: [Rn],op操作: addr = Rn;Rn = Rn + op;5、 ldr、ldrb、str、strb指令的op立即数: #+/-offset_12寄存器: +/-Rm寄存器移位: +/-Rm,<移位符> #number注: #+/-offset_12(与前面的立即数构造方法一样)number最大为0x1f,没有+/-Rm,<移位符> Rs方式的寄存器移位+号可以省略立即数等于 0 可以省略6、 ldrh、ldrsh、ldrsb、strh指令的op立即数: #+/-offset_8寄存器: +/-Rm注: offset_8最大为255,没有寄存器移位7、Rn == pc说明:当Rn == pc时,addr = 当前指令的地址 + 8 + op举例: 0 ldr r0,[pc,#-4]4 .word 0x123458这两行指令等于mov r0,#0x12345,但是0x12345 不能构造成立即数,所以可以通过这种方式来赋值我们不能写成 ldr r0,[pc,#4],因为执行这条指令时pc已经执行地址 8 的指令,应该减去 4 而不是加 4十二、多寄存器方式1、 ldm / stm格式: {}{ia|ib|da|db} Rn{!},R_list//{r0 - r15}^ / {r0,r5,r9,pc},如果顺序不对,编译器会自动按从R0-R15调整// ^表示cpsr --> spsr或spsr -->cpsr操作: if(cond==1){if(ia == 1)//执行后增加,如果寻址模式为空,默认是iaaddr = Rn;else if(ib == 1)//执行前增加addr = Rn + 4;else if(da == 1)//执行后减少addr = Rn - sizeof(R_list) + 4; //sizeof(R_list) == 寄存器数 * 4else //db == 1//执行前减少addr = Rn - sizeof(R_list);if(ldm == 1)ldm_func(addr,R_list);else //stm == 1stm_func(addr,R_list);if(! == 1){if(ia == 1 || ib == 1)Rn += sizeof(R_list);else //da == 1 || db == 1Rn -= sizeof(R_list);}}void ldm_func(addr,R_list) {for(i = 0;i <= 14;i++){if(R_list[i] == 1)R_list[i] = *(int *)addr;addr += 4;}if(R_list[15] == 1){pc = *(int *)addr & 0xfffffffc; }if(^ == 1){cpsr = spsr;}}void stm_func(addr,R_list) {for(i = 0;i <= 15;i++){if(R_list[i] == 1)*(int *)addr = R_list[i];addr += 4;}if(^ == 1){spsr = cpsr;}}2 、更新基地址的指令对,可实现栈的push和pop操作stmia <=======> ldmdbstmib <=======> ldmdastmda <=======> ldmibstmdb <=======> ldmia举例: stmdb sp!,{r1,r2,r3}ldmia sp!,{r1,r2,r3}执行后 sp,r1,r2,r3 的值保持不变3、栈操作栈向高地址扩展的为递增栈(A,ascending),向低地址扩展的为递减栈(D,descending)栈指针(sp)指向的是有效数据称为满栈(F,full),指向的是无效数据称为空栈(E,empty)在ARM-Thumb过程调用标准(ATPCS)中,栈被定义为递减式满栈寻址方式说明 push =stm pop =ldmFA 递增满 stmfa stmib ldmfa ldmdaFD 递减满 stmfd stmdb ldmfd ldmia //arm汇编的push和pop 操作指令EA 递增空 stmea stmia ldmea ldmdbED 递减空 stmed stmda ldmed ldmib十三、程序状态寄存器指令1、 mrs格式: mrs{} Rd,2、 msr格式: msr{} {_fields},fields可以是f、x、s、f的任意组合,表示只对该域操作,默认全部f 表示标志域 psr[31:24]s 表示状态域 psr[23:16]x 表示扩展域 psr[15:8]c 表示控制域 psr[7:0]。

arm常用汇编指令

arm常用汇编指令

arm常用汇编指令ARM的汇编指令是ARM处理器在运行时所执行的基本操作。

汇编指令是一种低级编程语言,它主要是为了直接操作硬件而设计的。

在ARM 汇编指令中,每个指令都是由一个操作码和一些操作数组成的。

操作码就是指令的类型,而操作数则是指令要操作的数据。

下面是一些常用的ARM汇编指令:1. mov指令mov指令是ARM汇编指令中最常用的指令之一。

它用来将一个数据从一个位置复制到另一个位置。

例如,下面的代码将寄存器r1中的值复制到寄存器r2中:mov r2, r12. add指令add指令用来将两个数相加并将结果存放在一个寄存器中。

例如,下面的代码将r1和r2中的值相加并将结果存放在r3中:add r3, r1, r23. sub指令sub指令用来将一个数从另一个数中减去并将结果存放在一个寄存器中。

例如,下面的代码将r2中的值从r1中减去并将结果存放在r3中:sub r3, r1, r24. cmp指令cmp指令用来比较两个数的大小。

它会将两个数相减,并将结果存放在一个特殊的寄存器中。

如果相减结果为0,表示两个数相等;如果结果为正数,表示第一个数大于第二个数;如果结果为负数,表示第一个数小于第二个数。

例如,下面的代码比较r1和r2的大小:cmp r1, r25. beq指令beq指令用来进行条件分支。

如果cmp指令的结果为0,则跳转到指定的地址。

例如,下面的代码如果r1等于r2,就跳到标号my_label处执行:beq my_label6. bne指令bne指令用来进行条件分支。

如果cmp指令的结果不为0,则跳转到指定的地址。

例如,下面的代码如果r1不等于r2,就跳到标号my_label处执行:bne my_label7. ldr指令ldr指令用来从内存中读取一个值并存放到寄存器中。

例如,下面的代码从内存地址0x100处读取一个值并存放到寄存器r1中:ldr r1, [0x100]8. str指令str指令用来将一个值存储到内存中。

常用ARM汇编指令

常用ARM汇编指令

常⽤ARM汇编指令1、相对跳转指令:b, bl 区别在于bl指令除了跳转之外,还将返回地址(bl的下⼀条指令的地址)保存在lr寄存器中。

可跳转范围是当前指令的前后32MB。

2、数据发送指令mov,地址读取伪指令ldr mov指令: mov r1, r2 //r1=r2,把⼀个寄存器的值赋给另⼀个寄存器 mov r1,#358 //r1=4096, 把⼀个常数赋给寄存器 ldr伪指令:(第⼆个参数为“=”时表⽰伪指令,否则表⽰内存访问指令) ldr r1,=358 //把⼀个常数赋给寄存器3、内存访问指令:ldr、str、ldm、stm ldr指令从内存中读取数据到寄存器: ldr r1, [r2, #4] //将地址为r2+4的内存单元数据读取到r1中 ldr r1, [r2] //将地址r2内存中数据读取到r1中 ldr r1, [r2], #4 //将地址为r2的内存中的数据读取到r1中,然后r2=r2+4 str指令把寄存器的值存储到内存中: str r1, [r2, #4] //将r1的数据保存到地址为r2+4的内存单元中 str r1, [r2] //将r1的数据保存到地址r2的内存单元中 str r1, [r2], #4 //将r1的数据保存到r2的内存单元中,然后r2= r2+44、加减指令:add、sub add r1,r2,#1 //表⽰r1 = r2+1 sub r1,r2,#1 //表⽰r1 = r2-15、程序状态访问寄存器:msr、mrs ARM 有⼀个程序状态寄存器(cpsr),⽤来控制处理器的⼯作模式、设置中断的总开关 msr cpsr, r0 //复制r0到cpsr mrs r0,cpsr //复制cpsr到r06、其他汇编指令 .extern main .text .global _start _start: ".extern"定义⼀个外部符号(可以是变量也可以是函数) “.text”表⽰羡慕的语句都属于代码段 “.global”将本⽂件中的某个程序标号定义为全局的,如上表⽰将_start定义为全局函数。

arm指令格式

arm指令格式

arm指令格式
ARM指令格式如下:
1.指令的基本格式及说明:ARM是三地址指令格式,指令的基本格式
为:<opcode>{<cond>}{s}<Rd>,<Rn>{,<operand2>}。

其中<>号内的项是必须的,{}号内的项是可选的。

o opcode:指令助记符,如MOV,ADD等。

o cond:执行条件。

o s:是否影响CPSR寄存器的值,如ADDS,SUBS等。

o Rd:目标寄存器。

o Rn:第一个操作数的寄存器。

o operand2:第二个操作数,可以是立即数,寄存器或寄存器位移操作,如SUB R2,R3,R4 LSL #2。

2.指令的执行条件:cond字段的使用可以实现高效的逻辑操作(节省
跳转和条件语句),提高代码效率。

所有的ARM指令都可以条件执行,而THUMB指令只有B(跳转)指令具有条件执行功能。

如果指令不标明条件代码,将默认为无条件(AL)执行。

第三节ARM指令

第三节ARM指令

MVN
R0,#0 R0,#0 ,#
20
CMP指令 指令
CMP指令的格式为: CMP指令的格式为: 指令的格式为 CMP{条件} 操作数1 操作数2 CMP{条件} 操作数1,操作数2 条件 CMP指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行 CMP指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行 比较,同时更新CPSR中条件标志位的值。该指令进行一次减法运算, CPSR中条件标志位的值 比较,同时更新CPSR中条件标志位的值。该指令进行一次减法运算, 但不存储结果,只更改条件标志位。标志位表示的是操作数1 但不存储结果,只更改条件标志位。标志位表示的是操作数1与操作数 的关系( 相等) 例如,当操作数1大于操作操作数2 2的关系(大、小、相等),例如,当操作数1大于操作操作数2,则此后 的有GT 后缀的指令将可以执行。 的有GT 后缀的指令将可以执行。 CMP CMP R1, R1,R0 R1,#100 R1,#100 ,#
R1减1,并设置标志位 如果 Z标志清零则跳转
9
条件码标志
任何数据处理指令都可以设置条件码 (N, Z, V, and C) 适用于除比较操作外的所有数据处理指令 特殊的请求必须在汇编语言中实现,这种请求是通过把” 增 特殊的请求必须在汇编语言中实现 这种请求是通过把”S”增 这种请求是通过把 加到选择代码中指定的
15
数据处理指令— 数据处理指令—灵活的第二操作数
如:ADD{cond}{S} Rd, Rn, Operand2 若指定S,则根据操作结果更新 条件码标志
Operand2可能的形式: Operand2可能的形式: 可能的形式 #immed_8r Rm{,shift}
R0 = r1 + 100 ADD r0, r1, #100 ADD r0, r1, r2 R0 = r1 + r2 R0 = r1 + (r2算术右移一位)
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ARM常用的指令符号特殊符号对应指令含义= DCB 分配一片连续的字节存储单元并用指定的数据初始化& DCD 分配一片连续的字存储单元并用指定的数据初始化% SPACE 分配一片连续的存储单元^ MAP 定义一个结构化内存表的首地址# FILED 定义一个结构化内存表的数据域(经常和MAP一使 用,一个定义起始地址,一个定义长度)* EQU 为程序中的常量、标号等定义一个等效的字符名称,! 地址更新,结果写回到Rn中,Rn不允许是R15[ | ] 相当于IF ELSE ENDIF其他:LDM中{∧}为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到CPSR。

同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。

TST R1,#%1 // 用于测试在寄存器R1中是否设置了最低位(%表示二进制数)$:如果在串变量前有一个$则在汇编时编译器将用该串变量的数值取代该串变量,如: GBLS STR1GBLS STR2STR1 SETS “pen.”STR2 SETS “This is a $STR1"编译后的结果是STR2的值为This is a pen.如果$后是数字变量(与串变量区分),在汇编时编译器将该数字变量的数值转换成十六进制的串,然后用该十六进制的串取代$后的数字变量。

如果$后是逻辑变量,在汇编时编译器将该逻辑变量替换成它的取值(T或者F)。

如果程序中需要$,则用$$来表示,编译器将不进行变量替换。

注意:在两个竖线“|”之间的$并不表示进行变量替换,但如果“|”是在双引号内,则将进行变量替换。

B . //表示程序进入死循环。

'.'为location counter,可在源文件中指示当前地址。

该符号可以被引用或赋值。

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位数据。

它可以寻址2^32 -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的表达式前面。

+A(﹣A) A为基于PC的表达式或者数字表达式4、逻辑表达式由逻辑量、逻辑操作符、关系操作符以及括号组成,取值范围为{FLASE}和{TRUE}关系操作符:用于表示两个同类表达式之间的关系。

关系操作符和它的两个操作数组成一个逻辑表达式,其取值为{FALSE}或{TRUE}如A=B 表示A等于BA/=B,A<>B表示A不等于B逻辑操作符:进行两个逻辑表达式之间的基本逻辑操作。

操作的结果为{FLASE}或{TRUE} :LNOT:A 逻辑表达式A的值取反A:LAND:B逻辑表达式A和B逻辑与5、其他的一些操作符(1)?:返回定义符号A的代码行所生成的可执行代码的字节数?A其中,A为一个符号(2)DEF:判断某个符号是否已定义:DEF:A如果符号A已经定义,上述结果为{TRUE},否则为{FLASE}(3)SB_OFFSET_19_12:SB_OFFSET_19_12:label 其中,label为一个标号返回(label-SB)的bits[19:12](4)SB_OFFSET_11_0:SB_OFFSET_11_0:label。

相关文档
最新文档