ARM指令汇编语言

合集下载

ARM汇编语言指令总结

ARM汇编语言指令总结

ARM汇编语⾔指令总结ARM处理器有9种寻址⽅式:1、寄存器寻址,2、⽴即寻址,3、寄存器器移位寻址,4、寄存器间接寻址,5、基址寻址,6、多寄存器寻址,7、堆栈寻址,8、块拷贝寻址,9、相对寻址。

ARM指令集:ARM指令基本格式如下:{}{S} ,{,}其中<>的内容是必须的,{}的内容是可选的。

OPCODE指令助记符,COND执⾏条件,S是否影响CPSR中的值,Rd⽬标寄存器,Rn 第⼀个操作数的寄存器,OPERAND2第⼆个操作数。

灵活的使⽤第2个操作数“operand2”能够提⾼代码效率。

它有如下的形式:1)#immed_8r ——常数表达式;2)Rm——寄存器⽅式;3)Rm,shift——寄存器移位⽅式(ASR算术右移,LSL逻辑左移,LSR 逻辑右移,ROR循环右移,RRX带扩展的右移1位)。

COND执⾏条件:下⾯介绍ARM指令:1、存储器访问指令。

存储器访问指令分为单寄存器操作指令和多寄存器操作指令。

单寄存器操作指令LDR/STR指令⽤于对内存变量的访问、内存缓冲区数据的访问、查表、外围部件的控制操作等。

LDR:从内存到寄存器,加载数据。

STR:将寄存器的数据存储到内存。

LDRB操作字节,LDRH操作半字,LDRSH操作有符号半字。

多寄存器操作指令LDM为加载多个寄存器;STM为存储多个寄存器。

允许⼀条指令传送16个寄存器的任何⼦集或所有寄存器。

它们主要⽤于现场保护、数据复制、常数传递等。

进⾏数据复制时,先设置好源数据指针和⽬标指针,然后使⽤块拷贝寻址指令LDMIA/STMIA(传送后地址加4)、LDMIB/STMIB(传送前地址加4)、LDMDA/STMDA(传送后地址减4)、LDMDB/STMDB(传送前地址减4)进⾏读取和存储。

进⾏堆栈操作操作时,要先设置堆栈指针(SP),然后使⽤堆栈寻址指令STMFD/LDMFD(满递减堆栈)、STMED/LDMED(空递减堆栈)、STMFA/LDMFA(满递增堆栈)和STMEA/LDMEA(空递增堆栈)实现堆栈操作。

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 汇编stm指令

arm 汇编stm指令

arm 汇编stm指令ARM汇编是一种低级语言,用于编写程序来控制ARM处理器。

在ARM汇编中,STM指令是用来保存寄存器的值到栈中的指令。

本文将介绍ARM汇编中的STM指令及其使用方法。

STM指令是Store Multiple的缩写,它的作用是将多个寄存器的值保存到栈中。

在ARM汇编中,栈是一种后进先出(LIFO)的数据结构,用来存储临时数据和函数调用过程中的返回地址。

STM指令的语法如下:STM{条件码}{模式} SP!,{寄存器列表}其中,条件码是可选项,用来指定条件执行STM指令的条件;模式用来指定存储模式,常用的模式有IA(递增后存储)、IB(递增前存储)、DA(递减后存储)和DB(递减前存储);SP是栈指针寄存器,用来指定栈的起始地址;寄存器列表指定要保存的寄存器。

例如,下面的代码片段演示了如何使用STM指令保存R0、R1和R2寄存器的值到栈中:```STMFD SP!, {R0, R1, R2}```在上述代码中,STMFD指令存储了R0、R1和R2的值到栈中。

SP!表示栈指针寄存器递增,即存储完后栈指针自动增加,以便下一次保存操作。

除了STMFD指令,ARM汇编中还有STMED(递减后存储)、STMEA(递增后存储)和STMFA(递增前存储)等指令,它们的语法类似,只是存储模式不同。

STM指令的使用场景有很多,其中一个常见的用法是在函数调用过程中保存寄存器的值。

在函数调用时,为了避免寄存器中的值被覆盖,需要将寄存器的值保存到栈中,待函数执行完毕后再恢复寄存器的值。

