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

相关推荐
聆风吟º36 分钟前
【C标准库】深入理解C语言memcmp函数:内存比较的利器
c语言·开发语言·库函数·memcmp
Yupureki1 小时前
《Linux网络编程》2.Socket编程(UDP/TCP)
linux·服务器·c语言·网络·c++·tcp/ip·udp
421!1 小时前
C语言学习笔记——10(结构体)
c语言·开发语言·笔记·stm32·学习·算法
不只会拍照的程序猿1 小时前
《嵌入式AI筑基笔记04:python函数与模块01—从C的刻板到Python的灵动》
c语言·开发语言·笔记·python
2301_789015621 小时前
C++11新增特性:列表初始化&左值引用&右值引用&万能引用&移动构造&移动赋值&引用折叠&完美转发
c语言·开发语言·c++·c++11
@insist12312 小时前
网络工程师-差错控制核心技术与软考考点全解析:CRC 校验与海明码
arm开发·网络工程师·软考·软件水平考试
三道渊13 小时前
C语言:文件I/O
c语言·开发语言·数据结构·c++
kali-Myon13 小时前
CTFshow-Pwn142-Off-by-One(堆块重叠)
c语言·数据结构·安全·gdb·pwn·ctf·
Hello World . .14 小时前
ARM裸机学习6——UART
arm开发·单片机·嵌入式硬件
计算机安禾14 小时前
【数据结构与算法】第19篇:树与二叉树的基础概念
c语言·开发语言·数据结构·c++·算法·visual studio code·visual studio