【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架构下特定的系统寄存器,但使用时需要确保有相应的权限,并且了解直接操作系统寄存器可能带来的风险。

相关推荐
努力努力再努力wz2 小时前
【MySQL进阶系列】一文打通事务机制:从锁、Undo Log 到 MVCC 与隔离级别
c语言·数据结构·数据库·c++·mysql·算法·github
薇茗2 小时前
【初阶数据结构】 左右逢源的分支诗律 二叉树1
c语言·数据结构·算法
eDEs OLDE3 小时前
CC++链接数据库(MySQL)超级详细指南
c语言·数据库·c++
广州山泉婚姻3 小时前
C语言三种基本程序结构详解
c语言·开发语言
上弦月-编程3 小时前
【C语言】函数栈帧的创建与销毁(底层原理)
c语言·开发语言
Hhy_11073 小时前
【从零开始学习数据结构 ④】:栈 ——后进先出的艺术
c语言·数据结构·学习·visual studio
爱编码的小八嘎3 小时前
c语言完美演绎9-17
c语言
广州山泉婚姻3 小时前
C++ STL Vector 入门与实战全攻略
c语言·c++
我不是懒洋洋5 小时前
【数据结构】排序算法(直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序)
c语言·数据结构·c++·经验分享·算法·排序算法
辛苦才能5 小时前
数据结构--排序--插入排序(C语言,重点排序面试和比赛都会考察)
c语言·数据结构·面试