另一个常见的用法是在中断处理程序中保存寄存器的值。

当发生中断时,处理器会保存当前的上下文信息,包括寄存器的值,然后执行中断处理程序。

在执行完中断处理程序后,需要恢复之前保存的上下文信息,包括寄存器的值。

除了保存寄存器的值,STM指令还可以用来保存其他数据。

例如,可以使用STM指令保存函数的局部变量到栈中,以释放寄存器用于其他用途。

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汇编语言的语法知识
指令执行的条件码 加载的目标寄存器 地址表达式
地址表达式expr的取值范围: 当地址值不是字对齐时,其取值范围为-64K~64K; 当地址值是字对齐时,其取值范围为-256K~256K; 当地址值是16字节对齐时,其取值范围将更大; 该地址必须与ADRL伪指令在同一个代码段中 .
• ARM伪指令——大范围的地址读取
指令执行的条件码 加载的目标寄存器 地址表达式
地址表达式expr的取值范围: 当地址值不是字对齐时,其取值范围为-255~255字节; 当地址值是字对齐时,其取值范围为-1020~1020字节; 当地址值是16字节对齐时,其取值范围将更大; 该地址必须与ADR伪指令在同一个代码段中.
• ARM伪指令——中等范围的地址读取
;单元,并初始化为0
• ARM汇编语言伪指令----数据定义伪操作
MAP MAP用于定义一个结构化的内存表的首地址.此时,内存 表的位置计数器设置成该地址值.该伪操作可以用"^"代替.
MAP伪操作举例
LTORG伪操作通常放在无条件跳转指令之后,或者子程
序返回指令之后,这样处理器就不会错误地将数据池中的
数据当做指令来执行.
用LTORG伪指令定义数据缓冲池举例
Funel
;子程序
LDR R1, =0x8000;将0x8000加载到R1
MOV PC, LR
LTORG
;定义数据缓冲池,存放0x8000
Data SPACE 40 ;从当前位置开始分配40字节的内存
使用示例:
height DN width SN lower FN
6 ;将VFP双精度寄存器6名称定义为height 16 ;将VFP单精度寄存器16名称定义为width 6 ;将浮点寄存器6名称定义为lower

arm汇编语言格式

arm汇编语言格式

arm汇编语言格式
ARM汇编语言是一种底层的程序设计语言,用于编写针对ARM
架构的机器码指令。

ARM汇编语言的格式包括以下几个方面:
1. 注释,注释用于解释代码的作用和功能,以分号(;)开头。

注释对于代码的可读性和理解很重要。

2. 指令,指令是汇编语言的核心部分,用于执行特定的操作。

指令可以包含操作码(opcode)和操作数(operand)。

操作码指定
要执行的操作,操作数提供操作所需的数据。

3. 标号,标号用于标识代码的位置或跳转目标。

标号以英文字母、数字和下划线组成,以冒号(:)结尾。

4. 寄存器,ARM架构有一组通用寄存器,用于存储和处理数据。

寄存器以英文字母r开头,后跟一个数字,表示寄存器的编号。

例如,r0表示第一个通用寄存器,r1表示第二个通用寄存器,依此类推。

5. 操作数,操作数可以是立即数(immediate)、寄存器、内
存地址等。

立即数是直接出现在指令中的数值,寄存器是存储数据的容器,内存地址是存储器中数据的位置。

6. 伪指令,伪指令是用于辅助程序开发的指令,不会被转化为机器码。

伪指令以句点(.)开头,常用的伪指令有定义数据段、定义代码段、定义常量等。

7. 指令格式,ARM汇编语言的指令格式通常包括操作码、目的寄存器、源操作数和条件码。

具体的指令格式会根据不同的指令而有所不同。

总结起来,ARM汇编语言的格式包括注释、指令、标号、寄存器、操作数、伪指令和指令格式。

这些元素共同构成了ARM汇编语言的语法规则,通过合理的组合和使用,可以编写出有效的ARM汇编代码。

arm汇编指令格式

arm汇编指令格式

arm汇编指令格式ARM汇编指令格式ARM汇编语言是一种底层程序设计语言,用于直接操控ARM处理器的指令和寄存器。

ARM汇编指令格式是编写ARM汇编程序的基础,本文将一步一步详细解答与ARM汇编指令格式相关的问题。

