读取arm mpu的MIDR寄存器

使用如下命令可以读取arm cpu的midr寄存器: MRC p15, 0, , c0, c0, 0; Read MIDR into Rt 在c语言中可以使用如下语句把midr寄存器的值读取到变量i中: asm ("mrc p15, 0, %0, c0, c0, 0" : "=r" (i)); 然后返回i...
使用如下命令可以读取arm cpu的midr寄存器:
MRC p15, 0,, c0, c0, 0; Read MIDR into Rt
在c语言中可以使用如下语句把midr寄存器的值读取到变量i中:
asm ("mrc p15, 0, %0, c0, c0, 0" : "=r" (i));
然后返回i即可,根据该寄存器的值可以识别mpu的版本。
midr寄存器的定义如下:
For an ARMv7 implementation by ARM, the MIDR is interpreted as:
Bits[31:24] Implementer code, must be 0x41.
Bits[23:20] Major revision number, rX.
Bits[19:16] Architecture code, must be 0xF .
Bits[15:4] ARM part number.
Bits[3:0] Minor revision number, pY
arm核的版本为rXpY。
收起
展开全文

ARM寄存器的7种工作模式

2014-10-21 17:00:10
ARM寄存器的7种工作模式 CPSR[5:0] 10000 user 10001 FIQ 10010 IRQ 10011 SVC 10111 中止 11011 未定义 11111 系统 用这两个指令读写CPRS的值 msr mrs 如: MRS R1,CPSR ; 将CPSR状态...
ARM寄存器的7种工作模式
CPSR[5:0]
10000 user
10001 FIQ
10010 IRQ
10011 SVC
10111 中止
11011 未定义
11111 系统
用这两个指令读写CPRS的值
msr
mrs
如:
MRS R1,CPSR ; 将CPSR状态寄存器读取,保存到R1中
MRS R2,SPSR ; 将SPSR状态寄存器读取,保存到R2中
MSR R1,CPSR ; 将R1状态寄存器读取,保存到CPSR中
MSR R2,SPSR ; 将R2状态寄存器读取,保存到SPSR中
工作模式
ARM微处理器支持7种工作模式,分别为:
1、用户模式(Usr)
用于正常执行程序
2、快速中断模式(FIQ)
用于高速数据传输
3、外部中断模式(IRQ)
用于通常的中断处理
4. 管理模式(svc)
操作系统使用的保护模式
5. 数据访问终止模式(abt)
当数据或指令预取终止时进入该模式,可用于虚拟存储及
存储保护。
6. 系统模式(sys)
运行具有特权的操作系统任务。
7. 未定义指令中止模式(und)
当未定义的指令执行时进入该模式,可用于支持硬件
ARM微处理器的运行模式可以通过软件改
变,也可以通过外部中断或异常处理改变。
应用程序运行在用户模式下,当处理器运行
在用户模式下时,某些被保护的系统资源是
不能被访问的。
除用户模式以外,其余的所有6种模式称之为
非用户模式,或特权模式(Privileged
Modes);其中除去用户模式和系统模式以
外的5种又称为异常模式(Exception
Modes),常用于处理中断或异常,以及需
要访问受保护的系统资源等情况。
所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式。
立即寻址
立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操
作数本身就在指令中给出,只要取出指令也就取到了操作
数。这个操作数被称为立即数,对应的寻址方式也就叫做
立即寻址。例如以下指令:
ADD R0,R0,#1 ;R0←R0+1
ADD R0,R0,#0x3f ;R0←R0+0x3f
在以上两条指令中,第二个源操作数即为立即数,要求以
“#”为前缀,对于以十六进制表示的立即数,还要求在
“#”后加上“0x”或“&”。
寄存器寻址
寄存器寻址就是利用寄存器中的数值作为操作
数,这种寻址方式是各类微处理器经常采用的
一种方式,也是一种执行效率较高的寻址方
式。
ADD R0,R1,R2 ;R0←R1+R2
该指令的执行效果是将寄存器R1和R2的内容
相加,其结果存放在寄存器R0中。
寄存器间接寻址
寄存器间接寻址就是以寄存器中的值作为操作数的地
址,而操作数本身存放在存储器中。例如以下指令:
ADD R0,R1,[R2] ;R0←R1+[R2]
LDR R0,[R1] ;R0←[R1]
在第一条指令中,以寄存器R2的值作为操作数的地
址,在存储器中取得一个操作数后与R1相加,结果存
入寄存器R0中。第二条指令将以R1的值为地址的存储
器中的数据传送到R0中。
基址变址寻址
基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)
的内容与指令中给出的地址偏移量相加,从而得到一个操作数
的有效地址:
LDR R0,[R1,#4] ;R0←[R1+4]
LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4
LDR R0,[R1] ,#4 ;R0←[R1]、R1←R1+4
LDR R0,[R1,R2] ;R0←[R1+R2]
多寄存器寻址
采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传
送。这寻址方式可以用一条指令完成传送最多16个通用寄存器
的值。以下指令:
LDMIA R0,{R1,R2,R3,R4}
;R1←[R0]
;R2←[R0+4]
;R3←[R0+8]
;R4←[R0+12]
该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长
度增加,因此,指令可将连续存储单元的值传送到R1~R4。
相对寻址
与基址变址寻址方式相类似,相对寻址以程序计数器PC的当
前值为基地址,指令中的地址标号作为偏移量,将两者相加
之后得到操作数的有效地址。以下程序段完成子程序的调用
和返回,跳转指令BL采用了相对寻址方式:
BL NEXT ;跳转到子程序NEXT处执行
……
NEXT
……
MOV PC,LR ;从子程序返回
堆栈寻址
堆栈是一种数据结构,按先进后出(First In
Last Out,FILO)的方式工作,使用一个称作堆
栈指针的专用寄存器指示当前的操作位置,堆栈
指针总是指向栈顶。
递增堆栈:向高地址方向生长
递减堆栈:向低地址方向生长
满堆栈:堆栈指针指向最后压入堆栈的有效数据项
空堆栈:堆栈指针指向下一个要放入数据的空位置
收起
展开全文

ARM寄存器的7种工作模式和几种寻址方式

千次阅读2012-06-30 19:36:25
ARM寄存器的7种工作模式 CPSR[5:0] 10000 user 10001 FIQ 10010 IRQ 10011 SVC 10111 中止 11011 未定义 11111 系统 用这两个指令读写CPRS的值 msr mrs 如: MRS R1,CPSR ; 将CPSR状态寄存器读取...
ARM寄存器的7种工作模式
CPSR[5:0]
10000 user
10001 FIQ
10010 IRQ
10011 SVC
10111 中止
11011 未定义
11111 系统
用这两个指令读写CPRS的值
msr
mrs
如:
MRS R1,CPSR ; 将CPSR状态寄存器读取,保存到R1中
MRS R2,SPSR ; 将SPSR状态寄存器读取,保存到R2中
MSR R1,CPSR ; 将R1状态寄存器读取,保存到CPSR中
MSR R2,SPSR ; 将R2状态寄存器读取,保存到SPSR中
工作模式
ARM微处理器支持7种工作模式,分别为:
1、用户模式(Usr)
用于正常执行程序
2、快速中断模式(FIQ)
用于高速数据传输
3、外部中断模式(IRQ)
用于通常的中断处理
4. 管理模式(svc)
操作系统使用的保护模式
5. 数据访问终止模式(abt)
当数据或指令预取终止时进入该模式,可用于虚拟存储及
存储保护。
6. 系统模式(sys)
运行具有特权的操作系统任务。
7. 未定义指令中止模式(und)
当未定义的指令执行时进入该模式,可用于支持硬件
ARM微处理器的运行模式可以通过软件改
变,也可以通过外部中断或异常处理改变。
应用程序运行在用户模式下,当处理器运行
在用户模式下时,某些被保护的系统资源是
不能被访问的。
除用户模式以外,其余的所有6种模式称之为
非用户模式,或特权模式(Privileged
Modes);其中除去用户模式和系统模式以
外的5种又称为异常模式(Exception
Modes),常用于处理中断或异常,以及需
要访问受保护的系统资源等情况。
所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式。
立即寻址
立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操
作数本身就在指令中给出,只要取出指令也就取到了操作
数。这个操作数被称为立即数,对应的寻址方式也就叫做
立即寻址。例如以下指令:
ADD R0,R0,#1 ;R0←R0+1
ADD R0,R0,#0x3f ;R0←R0+0x3f
在以上两条指令中,第二个源操作数即为立即数,要求以
“#”为前缀,对于以十六进制表示的立即数,还要求在
“#”后加上“0x”或“&”。
寄存器寻址
寄存器寻址就是利用寄存器中的数值作为操作
数,这种寻址方式是各类微处理器经常采用的
一种方式,也是一种执行效率较高的寻址方
式。
ADD R0,R1,R2 ;R0←R1+R2
该指令的执行效果是将寄存器R1和R2的内容
相加,其结果存放在寄存器R0中。
寄存器间接寻址
寄存器间接寻址就是以寄存器中的值作为操作数的地
址,而操作数本身存放在存储器中。例如以下指令:
ADD R0,R1,[R2] ;R0←R1+[R2]
LDR R0,[R1] ;R0←[R1]
在第一条指令中,以寄存器R2的值作为操作数的地
址,在存储器中取得一个操作数后与R1相加,结果存
入寄存器R0中。第二条指令将以R1的值为地址的存储
器中的数据传送到R0中。
基址变址寻址
基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)
的内容与指令中给出的地址偏移量相加,从而得到一个操作数
的有效地址:
LDR R0,[R1,#4] ;R0←[R1+4]
LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4
LDR R0,[R1] ,#4 ;R0←[R1]、R1←R1+4
LDR R0,[R1,R2] ;R0←[R1+R2]
多寄存器寻址
采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传
送。这寻址方式可以用一条指令完成传送最多16个通用寄存器
的值。以下指令:
LDMIA R0,{R1,R2,R3,R4}
;R1←[R0]
;R2←[R0+4]
;R3←[R0+8]
;R4←[R0+12]
该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长
度增加,因此,指令可将连续存储单元的值传送到R1~R4。
相对寻址
与基址变址寻址方式相类似,相对寻址以程序计数器PC的当
前值为基地址,指令中的地址标号作为偏移量,将两者相加
之后得到操作数的有效地址。以下程序段完成子程序的调用
和返回,跳转指令BL采用了相对寻址方式:
BL NEXT ;跳转到子程序NEXT处执行
……
NEXT
……
MOV PC,LR ;从子程序返回
堆栈寻址
堆栈是一种数据结构,按先进后出(First In
Last Out,FILO)的方式工作,使用一个称作堆
栈指针的专用寄存器指示当前的操作位置,堆栈
指针总是指向栈顶。
递增堆栈:向高地址方向生长
递减堆栈:向低地址方向生长
满堆栈:堆栈指针指向最后压入堆栈的有效数据项
空堆栈:堆栈指针指向下一个要放入数据的空位置
收起
展开全文
存储数据结构任务user

ARM访问实现自定义系统寄存器

2018-01-28 16:31:52
ARMv8中,取消了协处理器,之前协处理器实现的功能,全部由系统寄存器来是实现。对于系统寄存器的访问,使用mrs,msr指令来访问。 指令编码如下: ...如下图所示,更多的系统寄存器的编码,查看arm-spec。
ARMv8中,取消了协处理器,之前协处理器实现的功能,全部由系统寄存器来是实现。对于系统寄存器的访问,使用mrs,msr指令来访问。
指令编码如下:
L: 1, mrs,读取系统寄存器值到通用寄存器中
L: 0, msr,将通用寄存器值写入到系统寄存器中
而系统寄存器的编码,由op1,CRn,CRm,op2来决定。如下图所示,更多的系统寄存器的编码,查看arm-spec。
比如,我要读取 OSDTRRX_EL1 系统寄存器,就可以使用 mrs 指令
mrs x0, OSDTRRX_EL
op1,CRn,CRm,op2的编码组合有很多,arm并没有将所有的组合,均定义系统寄存器。对于未使用的编码组合,arm允许实现自定义这些系统寄存器的功能,比如gic的寄存器。
如下图,是GIC寄存器的编码组合。
对于这些实现自定义的系统寄存器,在写汇编程序的时候,是不能通过系统寄存器的名字去访问的,否则编译会报错。比如要访问 ICH_HCR_EL2,是不能通过以下指令去访问的。
mrs x0, ICH_HCR_EL2
为了解决访问自定义系统寄存器,arm定义了以下格式,来表示系统寄存器。
S____
访问实现自定义寄存器,使用上述格式,来表示系统寄存器。
比如,对于上图中的GIC的寄存器ICH_HCR_EL2,就可以
mrs x0, S3_4_12_11_0
为了写代码的方便,可以定义以下宏:

#define ICH_HCR_EL2S3_4_12_11_0
#define ICH_VTR_EL2S3_4_12_11_1
#define ICH_MISR_EL2S3_4_12_11_2
#define ICH_EISR_EL2S3_4_12_11_3
#define ICH_ELRSR_EL2S3_4_12_11_5
#define ICH_VMCR_EL2S3_4_12_11_7

这样,在写代码的时候,就可以直接用系统寄存器的名字。

msr ICH_HCR_EL2 x0
mrs x1 ICH_VTR_EL2
msr ICH_MISR_EL2x2

收起
展开全文

ARM汇编学习之寄存器

2011-01-20 14:25:00
ARM寄存器学习汇编那么一定要对寄存器非常了解,因为汇编程序是直接针对寄存器操作的。人们也习惯的称我们为“会说话的寄存器”。注:1.当指令对R15的读取没有超过任何对R15使用的限制时,对R15读取的值是指令的...
收起
汇编任务c语言

寄存器

2018-04-23 23:10:32
不同的CPU,寄存器的结构和个数是不同的。ARM64有31个64位的寄存器,x0~x30,通常用来存放一般性的数据,被称为通用寄存器。 w0~w28是32位的寄存器,因为64...mov只是读取内存的值,但是不会对内存中的值进行修...
收起

嵌入式系统/ARM技术中的ARM伪指令之地址读取:ADR ADRL LDR

2020-11-08 00:22:32
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的...
收起

与或左移右移操作在控制寄存器配置中的作用

千次阅读2019-11-14 15:15:50
1.寄存器操作的要求(特定位改变而不影响其他位) (1)arm是统一编址的,arm中有很多内部外设,soc通过向这些内部外设的寄存器写入一些特定的值来完成操作。...读取一次寄存器的值时32位的(一个int),...
收起

mdk中c代码读取r0 r1 r2 lr sp pc的值

2021-03-05 13:37:29
最近调试rt thread总是出现Execption故障,想读取一个cpu的寄存器内容,在keil mdk下使用的,注意本代码只能在arm_cc编译器下使用,不能用于gnu_cc。 1、c语言中内嵌汇编,读取cpu寄存器 __asm int readr0(void){...
收起

在Linux用户层使用MMAP对寄存器进行读写

2021-03-23 10:22:47
最近需要在嵌入式系统上调试驱动程序,需要在用户态下频繁读取ARM的寄存器的值。 为了方便测试,发现可以在用户态下,通过mmap函数将设备节点/dev/mem进行映射,实现在用户态下将物理地址映射到虚拟地址,并通过对...
收起

ARM 汇编特殊操作指令

2020-04-23 21:29:12
【例】:MRC p15, 0, r0, c0, c0, 0	// 将CP15 中c0寄存器的值读取到r0 寄存器 MRC:将CP15 协处理器中的寄存器数据读到ARM 寄存器中 MCR:将ARM 寄存器的数据写入到 CP15 协处理器寄存器中 CP15 协处理器...
收起
嵌入式内核

ARM处理器的未定义指令异常处理过程分析

千次阅读2018-12-10 20:57:18
在前面的两篇文章中已经介绍了ARM处理器的工作...可以通过读取CPSR寄存器的值来判定是否真的进入了未定义指令模式。 开发板:tiny4412; 工具链版本:gcc version 4.5.1 (ctng-1.8.1-FA) 主要设置以下几个文件...
收起

ARM伪指令之地址读取:ADR ADRL LDR

2012-02-11 20:01:45
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的...
收起
编译器汇编

iOS汇编基础(二)寄存器

2018-05-08 02:53:50
以arm64为例 xcode调试汇编 1. xcode 查看运行时的汇编代码 debug -> debug workflow -> always showdisassembly 2. Xcode改变pc值 register write pc 0x...4.读取某个寄存器 (lldb) register read x0 x...
收起

ARM伪指令之地址读取:ADR/ADRL/LDR

千次阅读2012-10-15 16:56:07
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。 在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器 用一条ADD指令或SUB指令来实现该ADR伪指令...
收起
编译器汇编网络

ARM学习笔记9——ARM汇编汇编语言中的伪指令

2019-07-27 07:01:26
一、ADR伪指令 1、作用 ADR是小范围地址读取伪指令,基于PC相对偏移地址或基于寄存器相对偏移地址读取到寄存器中,当地址值是字节对齐时,取值范围为-255到255,当地址值是字对齐时,取值范围-1020到1020 2、语法...
收起

ARM汇编中的标号

2017-03-29 22:32:33
ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成... ldr r0, 0x12345678 就是把0x12345678这个地址中的值存放到r0中。而mov不能实现这个功能,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器
收起

5.4.1arm定时器的原理

2020-10-28 17:03:28
开始是完全轮询的模式,来检测按键是否按下 cpu还是要有delay,时间...记录了当前寄存器的值 1定时钟周期 2通过写操作,把current value寄存器的·置进行清0,这个操作会导致我们标志位清楚 3操作内第一个寄存器,.
收起

ARM-Linux问题集锦

2015-05-22 19:48:46
当计算机需要一个数值的时候,会先把内存中(ARM处理寄存器地址)的值读取到寄存器(这 里指的是r0-r1....r15),然后下次在使用该值的时候就直接读取寄存器(r0-r1....r15)中的值 了。加上volatile之后,程序就
收起

arm指令MOV和ldr的区别

2014-11-25 20:37:34
内存中某处读取到寄存器中,只能使用ldr 比如: ldr r0, 0x12345678 就是把0x12345678这个地址中的值存放到r0中。 而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中
收起

ARM中的ldr指令(发现有些网友说的是错的啊)

2012-11-08 20:24:33
ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S...就是把0x12345678这个地址中的值存放到r0中。而mov不能实现这个功能,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片
收起
linux内核makefileMakefile嵌入式操作系统

arm中ldr与mov指令的区别

2015-09-04 12:13:55
ARM是RISC结构,数据从内存到CPU之间的移动...就是把0x12345678这个地址中的值存放到r0中。 而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地
收起

arm指令中mov和ldr的区别

2015-07-29 16:04:37
ARM是RISC结构,数据从内存到CPU之间的移动...就是把0x12345678这个地址中的值存放到r0中。 而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地
收起

读书笔记| (三)ARM9 嵌入式学习:ARM实验篇

2016-03-20 21:45:16
读书笔记|ARM9 嵌入式学习1. GPIO实验1.1 应用:点亮LED1.2 GPIO ...输入状态,读取该寄存器值,即可判断引脚状态 输出状态,写值入该寄存器,可令引脚输出高、低电平 1.3.3 上拉电阻使能寄存器GPx
收起
读书笔记嵌入式

ARM中MOV与LDR的区别

千次阅读2018-02-02 11:02:16
ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成...比如想把数据从内存中某处读取到寄存器中,只能使用ldr 比如: ldr r0, 0x12345678 就是把0x12345678这个地址中的值存放到r0中。 而mov不能干这个...
收起

[ARM]ARM汇编指令

2018-01-31 17:42:08