MSR CPSR_C,#0x13 不能使用 ARM 程序集?

     2023-02-16     7

关键词:

【中文标题】MSR CPSR_C,#0x13 不能使用 ARM 程序集?【英文标题】:MSR CPSR_C, #0x13 doesn't work using ARM assembly? 【发布时间】:2013-12-18 08:27:50 【问题描述】:

我正在为 ARM Cortex A9 处理器编写裸机代码(无操作系统)。

我需要读取一个只能在主管模式下访问的寄存器(多处理器关联寄存器,MPIDR)。

当我处于用户模式并尝试使用调试器逐步执行以下指令(进入超级用户模式)时,没有任何反应。

MSR CPSR_C, #0x13

如果我尝试读取 MPIDR 寄存器,我的程序会进入未定义模式

请问你知道我错过了什么吗?

当我使用调试器窗口时,将 CPSR 寄存器的前五位强制为 b10011,它可以工作,我转到主管。

【问题讨论】:

您确定写信给CPSR_C 不是特权操作吗?保护东西没有多大意义,如果打破保护那么容易...... 我不确定,当我强制使用调试器并进入 irq 模式,然后执行相同的指令时,它可以工作。 但是如果是特权操作,我怎么能从用户模式进入超级用户模式,这不可能吗? @rony 您确实执行了“svc #0”并从用户模式执行并将执行更改为主管模式。 在此基础上进行扩展,使用来自用户的 svc/swi 指令是通往主管处理程序的直接路径,在该处理程序中,您可以做任何您想做的事情。与应用程序层和内核层不同,您必须或应该在内核中做一些事情,其他事情可以在您选择的任何地方完成。当然,您将需要编写一个 svc/swi 处理程序,并且有一种方法可以与处理程序通信您希望它做什么(因为它是一个处理程序并且您可能希望它做多件事情)立即是诱人的但是最好只使用寄存器,例如 r0。 【参考方案1】:

您不能使用直接写入 CPSR 的指令在模式之间切换 用户模式中的模式位。正确的方法是使用svc(主管调用)并执行请求的必要指令。

【讨论】:

【参考方案2】:

使用cps指令,例如

# Disable ABT, IRQ, FIQ and set SVC mode
cpsid aif, #0x13

【讨论】:

请提供一些解释,为什么您认为您提出的解决方案可能对 OP 有所帮助。

ARM 中的 VMNNM 指令

】ARM中的VMNNM指令【英文标题】:VMINNMinstructioninARM【发布时间】:2018-06-2210:32:51【问题描述】:我想知道vminnm的工作原理。由于伪代码有点不清楚,我无法理解该指令的确切功能。vminnm.f32d3,d5,d13在哪里d5=0xffd5432100000000d13=0x7ff00560... 查看详情

名称不能以c#中的''字符,十六进制值0x20开头使用xmlstring[duplicate](代码片段)

这个问题在这里已有答案: RepresentspaceandtabinXMLtag7个答案 usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Xml;usingSystem.Net;usingSystem.IO;namespaceSOAPServicesclassProgramstaticvoid... 查看详情

x86 MSR 名称的 IA32 与 MSR 前缀

