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汇编指令是一种低级语言,它是由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处理器是一种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汇编逻辑指令是一种基于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寄存器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通用寄存器及其别名
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汇编语言通常用于编写操作系统和高性能计算程序等。
总结汇编语言的类型有很多种,不同的汇编语言适用于不同的处理器和应用场景。
汇编语言虽然比高级语言难以学习和使用,但它可以直接控制硬件,因此在某些特定的应用领域中有着不可替代的作用。
ARM 内核寄存器 和 基本汇编语言讲解
ARM 内核寄存器和基本汇编语言讲解•一、ARM内核寄存器▪ 1.1 M3/M4内核寄存器▪ 1.2 A7内核寄存器▪ 1.3 ARM中的PC指针的值•二、ARM汇编语言▪ 2.1 ARM汇编基础▪ 2.2 汇编伪指令▪ 2.3 ARM汇编指令集•三、代码反汇编简析▪ 3.1 不同编译器的反汇编▪ 3.2 C 和汇编比较分析开头直接来看几个简单的汇编指令:MOV R0,R1MOV PC,R14上面的指令中使用了汇编MOV指令,但是其中的R0,R1,R14,PC分别是什么?哪来的?怎么用?要讲ARM 汇编语言,必须得先了解ARM的内核寄存器,内核处理所有的指令计算,都需要用到内核寄存器,所以ARM汇编里面指令大都是基于寄存器的操作。
文章前推荐韦东山老师的单片机核心视频,视频可以在韦东山老师官网里面找到:百问网ARM版本简单介绍:对于M3/M4而言:R13,栈指针(Stack Pointer)•R13寄存器中存放的是栈顶指针,M3/M4 的栈是向下生长的,入栈的时候地址是往下减少的。
•裸机程序不会用到PSP,只用到MSP,需要运行RTOS的时候才会用到PSP。
•堆栈主要是通过POP,PUSH指令来进行操作。
在执行PUSH 和 POP 操作时, SP 的地址寄存器,会自动调整。
R14 ,连接寄存器(Link Register)•LR 用于在调用子程序时存储返回地址。
例如,在使用BL(分支并连接,Branch and Link)指令时,就自动填充 LR 的值(执行函数调用的下一指令),进而在函数退出时,正确返回并执行下一指令。
如果函数中又调用了其他函数,那么LR将会被覆盖,所以需要先将LR寄存器入栈。
•保存子程序返回地址。
使用BL或BLX时,跳转指令自动把返回地址放入r14中;子程序通过把r14复制到PC来实现返回•当异常发生时,异常模式的r14用来保存异常返回地址,将r14如栈可以处理嵌套中断R15,程序计数器(Program Count)•在Cortex-M3中指令是3级流水线,出于对Thumb代码的兼容的考虑,读取pc时,会返回当前指令地址+4的值。
汇编语言中寄存器介绍
汇编语言中寄存器介绍寄存器是汇编语言中非常重要的概念,它们用于存储和操作数据。
在本文中,将介绍汇编语言中常用的寄存器,并详细解释它们的功能和用途。
1. 通用寄存器通用寄存器是最常用的寄存器,在汇编语言中使用频率较高。
通常有四个通用寄存器,分别是AX、BX、CX和DX。
这些寄存器既可用于存储数据,也可用于进行算术运算。
例如,将数据从内存加载到通用寄存器中,进行加法或减法运算,然后将结果存回内存。
2. 累加器寄存器累加器寄存器是AX寄存器的别名。
AX寄存器在处理循环和计数时非常有用。
它还可以用于存储需要频繁访问的数据,例如需要进行累加或累减的数值。
3. 基址寄存器基址寄存器是BX寄存器的别名。
它与偏移量配合使用,用于计算内存地址。
通常在存储大量数据的数组或缓冲区中使用。
4. 计数器寄存器计数器寄存器是CX寄存器的别名。
CX寄存器在处理循环时非常有用。
它可以作为循环计数器,用于控制循环的次数。
5. 数据寄存器数据寄存器是DX寄存器的别名。
它可以存储需要进行输入/输出操作的数据,例如从键盘读取的字符或向屏幕输出的字符。
数据寄存器还可以用于存放在算术运算中需要使用的常数。
6. 标志寄存器标志寄存器用于存储处理器运行过程中的状态信息,例如进位标志、零标志、符号标志等。
它们对于程序的条件分支非常重要,可以根据不同的标志位执行相应的操作。
7. 段寄存器段寄存器用于指示在内存中的位置。
在实模式下,由于地址总线的限制,内存地址仅能表示64KB。
因此,通过使用段寄存器,可以将内存地址拓展到1MB甚至更大。
常用的段寄存器有CS(代码段寄存器)、DS(数据段寄存器)、SS(堆栈段寄存器)和ES(附加段寄存器)。
8. 指令寄存器指令寄存器(IP)用于存储当前执行的指令在内存中的地址。
它是程序执行的关键寄存器之一,能够实现指令的顺序执行。
在汇编语言中,寄存器是程序设计中不可或缺的组成部分。
通过合理地使用和操作寄存器,能够提高程序的执行效率和性能。
ARM指令汇编语言
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 位中。
ARM中的lr寄存器
ARM中的lr寄存器/***********摘⾃《ARM LR寄存器https:///fivedoumi/article/details/50446444》********************/异常的发⽣会导致程序正常运⾏的被打断,并将控制流转移到相应的异常处理(异常响应),有些异常(fiq、irq)事件处理后,系统还希望能回到当初异常发⽣时被打断的源程序断点处继续完成源程序的执⾏(异常返回),这就需要⼀种解决⽅案,⽤于记录源程序的断点位置,以便正确的异常返回。
类似的还有⼦程序的调⽤和返回。
在主程序中(通过⼦程序调⽤指令)调⽤⼦程序时,也需要记录下主程序中的调⽤点位置,以便将来的⼦程序的返回。
在ARM处理器中使⽤ R14实现对断点和调⽤点的记录,即使⽤R14⽤作返回连接寄存器(LR)。
在硬件上和指令执⾏上,CPU ⾃动完成相应返回点的记录。
在ARM 汇编语⾔程序设计时,R14和LR通⽤。
ARM处理器相应异常时,会⾃动完成将当前的PC保存到LR寄存器。
//注意:发⽣异常时进⼊异常程序时,LR中保存的不是断点下⼀条指令,⽽是直接将PC保存到 LR中,不是将PC-4保存到LR中。
ARM处理器执⾏⼦程序调⽤指令(BL )时,会⾃动完成将当前的PC的值减去4的结果数据保存到LR寄存器。
即将调⽤指令的下紧邻指令的地址保存到LR。
ARM处理器针对不同的模式,共有6个链接寄存器资源(LR ),其中⽤户模式和系统模式共⽤⼀个 LR,每种异常模式都有各⾃专⽤的R14 寄存器(LR )。
这些链接寄存器分别为 R14、R14_svc、R14_abt、R14_und、R14_irq、R14_fiq,程序设计者要清晰处理器的模式与相应寄存器的对应关系,都是使⽤ R14,但不同模式下的R14 不是同⼀个物理资源,其内容可能天壤之别。
R14 不⽤做链接寄存器(LR )时,也可以⽤做通⽤数据寄存器。
PC 代表程序计数器,流⽔线使⽤三个阶段,因此指令分为三个阶段执⾏:1.取指(从存储器装载⼀条指令);2.译码(识别将要被执⾏的指令);3.执⾏(处理指令并将结果写回寄存器)。
ARM3_汇编指令
ARM3_汇编指令16位数据操作指令名字功能ADC 带进位加法(ADD with Carry)ADD 加法AND 按位与。
这里的按位与和C的”&”功能相同ASR 算术右移(Arithmetic Shift Right)BIC 按位清零(把一个数跟另一个无符号数的反码按位与)CMN 负向比较(把一个数跟另一个数据的二进制补码相比较)CMP 比较(Compare,比较两个数并且更新标志)CPY 把一个寄存器的值拷贝(COPY)到另一个寄存器中EOR 近位异或LSL 逻辑左移(Logic Shift Left)LSR 逻辑右移(Logic Shift Right)MOV 寄存器加载数据,既能用于寄存器间的传输,也能用于加载立即数MUL 乘法(Multiplication)MVN 加载一个数的NOT值(取到逻辑反的值)NEG 取二进制补码ORR 按位或ROR 循环右移SBC 带借位的减法SUB 减法(Subtraction)TST 测试(Test,执行按位与操作,并且根据结果更新Z)REV 在一个32位寄存器中反转(Reverse)字节序REVH 把一个32位寄存器分成两个(Half)16位数,在每个16位数中反转字节序REVSH 把一个32位寄存器的低16位半字进行字节反转,然后带符号扩展到32位SXTB 带符号(Signed)扩展一个字节(Byte)到32位SXTH 带符号(Signed)扩展一个半字(Half)到32位UXTB 无符号(Unsigned)扩展一个字节(Byte)到32位UXTH 无符号(Unsigned)扩展一个半字(Half)到32位16位转移指令名字功能B 无条件转移(Branch)B 有条件(Condition)转移BL 转移并连接(Link)。
用于呼叫一个子程序,返回地址被存储在LR中CBZ 比较(Compare),如果结果为零(Zero)就转移(只能跳到后面的指令)CBNZ 比较,如果结果非零(Non Zero)就转移(只能跳到后面的指令)IT If-Then16位存储器数据传送指令名字功能LDR 从存储器中加载(Load)字到一个寄存器(Register)中LDRH 从存储器中加载半(Half)字到一个寄存器中LDRB 从存储器中加载字节(Byte)到一个寄存器中LDRSH 从存储器中加载半字,再经过带符号扩展后存储一个寄存器中LDRSB 从存储器中加载字节,再经过带符号扩展后存储一个寄存器中STR 把一个寄存器按字存储(Store)到存储器中STRH 把一个寄存器存器的低半字存储到存储器中STRB 把一个寄存器的低字节存储到存储器中LDMIA 加载多个字,并且在加载后自增基址寄存器STMIA 存储多个字,并且在存储后自增基址寄存器PUSH 压入多个寄存器到栈中POP 从栈中弹出多个值到寄存器中其它16位指令名字功能SVC 系统服务调用(Service Call)BKPT 断点(Break Point)指令。
ARM7-寄存器总结
VIC 通道号 0 1 2 3
4
5
6
7
8 9 10 11 12 13 14 15 16 17 18 19~31
软件中断清零寄存器(VICSoftIntClear):
位
[31:0]
功能
当某位为 1 时,将清零 VICSoftInt 寄存器中对应位
保护使能寄存器(VICProtection):
11 保留 EINT0 保留 EINT1 保留 保留 保留 EINT2 保留 EINT3 保留 保留 保留 保留 保留 保留
外部存储器寄存器(PINSEL1):
端口高级功能设置
复位值 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
PINSEL1 1:0 3:2 5:4 7:6 9:8 11:10
通用输入输出口
GPIO 引脚值寄存器(IOxPIN):
IOxPIN
描述
31 : 0
GPIO 引脚值。IOxPIN[0]对应于 Px.0 … IOxPIN[31]对应于 Px.31 引脚
该寄存器反映了当前引脚的状态。
复位值 未定义
GPIO 方向控制寄存器(IOxDIR):
IOxDIR
描述
复位值
31 : 0
ARM7 寄存器
外部存储器寄存器(PINSEL0):
PINSEL0 1:0 3:2 5:4 7:6 9:8 11:10 13:12 15:14 17:16 19:18 21:20 23:22 25:24 27:26 29:28 31:30
引脚名称 P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 P0.8 P0.9 P0.10 P0.11 P0.12 P0.13 P0.14 P0.15
详解ARM处理器中的37个寄存器
详解ARM处理器中的37个寄存器ARM处理器共有37个寄存器。
其中包括:31个通用寄存器,包括程序计数器(PC)在内。
这些寄存器都是32位寄存器。
6个状态寄存器。
这些寄存器都是32位寄存器。
ARM处理器共有7种不同的处理器模式,每一种模式中都有一组相应的寄存器组。
在任何时刻,可见的寄存器包括15个通用寄存器(R0-R14),一个或两个状态寄存器及程序计数器(PC)。
在所有的寄存器中,有些是各模式公用一个物理寄存器,有一些寄存器各模式拥有自己独立的物理寄存器。
通用寄存器:通用寄存器分为以下三类:备份寄存器、未备份寄存器、程序计数器PC未备份寄存器:未备份寄存器包括R0-R7。
对于每一个未备份寄存器来说,所有处理器模式下都是使用同一个物理寄存器。
未备份寄存器没有被系统用于特别的用途,任何可采用通用寄存器的场合都可以使用未备份寄存器。
备份寄存器:对于R8-R12备份寄存器来说,每个寄存器对应两个不同的物理寄存器。
系统为将备份寄存器用于任何的特殊用途,但是当中断处理非常简单,仅仅使用R8-R14寄存器时,FIQ处理程序可以不必执行保存和恢复中断现场的指令,从而可以使中断处理非常迅速。
对于R13,R14备份寄存器来说,每个寄存器对应六个不同的物理寄存器,其中的一个是系统模式和用户模式共用的;另外的五个对应于其他的五种处理器模式。
采用下面的记号来区分各个物理寄存器:R13_其中MODE可以是下面几种模式之一:usr,svc,abt,und,irq,fiq程序计数器PC可以作为一般的通用寄存器使用,但有一些指令在使用R15时有一些限制。
由于ARM采用了流水线处理器机制,当正确读取了PC的值时,该值为当前指令地址值加上8个字节。
也就是说,对于ARM指令集来说,PC指向当前指令的下两条指令的地址。
由于ARM指令是字对齐的,PC值的第0位和第一位总为0。
需要注意的是,当使用str/stm保存R15时,保存的可能是当前指令地址值加8个字节,也可能保存的是当前指令地址值加12个字节。
ARM汇编指令
CPSR:当前程序状态寄存器,对应1个物理寄存器,任何模式均可用
SPSR:备份的程序状态寄存器,对应5个物理寄存器,除User模式外均可用
例:MOV R0,R2,LSL #3 ;R2的值左移3位,结果放入R0
ANDS R1,R1,R2,LSL R3 ;R2的值左移R3位,然后再和R1相与,结果放入R1
汇编程序框架
AREA EX,CODE,READONLY;声明一段名为EX的CODE
ENTRY ;指定函数的入口
cond:执行条件,占用[31:28],共16种,紧贴助记符,在S之前,如SUBNES
opcode:指令助记符,占用[27:21]
s:是否影响CPSR的值(有s时,即s为1时有影响),占用20位,紧贴助记符,如ADDS
Rn:第1个操作数的寄存器,占用[19:16]位,只能使用R0-R15
Rd:目标寄存器,占用[15:12]位,只能使用R0-R15
operand2:第2个操作数,占用[11:0]位,可以是寄存器R0-R15,也可以是立即数
条件码
EQ:Z为1,相等
NE:Z为0,不相等
CS:C为1,无符号数大于或等于
CC:C为0,无符号数小于
MI:N为1,负数
PL:N为0,正数或0
VS:V为1,溢出
VC:V为0,未溢出
HI:C为1,Z为0,无符号数大于
IMPORT:引入在其他源文件中定义的标号,并在当前源文件中使用
ARM汇编之寄存器
ARM汇编之寄存器在ARM处理器内部共有37个⽤户可访问的寄存器,分别为31个通⽤的32位寄存器和6个状态寄存器。
⼀.通⽤寄存器:1.在汇编语⾔中,寄存器R0-R13为保存数据或地址值的通⽤寄存器。
2.其中寄存器R0-R7为未分组的寄存器。
对于任何处理器模式,它们都共享R0~R7的通⽤寄存器。
3.寄存器R8-R12为两个分组的物理寄存器。
a.FIQ拥有⾃⼰独⽴的R8~R12的通⽤寄存器。
b.其他六种处理器模式共享R8~R12的通⽤寄存器注:寄存器R8~R12在ARM体系结构中没有特定的⽤途。
给FIQ单独的R8~R12可实现快速的中断处理(在发⽣FIQ中断后,处理器不⽤为了保护寄存器⽽浪费时间,从⽽提⾼了FIQ的处理速度)4.寄存器R13和R14a.⽤户模式和系统模式公⽤R13和R14的寄存器内容。
b.其它五个模式拥有⾃⼰独⽴的R13和r14寄存器内容。
c.R13作为堆栈指针(SP),⽤于保存待使⽤的寄存器内容。
d.寄存器R14称为链接寄存器(LR),它的作⽤有两个:当使⽤BL指令调⽤⼦程序时,系统会⾃动将 BL指令的下⼀条指令的地址存⼊R14中。
程序A指令过程中调⽤程序B程序跳转⾄标号Lable处,执⾏程序B.系统将BL Lable指令的下⼀条指令所在地址存⼊R14中程序B执⾏最后,执⾏语句MOV PC,LR将R14寄存器的内容放⼊PC处,返回⾄NEXT处继续执⾏。
●当发⽣异常时,系统⾃动将异常的返回地址放⼊R14中(有些异常有⼀个⼩的固定的偏移量)⼆.重要的寄存器1.堆栈指针R13R13作为堆栈指针SP。
在ARM指令集中,由于没有以特殊⽅式使⽤R13的指令。
(在Thumb)指令集中存在使⽤R13的指令)每个异常模式都有其⾃⾝的R13分组版本,它通常指向由异常模式所专⽤的堆栈。
在⼊⼝处,异常处理程序通常将其他要使⽤的寄存器值保存到这个堆栈。
通过返回时将这些值重装到寄存器中。
异常处理程序可确保异常发⽣时的程序状态不会被破坏。
常用ARM指令
常用ARM指令及汇编包括1、ARM处理器寻址方式2、指令集介绍3、伪指令4、ARM汇编程序设计5、C与汇编混合编程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(Logical Shift Left)逻辑左移,寄存器中字的低端空出补0(2)、LSR(Logical Shift Right)逻辑右移,寄存器中字的高端空出补0(3)、ASR(Arthmetic Shift Right)算术右移,移位中保持符号位不变,即如果源操作数为正数,字高端空出补0,否则补1(4)、ROR(Rotate Right)循环右移,由字的低端移出的位填入高端空出的位(5)、RRX(Rotate Right eXtended by 1 place),操作数右移一位,左侧空位由CPSR的C 填充4、寄存器间接寻址:寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需要的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针LDR R1,[R2] ;将R2中的数值作为地址,取出此地址中的数据保存在R1中SWP R1,R1,[R2] ;将R2中的数值作为地址,取出此地址中的数值与R1中的值交换5、基址寻址:将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址,基址寻址用于访问基址附近的存储单元,常用于查表,数组操作,功能部件寄存器访问等。
ARM汇编指令实验
ARM 汇编指令实验一一. 实验目的1.初步学会使用μVision IDE for ARM 开发环境及ARM 软件模拟器;2.通过实验掌握简单 ARM 汇编指令的使用方法。
二. 实验设备1.硬件:PC 机一台;2.软件:μVision IDE for ARM 集成开发环境,Windows 98/2000/NT/XP。
三. 实验内容1.熟悉开发环境的使用并使用 ldr/str,mov 等指令访问寄存器或存储单元;2.使用 add/sub/lsl/lsr/and/orr 等指令,完成基本算术/逻辑运算。
四. 实验原理ARM 处理器共有37 个寄存器:31 个通用寄存器,包括程序计数器(PC)。
这些寄存器都是32 位的;6 个状态寄存器。
这些寄存器也是32 位的,但是只是使用了其中的12 位。
1. ARM 通用寄存器通用寄存器(R0-R15)可分为三类:1)不分组寄存器 R0~R7不分组寄存器R0~R7 在所有处理器模式下,它们每一个都访问一样的32 位寄存器。
它们是真正的通用寄存器,没有体系结构所隐含的特殊用途。
2)分组寄存器 R8~R14分组寄存器R8~R14 对应的物理寄存器取决于当前的处理器模式。
若要访问特定的物理寄存器而不依赖当前的处理器模式,则要使用规定的名字。
寄存器R8~R12 各有两组物理寄存器:一组为FIQ 模式,另一组为除了FIQ 以外的所有模式。
寄存器R8~R12 没有任何指定的特殊用途,只是在作快速中断处理时使用。
寄存器R13,R14 各对应6 个分组的物理寄存器,1 个用于用户模式和系统模式,其它5 个分别用于5 种异常模式。
寄存器R13 通常用做堆栈指针,称为SP;寄存器R14 用作子程序链接寄存器,也称为LR。
3)程序计数器 PC寄存器R15 用做程序计数器(PC)。
在本实验中,ARM 核工作在用户模式,R0~R15 可用。
2. 存储器格式ARM 体系结构将存储器看作是从零地址开始的字节的线性组合。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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/。