【ARM64 常见汇编指令学习 24 -- ARM 带返回值的汇编函数】


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


文章目录

在 ARMv8 架构中,系统寄存器的访问通常使用专有的指令。对于 MPIDR_EL1(多处理器亲和性寄存器),可以使用 MRS(Move System Register)指令将其值读取到一个通用寄存器中。

下面是一个以内联汇编写成的函数,用来读取 MPIDR_EL1 寄存器的值并返回:

uint64_t read_mpidr_el1(void) 
{ 
	uint64_t value; 

	__asm__ volatile("MRS %0, MPIDR_EL1" : "=r" (value)); 

	return value; 
} 

这里 %0 是输出操作数的占位符,代表 value 变量。"=r" 是输出约束,指示编译器 value 是一个输出操作数,它将被分配到一个寄存器中,并且在执行 MRS 指令后它将包含该寄存器的值。

如果想要写一个纯汇编的函数,可以这样实现:

	.global read_mpidr_el1 
	.text 
read_mpidr_el1: 
	MRS X0, MPIDR_EL1 
	RET 

在这个纯汇编函数中,MPIDR_EL1 寄存器的值被读入 X0 寄存器(ARMv8 架构的第一个通用寄存器),然后该函数通过 RET 指令返回。在 ARMv8 架构中,函数的返回值通常通过 X0 寄存器传递。

请注意,无论是内联汇编还是纯汇编函数,都需要在拥有适当权限的执行环境中运行,因为 MPIDR_EL1 是一个只有在特定执行级别(EL1 或更高)才能访问的寄存器。如果在不允许的执行环境中尝试读取它,将引起异常。

MPIDR_EL1寄存器

多核处理器的亲和寄存器,每个处理器单元都具有独立该寄存器。该寄存器值为该处理单元的另一种标识、表示对应处理器单元的亲和力,该值用于系统调度。
在这里插入图片描述

  • AFF0 :表示一个 core 中的第几个 thread,大多数 core 都是 single-threaded core,所以大多数 core 中的该值是 0.
  • AFF1:表示一个 cluster 中的第几个 cpu
  • AFF2/AFF3:表示系统中的第几个 cluster,这个值由 SOC 厂商给 core 的输入信号决定

推荐阅读:
https://www.bilibili.com/read/cv31048463/

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

主公CodingCos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值