...【发布时间】:2020-04-3015:41:31【问题描述】:英特尔有时使用MSR_前缀作为MSR名称,有时使用IA32_,即使是同一个MSR。例如,在SNB上,在SDMVolume4中,他们为MSR0x198记录了IA32_PERF_STATUS和MSR_PERF_STATUS,但位的值有些不同(但并不完全... 查看详情

arm汇编ldrr0=0x00000000这个=号代表啥啊

...0,0x12345678就是把0x12345678这个地址中的值存放到r0中。而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方。x86中没有ldr这种指令,因为x86的mov指令可以... 查看详情

exit.c:(.text+0x18): 使用 arm-none-eabi-gcc 时未定义对 `_exit' 的引用

】exit.c:(.text+0x18):使用arm-none-eabi-gcc时未定义对`_exit\\\'的引用【英文标题】:exit.c:(.text+0x18):undefinedreferenceto`_exit\'whenusingarm-none-eabi-gccexit.c:(.text+0x18):使用arm-none-eabi-gcc时未定义对`_exit\'的引用【发布时间】:2013-10-2512:48:16【 查看详情

如何解决mdk中,使用jlink提示错误信息read:@0x02000004

....net/qq_36347513/article/details/103099085更新了mdk5.30后,出现jlink不能使用的的情况,和下面的类似,我使用6.12驱动,单独使用jflash是可以的,但是keil下载不行,参考了上面的网站,三、解决方法使用Keil5.13版本的JLinkdll文件替换新版本... 查看详情

与 ARM Neon vtbx 的字节顺序混淆

...掩码uint8_t[16]和一个16字节数据数组uint32_t[4]。我想像这样使用vtbl“洗牌”这个数据数组:0123456789ABCDEFData||0x0,0x0,0x1,0x2|0x0,0x3,0x0,0x4||0x5, 查看详情

学习arm开发(17)

因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序,然后不断地调试。在这个程序之前,先要深入去了解ARM的... 查看详情

令状态寄存器访问指令(mrs,msr)(代码片段)

ARM中有两条指令用于在状态寄存器和通用寄存器之间传送数据。针对32位的ARM处理器,状态寄存器就是一个32位长的寄存器。每个位的含义如下图: 分成了4部分:1,条件标志位N(Negative),Z(Zero),C(Carry),V(Verflow)统称为条件标志位... 查看详情

如何在ARM中进行浮点计算?

...5。我把它们变成了十六进制的0x3fc00000和0x3fe00000。我尝试使用ADD指令进行计算,但我得到了0x7fa00000,我认为正确的答案应该是0x40500000。有没有办法解决这个问题?谢谢! 查看详情

arm汇编中ldr伪指令和ldr指令

...45678 就是把 0x12345678这个地址中的值存放到r0中。而mov不能实现这个功能,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中, 查看详情

为啥我不能使用'0x80000000'来初始化一个int数组?

】为啥我不能使用\\\'0x80000000\\\'来初始化一个int数组?【英文标题】:Whycan\'tIuse\'0x80000000\'toinitializeanarrayofint?为什么我不能使用\'0x80000000\'来初始化一个int数组?【发布时间】:2016-09-0412:22:10【问题描述】:#include<iostream>int... 查看详情

为啥使用“ld -e”选项不能更改 ELF 入口点 0x8048000?

】为啥使用“ld-e”选项不能更改ELF入口点0x8048000?【英文标题】:WhyistheELFentrypoint0x8048000notchangeablewiththe"ld-e"option?为什么使用“ld-e”选项不能更改ELF入口点0x8048000?【发布时间】:2011-12-2808:01:53【问题描述】:跟进Whyist... 查看详情

基于arm的智能灯光控制系统(10)网络节点

基于ARM的智能灯光控制系统(10)网络节点嵌入式开发培训(阶段2)底层系统开发智能灯光控制系统节点设备络通信协议//--head--cmddatacrc//0x5a0x150x0x0x协议头部(2字节)命令位(1字节)数据位(1字节)校验位(1字节)功能0x5a0x15... 查看详情

arm地址问题

ARM里终端向量表从0x0开始存放,这个0x0地址指的是什么存储器的0x0地址,ARM的地址范围是怎么规定的?有点搞不清,比如片内RAM和外部RAM的地址范围是不是0x0~xxxxxxx(不考虑大小),假设片内是8K,那么片内RAM范围是不是0~2000H,... 查看详情

arm处理器寄存器

...是同一个寄存器),6个为状态寄存器。但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处 查看详情

嵌入式arm汇编编程例题(二维数组按规律求和,求两数gcd/lcm,求数组min/max,字符串复制,排序)(代码片段)

...号DIST处期末上机考试题目!(只能用纯ARM汇编…不能调用C语言><)0x00.整数加减乘除 areatest,code,readonly entry movr0,#2 movr1,#8 getadd addr2,r1,r0;r2=r1+r0getsub subr3,r1,r0;r3=r1-r0getmul mulr4,r1,r0;r4=r1*r0getdiv;r5=r1/r0 sub... 查看详情

arm57xxdsp下的定时器pwm(代码片段)

    voidsetTimer2()//timer2*(unsignedint*)0x4A0034D0=0x7;//N6pinmux*(unsignedint*)0x4A009738=0x2;//prcm*(unsignedint*)0x48032010=0x1; 查看详情