【ARM 嵌入式 C 入门及渐进 6.2 -- ARMv8 C 内嵌汇编读系统寄存器的函数实现】

请阅读【嵌入式开发学习必备专栏】


文章目录

    • [ARMv8 C 内嵌汇编读系统寄存器](#ARMv8 C 内嵌汇编读系统寄存器)

ARMv8 C 内嵌汇编读系统寄存器

要在ARMv8架构中通过C代码和内嵌汇编来读取系统寄存器s3_0_c15_c5_5的值,并将其返回,可以按照以下方式实现system_read_reg函数:

c 复制代码
#include <stdint.h>

uint64_t system_read_reg(void) 
{
    uint64_t val;
    __asm__ volatile(
        "mrs %0, s3_0_c15_c5_5" // 使用mrs指令从寄存器读取值
        : "=r" (val) // 输出操作数,将读取的值存入val变量
        : // 没有输入操作数
        : // 没有破坏的寄存器列表
    );
    return val;
}

这里的解释如下:

  • __asm__ 关键字用于嵌入汇编代码,而 volatile 表示编译器不应优化此代码,因为它的执行可能会影响程序的状态。
  • "mrs %0, s3_0_c15_c5_5" 是汇编指令,其中 mrs 是从系统寄存器读取值的指令。s3_0_c15_c5_5 是源寄存器的名称,%0 代表这条指令的第一个(也是唯一的一个)输出操作数。
  • "=r" (val) 定义了一个输出操作数。这里 =r 表示使用任意的通用寄存器来存储输出值,并且这个值会被存入 val 变量中。等号 (=) 指明这是一个输出操作数。
  • 在冒号之后的两个空部分分别表示没有输入操作数和没有寄存器会被此指令破坏或改变(除了通过输出明确指定以外)。

通过上述方式,可以把系统寄存器s3_0_c15_c5_5中的值读取到一个uint64_t类型的变量中,并通过函数返回这个值。这种方法允许直接访问和操作ARM架构下特定的系统寄存器,但使用时需要确保有相应的权限,并且了解直接操作系统寄存器可能带来的风险。

相关推荐
暮鹤筠23 分钟前
[C语言初阶]操作符
c语言·开发语言
阿捏利5 小时前
C Primer Plus 第6版 编程练习——第7章(上)
c语言·编程题·c primer plus
jz_ddk6 小时前
[实战]调频(FM)和调幅(AM)信号生成(完整C语言实现)
c语言·算法·信号处理
wwwlyj1233216 小时前
arm架构,arm内核,处理器之间的关系
arm开发
码农Cloudy.7 小时前
C语言<数据结构-链表>
c语言·数据结构·链表
星竹晨L7 小时前
C语言——预处理详解
c语言·开发语言
lightqjx8 小时前
【数据结构】顺序表(sequential list)
c语言·开发语言·数据结构·算法
小立爱学习8 小时前
Linux 内存管理之address_space
linux·c语言
玖別ԅ(¯﹃¯ԅ)10 小时前
文件追加模式:编写一个程序,向一个已存在的文件末尾追加内容。
c语言
C语言小火车13 小时前
野指针:C/C++内存管理的“幽灵陷阱”与系统化规避策略
c语言·c++·学习·指针