第一部分:ARM汇编基础在深入理解ARM汇编指令格式之前,我们需要先了解一些基本概念。

ARM 处理器是英国公司ARM Holdings开发的一种低功耗、高性能的处理器体系架构,广泛应用于移动设备、嵌入式系统等领域。

ARM汇编语言是ARM 处理器的机器码的可读形式,用于编写底层程序。

在ARM汇编语言中,指令以二进制形式表示,通常以助记符的形式出现。

每条指令占用一个或多个字(通常一个字等于4个字节),按字节编址。

第二部分:指令格式详解ARM处理器的指令格式包括指令助记符、操作数和操作码等部分。

ARM 汇编指令格式的一般形式如下:[label:] mnemonic{cond}{S} Rd, Rn, Operand2其中,[label:]为可选项,表示标号,用于在程序中跳转或引用;mnemonic为指令的助记符,用于表示具体的操作;{cond}为可选项,表示条件代码,用于指定是否执行指令;{S}为可选项,表示是否更新条件代码;Rd表示目标操作数的寄存器;Rn表示源操作数的寄存器;Operand2为第二个操作数。

指令助记符(mnemonic)代表具体的指令功能,例如ADD表示加法、MOV表示数据传输等。

条件代码(cond)用于指定是否执行指令,常用的条件代码有EQ(等于)、NE(不等于)、GT(大于)等。

这样,我们可以根据需要选择是否在特定条件下执行指令。

更新条件代码(S)表示执行指令后是否更新条件代码寄存器。

如果设置了该标志位,则根据指令的结果设置条件代码寄存器。

目标操作数(Rd)是指令的结果存储的寄存器,源操作数(Rn)是参与指令计算的寄存器。

操作数(Operand2)是指令的第二个操作数,可以是立即数、寄存器的偏移值、寄存器的移位值等。

常用的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位的字数据传送到⽬的寄存器中。

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

ARM指令集和汇编语言程序姓名:何瑞平学号:201120928专业:电路与系统本章主要介绍以下内容:一、ARM寻址方式包含9种:立即数寻址寄存器寻址寄存器移位寻址寄存器间接寻址基址变址寻址相对寻址多寄存器寻址块拷贝寻址堆栈寻址寻址空间:51系列是16位地址总线,寻址空间为:215 。

ARM系列为32位地址总线,寻址空间为:2311.1立即数寻址在立即数寻址中,操作数本身直接在指令中给出,取出指令也就获得了操作数,这个操作数也称为立即数。

例:ADD R0,R1,#5;R0=R1+5MOV R0,#0x55;R0=0x55其中:操作数5,0x55就是立即数,立即数在指令中要以“#”为前缀,后面跟实际数值。

十进制立即数表达举例:#0005、#01234;十六进制立即数表达举例:#0x0005、#0x0FFFF;1.2寄存器寻址在寄存器寻址方式下,寄存器的值即为操作数,寄存器本身就是操作数地址。

在51系列单片机中,可寻址的寄存器是当前工作寄存器R0~R7,A、B和DPTR。

在ARM系列的任一个模式,都有R0~R14、PC、CPSR。

例:ADD R0,R1,R2 ;R0=R1+R2MOV R0,R1 ; R0=R11.3寄存器移位寻址寄存器移位寻址是ARM 特有的寻址方式,其操作数由寄存器的数值做相应移位而得到。

移位的方式在指令中以助记符的形式给出,而移位的位数可用立即数或寄存器寻址方式表示。

例:ADD R0,R1,R2,ROR #5;R0=R1+R2循环右移5位 MOV R0,R1,LSL R3;R0=R1逻辑左移R3位移位操作在ARM 指令集中不作为单独的指令使用,ARM 指令集共有5种位移操作。

1.4 ARM 指令集的5种位移操作1.4.1 LSL (Logical Shift Lef )逻辑左移 :向左移位,左侧移出的位丢失;右端空出位补0;注:最后一个左移出的位存放于状态寄存器CPSR 的C 位中。

移出n 位相当于乘以2的n 次幂。

指令格式:Rx ,LSL <op1> 举例:R4,LSL#06 表明把R4的值逻辑左移6位,空位补0,把最后移出的位赋给程序状态寄存器CPSR 的C 位。

