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(空递增堆栈)实现堆栈操作。

arm32汇编指令手册简要

arm32汇编指令手册简要

ARM32汇编指令手册简要:掌握ARM32汇编指令,轻松开发嵌入式系统在嵌入式系统开发中,ARM32汇编指令是必不可少的一部分。

ARM32汇编指令手册简要提供了ARM32汇编指令的基础知识和常用指令的详细介绍,帮助开发人员更好地掌握ARM32汇编指令,从而轻松开发嵌入式系统。

ARM32汇编指令是一种低级语言,它是由CPU直接执行的指令。

掌握ARM32汇编指令对于嵌入式系统开发人员来说非常重要。

了解ARM32汇编指令的基本结构和语法是必要的。

ARM32汇编指令的基本结构包括指令助记符、寄存器、操作数和注释。

指令助记符是指令的名称,寄存器是用来存储数据的地方,操作数是指令的参数,注释是对指令的解释说明。

ARM32汇编指令手册简要中还介绍了一些常用的指令,如MOV、ADD、SUB、CMP、B、BL等。

这些指令涵盖了ARM32汇编指令的大部分功能。

MOV指令可以将一个寄存器的值传递给另一个寄存器;ADD和SUB指令可以进行加法和减法运算;CMP指令可以比较两个值的大小;B和BL指令可以进行跳转操作。

掌握这些指令可以帮助开发人员更好地编写ARM32汇编程序。

除了介绍基本结构和常用指令外,ARM32汇编指令手册简要还介绍了一些高级指令,如LDR、STR、LDM、STM、SWI等。

这些指令可以让开发人员更加灵活地操作内存和系统调用。

例如,LDR和STR指令可以读取和写入内存中的数据;LDM和STM指令可以一次性读取或写入多个寄存器的值;SWI指令可以进行系统调用。

掌握这些高级指令可以让开发人员更加高效地编写ARM32汇编程序。

ARM32汇编指令手册简要提供了ARM32汇编指令的基础知识和常用指令的详细介绍,帮助开发人员更好地掌握ARM32汇编指令,从而轻松开发嵌入式系统。

掌握ARM32汇编指令不仅可以提高开发效率,还可以让开发人员更好地理解计算机底层原理,更加深入地了解嵌入式系统的工作原理。

ARM32汇编指令是嵌入式系统开发中必不可少的一部分。

arm9处理器的内部寄存器结构

arm9处理器的内部寄存器结构

arm9处理器的内部寄存器结构
ARM9处理器是一种32位的嵌入式处理器,内部包含了多种寄存器,这些寄存器扮演着不同的角色,用于存储不同类型的数据和指令,从而实现处理器的各种功能。

ARM9处理器的内部寄存器结构主要包括:
1.通用寄存器:ARM9处理器有16个32位的通用寄存器,这些寄存器不仅可以用于存储数据,还可以用于存储指令中的操作数。

通用寄存器还可以用于存储函数的参数和返回值。

2.程序计数器(PC):程序计数器是一个32位的寄存器,用于存储当前正在执行的指令的地址。

当处理器执行完一条指令后,PC会自动递增,指向下一条指令的地址。

3.状态寄存器:状态寄存器用于存储处理器的当前状态。

例如,它可以用于存储处理器的运行模式,或者存储处理器的条件码。

4.堆栈指针(SP):堆栈指针用于指向当前的堆栈顶部。

当处理器需要执行函数调用或其他需要使用堆栈的指令时,它会将数据压入堆栈中,并将堆栈指针减小。

当函数返回时,处理器会将数据从堆栈中弹出,并将堆栈指针增加。

5.链接寄存器(LR):链接寄存器用于存储函数调用的返回地址。

当函数被调用时,处理器将当前指令的地址存储在LR中。

当函数执行完毕后,处理器会将LR中的地址作为返回地址,跳转回调用函数的地方。

6.中断寄存器:中断寄存器用于存储当前中断的状态。

当处理器
接收到一个中断时,它会将当前的状态保存在中断寄存器中,并跳转到中断处理程序的地址。

总之,ARM9处理器的内部寄存器结构是非常复杂的,不同类型的寄存器扮演着不同的角色。

通过合理地利用这些寄存器,程序员可以实现各种复杂的嵌入式应用。

汇编语言中各寄存器的作用

汇编语言中各寄存器的作用

汇编语言中各寄存器的作用汇编语言中各寄存器的作用4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。

32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。

对低16位数据的存取,不会影响高16位的数据。

这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。

4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。

程序员可利用数据寄存器的这种”可分可合”的特性,灵活地处理字/字节的信息。

寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。

累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;寄存器BX称为基地址寄存器(Base Register)。

它可作为存储器指针来使用;寄存器CX称为计数寄存器(Count Register)。

