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

相关推荐
我们的五年1 小时前
【C语言学习】:C语言补充:转义字符,<<,>>操作符,IDE
c语言·开发语言·后端·学习
siy23332 小时前
【c语言日寄】Vs调试——新手向
c语言·开发语言·学习·算法
黄交大彭于晏2 小时前
C语言常用知识结构深入学习
c语言·学习·word
7yewh3 小时前
嵌入式知识点总结 操作系统 专题提升(一)-进程和线程
linux·arm开发·驱动开发·stm32·嵌入式硬件·mcu·物联网
可涵不会debug3 小时前
C语言文件操作:标准库与系统调用实践
linux·服务器·c语言·开发语言·c++
利刃大大5 小时前
【Linux入门】2w字详解yum、vim、gcc/g++、gdb、makefile以及进度条小程序
linux·c语言·vim·makefile·gdb·gcc
我想学LINUX6 小时前
【2024年华为OD机试】 (A卷,100分)- 微服务的集成测试(JavaScript&Java & Python&C/C++)
java·c语言·javascript·python·华为od·微服务·集成测试
雁于飞6 小时前
c语言贪吃蛇(极简版,基本能玩)
c语言·开发语言·笔记·学习·其他·课程设计·大作业
王磊鑫11 小时前
C语言小项目——通讯录
c语言·开发语言
仟濹13 小时前
【贪心算法】洛谷P1106 - 删数问题
c语言·c++·算法·贪心算法