1.4.2 LSR (Logical Shift Right )逻辑右移 :向右移位,右侧移出的位丢失;左端空出位补0;注:最后一个右移出的位存放于状态寄存器CPSR 的C 位中。

移出n 位相当于除以2的n 次幂。

指令格式:Rx ,LSR <op1> 举例:R5,LSR#02 表明把R5中的数据右移2位,空位补0,把最后移出的位赋给程序状态寄存器的c 位。

1.4.3 ASR (Arithmetic Shift Right )算术右移 : 向右移位,移出的位丢失,最左端保持不变。

310031注:最后一个右移出的位存放于状态寄存器CPSR 的C 位中。

这种移位对有符号数据使用时可保持符号位不变。

指令格式:Rx ,ASR <op1> 举例:R4,ASR#04 表明R4内数据向右移4位,符号位不变,最后移出的位也送入状态位C 中。

1.4.4 ROR (Rotate Right )循环右移 :向右移位,右端移出的位填充在左端空位处。

注:最后一个右移出的位同时存放于状态寄存器CPSR 的C 位中。

指令格式:Rx ,ROR <op1> 举例:R4,ROR#03 表明把R4内的数据向右移3位,移出的位填充到左端空位处,把最后一个右移出的位同时存放于状态寄存器的C 位中。

1.4.5 RRX (Rotate Right extended By 1 Place ) 带扩展的循环右移:向右只移一位,左侧空位由状态寄存器C 位填充,右侧移出的位移进位状态位C 中这种移位多用于多位数计算中。

指令格式:Rx ,RRX 举例:R2,RRX 表明R2内的数据向右移一位,把右侧移出的位送入状态寄存器C 中,C 位中的值放入左侧的空位处。

注意:在各种移位方式中,假设移位位数为n ,则n 须遵守以下规则: ASR 1≤n ≤32 LSL 0≤n ≤31 LSR 1≤n ≤32 ROR 1≤n ≤31RRX 只右循环一位310310310C1.5 寄存器间接寻址寄存器中的值为操作数的物理地址,而实际的操作数存放在存储器中。

在51系列,可间接寻址的寄存器有R0、R1,DPTR。

在ARM中,可间接寻址的寄存器有R0~R15.例:STR R0,[R1] ;[R1]=R0LDR R0,[R1] ;R0=[R1]1.6 基址变址寻址将寄存器(称为基址寄存器)的值与指令中给出的偏移地址量相加,所得结果作为操作数的物理地址。

