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

相关推荐
§ꦿCFོ༉7 小时前
嵌入式八股文—C语言入门学习(四)
c语言·开发语言·学习
Severus_black16 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
唐青枫18 小时前
C 语言 strcpy() 用法详解与实战 Demo
c语言
程序猿打工仔19 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
jianqiang.xue20 小时前
3倍向量算力:Arm给最小MCU装上本地AI
arm开发·人工智能·单片机
꧁细听勿语情꧂21 小时前
二叉树余题,排序、直接插入排序、希尔排序
c语言·开发语言·数据结构·算法
蜀黍@猿21 小时前
ARM 汇编入门(十二):MMU、页表与虚拟内存全解析
汇编·arm开发·stm32·mcu
是main不是漫21 小时前
【C++——类和对象(上)】筑基篇:以封装奠定面向对象之基
c语言·开发语言·c++
Felven2 天前
C. Brr Brrr Patapim
c语言·开发语言
Zwawa2 天前
嵌入式OLED表驱动菜单:用一张表、一个栈和一个窗口重写表驱动菜单
c语言·单片机·嵌入式