在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器DX称为数据寄存器(Data Register)。

在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。

在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。

2、变址寄存器32位CPU有2个32位通用寄存器ESI和EDI。

arm汇编逻辑指令 -回复

arm汇编逻辑指令 -回复

arm汇编逻辑指令-回复ARM汇编逻辑指令ARM汇编逻辑指令是一种基于RISC(Reduced Instruction Set Computing)的指令集架构,在数字电子设备中被广泛使用。

逻辑指令主要用于实现基本的逻辑操作,例如布尔运算、比较和分支跳转等。

本文将深入探讨ARM汇编逻辑指令的各个方面,包括指令格式、操作数和指令示例等。

一、指令格式ARM汇编逻辑指令的指令格式通常包括操作码、目标寄存器和操作数等字段。

下面是一个典型的ARM汇编逻辑指令的格式:<操作码>{xx}{cond} <目标寄存器>, <操作数1>, <操作数2>其中,操作码用于指定具体的逻辑操作,xx字段用于指定操作的类型(例如AND、OR或XOR等),cond字段用于指定条件执行的条件码,目标寄存器用于存储运算结果,操作数1和操作数2分别是参与运算的操作数。

二、操作数ARM汇编逻辑指令的操作数可以是寄存器或立即数。

寄存器是存储在CPU内部的高速存储器单元,用于存储临时数据。

ARM架构通常提供了16个通用寄存器(R0-R15),其中R0-R7用于存储一般性目的数据,R8-R15用于存储特殊用途数据。

立即数是直接写在指令中的常数值,通常用于表示较小的数据。

立即数的宽度取决于具体的指令和操作码。

例如,对于AND指令,立即数可以是8位或32位的。

三、指令示例以下是一些常见的ARM汇编逻辑指令示例:1. AND指令AND指令用于将两个操作数逐位进行与运算,并将结果存储在目标寄存器中。

例如,下面的指令将执行R1 = R2 AND 3:AND R1, R2, 32. OR指令OR指令用于将两个操作数逐位进行或运算,并将结果存储在目标寄存器中。

例如,下面的指令将执行R1 = R2 OR R3:ORR R1, R2, R33. XOR指令XOR指令用于将两个操作数逐位进行异或运算,并将结果存储在目标寄存器中。

ARM的37个寄存器详解

ARM的37个寄存器详解

ARM的37个寄存器详解ARM寄存器ARM共有37个32位物理寄存器,7种⼯作模式下可访问的寄存器见下表,User和System使⽤完全相同的物理寄存器。

2.1 R0~R7所有⼯作模式下,R0-R7都分别指向同⼀个物理寄存器(共8个物理寄存器),它们未被系统⽤作特殊的⽤途。

在中断或异常处理进⾏⼯作模式转换时,由于不同⼯作模式均使⽤相同的物理寄存器,可能造成寄存器中数据的破坏。

2.2 R8~R12在User&System、IRQ、Svc、Abt和Und模式下访问的R8~R12都是同⼀个物理寄存器(共5个物理寄存器);在FIQ模式下,访问的R8_fiq~R12_fiq是另外独⽴的物理寄存器(共5个物理寄存器)。

2.3 R13和R14在User&System、IRQ、FIQ、Svc、Abt和Und访问的R13_~R14都是各⾃模式下独⽴的物理寄存器(共12个物理寄存器)。

R13在ARM指令中常⽤作堆栈指针(SP),但这只是⼀种习惯⽤法,⽤户也可使⽤其他的寄存器作为堆栈指针。

⽽在Thumb指令集中,某些指令强制性的要求使⽤R13作为堆栈指针。

由于处理器的每种⼯作模式均有⾃⼰独⽴的物理寄存器R13,在⽤户应⽤程序的初始化部分,⼀般都要初始化每种模式下的R13,使其指向该⼯作模式的栈空间。

这样,当程序进⼊异常模式时,可以将需要保护的寄存器放⼊R13所指向的堆栈,⽽当程序从异常模式返回时,则从对应的堆栈中恢复,采⽤这种⽅式可以保证异常发⽣后程序的正常执⾏。

R14称为链接寄存器(Link Register),当执⾏⼦程序调⽤指令(BL)时,R14可得到R15(程序计数器PC)的备份。

在每⼀种⼯作模式下,都可⽤R14保存⼦程序的返回地址,当⽤BL或BLX指令调⽤⼦程序时,将PC的当前值复制给R14,执⾏完⼦程序后,⼜将R14的值复制回PC,即可完成⼦程序的调⽤返回。

以上的描述可⽤指令完成。

