【ARM 嵌入式 C 入门及渐进 13 -- 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 或更高)才能访问的寄存器。如果在不允许的执行环境中尝试读取它,将引起异常。

最近更新

  1. TCP协议是安全的吗?

    2024-03-26 07:06:07       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-26 07:06:07       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-26 07:06:07       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-26 07:06:07       20 阅读

热门阅读

  1. 最长公共子序列力扣题

    2024-03-26 07:06:07       16 阅读
  2. 模式实现vue事件总线

    2024-03-26 07:06:07       17 阅读
  3. 全量知识系统 灵活的模块化框架 (Q&A)

    2024-03-26 07:06:07       22 阅读
  4. 【flutter】flutter基础总结1

    2024-03-26 07:06:07       19 阅读
  5. postman和express

    2024-03-26 07:06:07       18 阅读
  6. 自动驾驶技术的应用场景和限制

    2024-03-26 07:06:07       16 阅读
  7. Android 8.1 不可安装应用

    2024-03-26 07:06:07       17 阅读
  8. 无线网络与物联网

    2024-03-26 07:06:07       16 阅读
  9. Sentinel

    Sentinel

    2024-03-26 07:06:07      15 阅读
  10. Qt实现TFTP Server和 TFTP Client(二)

    2024-03-26 07:06:07       15 阅读
  11. AcWing 1015. 摘花生

    2024-03-26 07:06:07       25 阅读