例:LDR R0,[R1,#5] ; R0=[R1+5]基址R1,偏移量是立即数5。

LDR R0,[R1,R2] ; R0=[R1+R2]1.7 相对寻址相对寻址同基址变址寻址相似,区别只是将程序计数器PC作为基址寄存器,指令中的标记作为地址偏移量。

例:BEQ process1……process1……1.8 多寄存器寻址在多寄存器寻址方式中,一条指令可实现一组寄存器值的传送。

连续的寄存器间用“-”连接,否则用“,”分隔。

例:LDMIA R0,{R1-R5};R1=[R0],R2=[R0+4],R3=[R0+8];R4=[R0+12],R5=[R0+16]指令中IA表示在执行完一次Load操作后,R0自增4。

该指令将以R0为起始地址的5个字数据分别装入R1,R2,R3,R4,R5中。

1.9 块拷贝寻址块拷贝寻址可实现连续地址数据从存储器的某一位置拷贝到另一位置。

例:LDMIA R0,{R1-R5};STMIA R1,{R1-R5};第一条指令从以R0的值为起始地址的存储单元中取出5个字的数据,第二条指令将取出的数据存入以R1的值为起始地址的存储单元中。

实际上是多寄存器寻址的组合。

1.10 块拷贝寻址块拷贝寻址可实现连续地址数据从存储器的某一位置拷贝到另一位置。

例:LDMIA R0,{R1-R5};STMIA R1,{R1-R5};第一条指令从以R0的值为起始地址的存储单元中取出5个字的数据,第二条指令将取出的数据存入以R1的值为起始地址的存储单元中。

实际上是多寄存器寻址的组合。

1.11 堆栈寻址堆栈是一块用于保存数据的连续内存,是按先进后出(FILO)的原则存取数据的存储区。

使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。

当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。

同时,根据堆栈的生成方式,又可以分为递增堆栈和递减堆栈。

当堆栈由低地址向高地址生成时,称为递增堆栈;当堆栈由高地址向低地址生成时,称为递减堆栈。

这样就有4种类型的堆栈工作方式。

ARM堆栈的几种形式1.满栈递增方式FA(Full Ascending)与51系列的堆栈方式相同,堆栈指针指向最后入栈的数据位置。

数据入栈时,堆栈指针是增计数。

2.空栈递增方式EA(Empty Ascending)和满栈递增的区别在于,堆栈指针指向下一个入栈数据的位置。

3.满栈递减方式FD(Full Descending)堆栈指针指向最后入栈的数据,数据入栈时堆栈指针是减计数。

4.空递减方式ED(Empty Descending)和满栈的区别在于,堆栈指针指向下一个入栈数据的位置。

堆栈寻址用于数据栈与寄存器组之间批量数据传输。

当数据写入和读出内存的顺序不同时,使用堆栈寻址可以很好的解决这问题。

例:STMFD R13!,{R0,R1,R2,R3,R4};LDMFD R13!,{R0,R1,R2,R3,R4}第一条指令,将R0-R4中的数据压入堆栈,R13为堆栈指针;第二条指令,将数据出栈,恢复R0-R4原先的值。

二、ARM指令集的基本特点ARM指令系统简介ARM9 处理器支持两种指令集,即32 位的ARM 指令集和16 位Thumb 指令集。

ARM微处理器的指令集是加载/存储型的,即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中;而对系统存储器的访问则需要专门的加载/存储指令来完成。

ARM指令集是特殊的指令集,32位编码包含的信息量很大,每一条语句完成的功能很强,在多寄存器操作指令中一次最多可以完成16个寄存器的数据传送。

ARM指令集按指令功能通常分为6大类:◆跳转指令◆数据处理指令◆程序状态寄存器(PSR)处理指令◆加载/存储指令◆协处理指令◆异常产生指令ARM指令集格式如下图所示:图2.1 ARM指令集格式可以看到,[31:28]:条件代码域。

[27:20]:指令代码域。

[19:16]:地址基址Rn域。

[15:12]:目标或源寄存器Rd域。

[11:0]:地址偏移或操作寄存器、操作数区域。

ARM指令集的基本特点AMR指令集有很多的未定义指令。

ARM指令代码最高4位[31:28]是条件码域。

ARM指令一般把[27:20]作为指令代码域。

位[19:0]包含立即数、寄存器和偏移量等信息。

ARM指令集为寄存器寻址安排4位代码,可寻址16个寄存器。

多数情况下,目标寄存器Rd的寄存器编号存放在[15:12]位域。

位[20]是重要的条件标志(S)存放位。

2.1与Thumb指令集的区别ARM指令集和Thumb指令集具有以下共同点:⒈较多的寄存器,可以用于多种用途。

⒉对存储器的访问只能通过Load/Store指令。

2.2ARM 指令集和Thumb 指令集的不同点:2.3与x86处理器的区别x86指令集非规整指令格式 即:非正交指令格式 二地址指令指令隐含决定运算完毕后是否改变状态标志 状态标志位有6位 单一指令密度 有整数除法指令专用条件判断指令进行程序分支 没有适合DSP 处理的乘加指令 运算指令能够访问存储器ARM 指令集规整指令格式即:正交指令格式三地址指令由指令的附加位决定运算完毕后是否改变状态标志 状态标志位只有4位 有两种指令密度 无整数除法指令大多数ARM 指令都可以条件执行 有适合DSP 处理的乘加指令 Load/Store 访存体系结构2.4ARM指令格式一条典型的ARM指令语法如下所示:<opcode>{<cond>}{S} <Rd>, <Rn> {,<Operand2>}其中:<opcode > 是指令助记符,决定了指令的操作。

例如:ADD表示算术加操作指令。

{<cond>} 是指令执行的条件(可选后缀),可选项。

{S} 决定指令的操作是否影响CPSR的值,可选项。

<Rd> 表示目标寄存器,必有项。

相关文档
最新文档