执⾏以下任意⼀条指令:MOV PC, LRBX LR在⼦程序⼊⼝处使⽤以下指令将R14存⼊堆栈:STMFD SP!,{,LR}对应的,使⽤以下指令可以完成⼦程序返回:LDMFD SP!,{,PC}R14也可作为通⽤寄存器。

arm通用寄存器及其别名

arm通用寄存器及其别名

AMR寄存器的别名+ APCS默认情况下,arm处理器中的通用寄存器被称为:r0、r1...r14等,在APCS中为arm通用寄存器定义了别名。

在某些情况下(比如多人协作编辑汇编代码,或需要修改其它人所写的汇编代码时),使用APCS所定义的别名有助于提高代码的可读性和兼容性。

arm通用寄存器及其别名对照表:The following register names are predeclared:r0-r15 and R0-R15a1-a4 (argument, result, or scratch registers, synonyms for r0 to r3)v1-v8 (variable registers, r4 to r11)sb and SB (static base, r9)ip and IP (intra-procedure-call scratch register, r12)sp and SP (stack pointer, r13)lr and LR (link register, r14)pc and PC (program counter, r15).arm中r12的用途原文作者在维护1个以前的程序,该程序包括应用、库文件以及linux device driver。

该程序原来使用arm-linux-gcc 3.4.3编译,现在改用arm-linux-gcc 4.1.1进行编译时发现程序无法运行。

经原文作者测试,发现当使用shared library形式编译程序后无法运行,而使用static linking形式编译程序后可正常运行。

这是由于在arm-linux-gcc 4.1.1所使用的新的规范中,r12不仅作为通用寄存器,还被称为Intra-Procedure-call scratch register。

Register r12 (IP) may be used by a linker as a scratch register between a routine and any subroutine it calls (for details, see §5.3.1.1, Use of IP by the linker). It can also be used within a routine to hold intermediate values between subroutine callsBoth the ARM- and Thumb-state BL instructions are unable to address the full 32-bit address space, so it may be necessary for the linker to insert a veneer between the calling routine and the called subroutine. Veneers may also be needed to support ARM-Thumb inter-working or dynamic linking. Any veneer inserted must preserve the contents of all registers except IP (r12) and the condition code flags; a conforming program must assume that a veneer that alters IP may be inserted at any branch instruction that is exposed to a relocation that supports inter-working or long branches.——引用自:"Procedure Call Standard for the ARM Architecture"19th January, 2007, Richard Earnshaw.由上述说明可知,若在汇编代码中使用了bl命令,而r12又被作为通用寄存器使用时,则r12的值可能会被链接器插入的veneer代码所修改,若是单纯的c源码则不会出现此问题。

汇编语言的类型

汇编语言的类型

汇编语言的类型汇编语言是一种底层的编程语言,它与计算机硬件密切相关,常用于控制硬件的操作。

汇编语言的类型也有多种,下面将分别介绍。

1. x86汇编语言x86汇编语言是一种广泛使用的汇编语言,主要用于Intel和AMD 处理器。

它是一种基于寄存器的汇编语言,通过寄存器来访问内存和其他设备。

x86汇编语言非常灵活,可以用来编写各种类型的应用程序,包括操作系统、驱动程序、安全软件等。

2. ARM汇编语言ARM汇编语言是一种使用ARM处理器的汇编语言。

ARM处理器是一种低功耗的处理器,广泛应用于移动设备和嵌入式系统。

ARM 汇编语言是基于寄存器的汇编语言,也可以通过其他方式来访问内存和其他设备。

ARM汇编语言通常用于编写嵌入式系统的驱动程序和操作系统。

3. MIPS汇编语言MIPS汇编语言是一种使用MIPS处理器的汇编语言。

MIPS处理器是一种高性能的处理器,常用于路由器、交换机和数字信号处理器等。

MIPS汇编语言是基于寄存器的汇编语言,也可以通过其他方式来访问内存和其他设备。

MIPS汇编语言通常用于编写嵌入式系统的驱动程序和操作系统。

4. AVR汇编语言AVR汇编语言是一种使用AVR微控制器的汇编语言。

AVR微控制器是一种低功耗的微控制器,广泛应用于嵌入式系统、电子设备和工业控制等领域。

AVR汇编语言主要基于寄存器,也可以通过其他方式来访问内存和其他设备。

AVR汇编语言通常用于编写嵌入式系统的驱动程序和操作系统。

5. SPARC汇编语言SPARC汇编语言是一种使用SPARC处理器的汇编语言。

SPARC处理器是一种高性能的处理器,常用于服务器和超级计算机等。

SPARC汇编语言主要基于寄存器,也可以通过其他方式来访问内存和其他设备。

SPARC汇编语言通常用于编写操作系统和高性能计算程序等。

总结汇编语言的类型有很多种,不同的汇编语言适用于不同的处理器和应用场景。

汇编语言虽然比高级语言难以学习和使用,但它可以直接控制硬件,因此在某些特定的应用领域中有着不可替代的作用。

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

在线学习好工作/
ARM汇编之寄存器
ARM A系列寄存器的情况
这是寄存器的总表,下面是CPU的各个模式,上面的纵轴就是寄存器组。

CPU在运行的时候为什么会有寄存器?
想象CPU是一个圈一直在运转,然后寄存器里面有大量的指令,这些指令不知道从哪里来的,但是一般情况下我们的程序在计算我们的程序,我们的程序一般是放在内存里面的,它从内存里面把这些程序读进来之后,在运行,但是如果现在这个程序在运行时异常,那么就要进行CPU状态的切换,除了状态切换之外,当前的一些数据结果需要进行一个保存,但是如果要把这个结果存到内存去,内存并不稳定并且很慢,所以就要想办法能不能找到一个临时空间保存一下,这就是为什么会诞生寄存器。

设置寄存器的原因就是为了更好的去控制和达到效率,ARM体系为了很好的去控制CPU,设定了哪些寄存器?
User纵轴上的十三个寄存器称为通用寄存器,R13是一个比较特殊的寄存器,也叫做SP,就是占指针的寄存器,就是指向某一些占空间,R14是LR,就是连接寄存器,它肯定是去连接某一个地方。

R15是PC,这是程序计数器,这是CPU在每一个空间切换的时候的计数器,最下面那个也就是APSR或者CPSR,PSR 就是程序状态寄存器,A代表应用程序状态寄存器,C代表当前程序状态寄存器。

在往下就类似于R17,只不过它叫做SPSR,S就是以保存程序代表寄存器或者我们也可以称为存储状态寄存器,通过这些我们大概把寄存器了解了。

那么这上面分为通用的,那么下面就是特殊寄存器,从横向来看,我们可以看到在USR模式下面,这样寄存器挺全的,但是USR下面没有SPSR,就是没有存储状态的寄存器,然后FIQ快速中断模式下面面是共享R0到R7,意思就是这些模式下的R0到R7它们与USR模式下的R0到R7是共享的,这样如果存储一些数据在R0到R9下面,突然发生异常,切换到另一个模式,那么我们就应该要想办法把这个存取一下,因为另一个模式可能也要往这里面写东西,那么写之前就应该把USR模式下的先保留一下,到时候退出解决后在还原回来,所以我们要一个R0到R7这块寄存器是共享的,同样FIQ后面几个模式的R8到R12也是和USR共享的,只有FIQ是自己独有的,同样的我们在看到PC计数器也是共享的,还有SPSR也是共享的,但是SPSR每个状态都有自己独有的。

APSR应用程序的一个寄存器,它只在USR下面叫做APSR,其他模式下面叫做当前程序存储寄存器。

总结
1,R0-R12是通用寄存器,放通用数据然后每个寄存器都是32位的。

2,各个模式的R0到R12与USR模式是共享的(除了FIQ,R8-R12),PC,CPSR是共享的。

3,USR模式没有SPSR
SP:栈指针,存储栈地址,比如有个CPU,然后还有个外部资源也就是内存,我们想象CPU在程序跳转的时候在运行是最核心的ALU单元,然后外部资源存储着程序A和程序B还有程序C,实际上在CPU在读程序A的时候,可能下面的时候会跳到程序B单元,这个时候它可能不知道地址在哪里,那么这个时候就存储在SP这个寄存器里面,SP这个寄存器表示后面将要执行的程序。

LR:链接寄存器,存储于程序返回地址。

这个链接寄存器主要用在函数A
和函数B,A正在运行时,突然要调用B,那么就引了一个分支了,然后这个函数B去运行,运行完之后还是要返回到最初然后继续往下走,那么这个时候返回值应该要有个记录,这就是链接寄存器。

PC:程序计数器
APSR/CPSR:应用程序状态寄存器/当前程序状态寄存器。

SPSR:已存储程序状态寄存器。

想象一个程序正在运行,这个程序当前状态正常,这个状态就先把它保存到CPS里面,这个时候突然发生异常,那么当前状态就应该变成异常,就把这个状态存到CPSR上面,但是异常处理完了之后,我们希望还是能够回到之前那个状态,但是这个时候当时的状态已经被清理掉了,这个时候我们就可以用SPSR把原来那个状态保存,这样当状态在发生改变的时候,要还原就可以去SPSR里面读取之前那个状态,这就是它们之间的关系,就类似有一个A的变量,给A这个变量赋了一个值,然后还赋了一个新值,但是又希望原来那个值要保存,所以有个变量B,然后把变量A赋给变量B。

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

相关文档
最新文档