当前位置: 首页 > news >正文

ARM64 指令用法学习整理

1. CBZ

当我们谈论ARM64指令集时,CBZ(Compare and Branch on Zero)是一种条件分支指令。它用于在寄存器上进行比较,并且如果该寄存器的值为零,则跳转到指定的标签或地址。

CBZ指令的基本语法如下:

CBZ <寄存器>,<标签>
其中,<寄存器>是一个通用寄存器(例如X0、X1等),而<标签>是跳转的目标标签或地址。

CBZ指令执行的操作如下:

比较寄存器中的值是否为零。
如果寄存器的值为零,则根据指定的标签或地址进行无条件跳转,程序继续执行跳转后的那条指令。
如果寄存器的值不为零,则程序继续顺序执行下一条指令。
下面是一个示例代码段,演示了如何使用CBZ指令:

CBZ X0, Label     ; 如果X0的值为零,跳转到Label标签处
...               ; 如果X0的值不为零,继续执行下一条指令

Label:
… ; 如果X0的值为零,从此处开始执行
在上述示例中,如果寄存器X0的值为零,则会跳转到标签Label处执行相应的代码;否则,程序将继续执行下一条指令。

值得注意的是,CBZ指令用于判断寄存器值是否为零,它不会修改寄存器的值。因此,在使用CBZ指令前,需要确保寄存器中的值已经被正确赋值。

2. adrp

ADRP指令的基本语法如下:

ADRP <寄存器>, <标签>
其中,<寄存器>是一个通用寄存器(例如X0、X1等),而<标签>是一个数据或代码段的标签。

ADRP指令执行的操作如下:

计算<标签>相对于当前指令的地址偏移量。
将地址偏移量的高32位部分(29至0位)左移12位,并存储到指定的<寄存器>中。
低12位将被清零。这是因为ARM64指令集的访存操作要求地址必须在4字节对齐上。
以下是一个示例代码段,演示了如何使用ADRP指令:

ADRP X0, Label     ; 将Label标签的地址的高32位存储到X0寄存器中
...                ; 执行其它指令
LDR X1, [X0, #Offset]   ; 加载Label标签地址加上偏移量Offset处的数据到X1寄存器中
...

Label:

在上述示例中,ADRP指令将Label标签的地址的高32位存储到X0寄存器中。然后,通过LDR指令从X0寄存器加上偏移量Offset处加载数据到X1寄存器中。

ADRP指令的主要目的是加载全局数据或代码段的地址高位,以便进行跳转、访问全局变量或执行函数等操作。通过ADRP指令和后续的LDR指令,可以实现更灵活的地址计算和访存操作。

在Linux内核启动代码primary_entry中,使用adrp指令获取Linux内核在内存中的起始页地址,页大小为4KB,由于内核启动的时候MMU还未打开,此时获取的Linux内核在内存中的起始页地址为物理地址。
adrp通过当前PC地址的偏移地址计算目标地址,和实际的物理无关,因此属于位置无关码。

[arch/arm64/kernel/head.S]
SYM_CODE_START(primary_entry)......adrp	x23, __PHYS_OFFSETand	x23, x23, MIN_KIMG_ALIGN - 1  // KASLR offset, defaults to 0......
SYM_CODE_END(primary_entry)[arch/arm64/kernel/head.S]
#define __PHYS_OFFSET	KERNEL_START  // 内核的物理地址
[arch/arm64/include/asm/memory.h]
// 内核的起始地址和结束地址在vmlinux.lds链接脚本中定义
#define KERNEL_START    _text         // 内核代码段的起始地址,也即内核的起始地址
#define KERNEL_END		_end          // 内核的结束地址[arch/arm64/include/asm/memory.h]
/** Alignment of kernel segments (e.g. .text, .data).**  4 KB granule:  16 level 3 entries, with contiguous bit* 16 KB granule:   4 level 3 entries, without contiguous bit* 64 KB granule:   1 level 3 entry*/
#define SEGMENT_ALIGN		SZ_64K[include/linux/sizes.h]
#define SZ_64K				0x00010000

adrp指令根据PC的偏移地址计算目标页地址。
首先adrp将一个21位有符号立即数左移12位,得到一个33位的有符号数(最高位为符号位),接着将PC地址的低12位清零,这样就得到了当前PC地址所在页的地址,然后将当前PC地址所在页的地址加上33位的有符号数,就得到了目标页地址,最后将目标页地址写入通用寄存器。
此处页大小为4KB,只是为了得到更大的地址范围,和虚拟内存的页大小没有关系。
通过adrp指令,可以获取当前PC地址±4GB范围内的地址。
通常的使用场景是先通过adrp获取一个基地址,然后再通过基地址的偏移地址获取具体变量的地址。

3. adr_l

adr_l是Linux内核定义的一个宏,用于获取基于PC相对偏移+/- 4 GB内的符号地址。在内核上下文中,使用adrp和add指令获取符号地址,而在内核模块上下文中,使用mov指令获取符号地址。

	[arch/arm64/include/asm/assembler.h].macro	adr_l, dst, sym
#ifndef MODULE  /* 内核上下文中 */adrp	\dst, \sym  /* 获取符号所在页的基地址 *//* :lo12:\sym - 获取符号sym的低12位地址。符号所在页的基地址加上低12位地址就得到符号的完整地址 */add	\dst, \dst, :lo12:\sym
#else  /* 内核模块上下中 *//* 将符号的bit[64:48]地址加载到dst寄存器中,同时做overflow check,其他位清零 */movz	\dst, #:abs_g3:\sym/* 将符号的bit[47:32]地址加载到dst寄存器中,不做overflow check,其他位保持不变 */movk	\dst, #:abs_g2_nc:\sym/* 将符号的bit[31:16]地址加载到dst寄存器中,不做overflow check,其他位保持不变 */movk	\dst, #:abs_g1_nc:\sym/* 将符号的bit[15:0]地址加载到dst寄存器中,不做overflow check,其他位保持不变 */movk	\dst, #:abs_g0_nc:\sym
#endif.endm

4. adr

adr指令根据PC的偏移地址计算目标地址。偏移地址是一个21位的有符号数,加上当前的PC地址得到目标地址。adr可以获取当前PC地址±1MB范围内的地址。下面是adr指令的编码格式。立即数占用21位。
以上是adr族三条指令用法参看了大神 业余程序员plus的分析,欲知详情,请戳原文链接:ARMv8汇编指令-adrp、adr、adr_l

5. blr

blr是ARM64指令集中的一条指令,用于返回到调用函数的地址并跳转到该地址执行。

blr指令的基本语法如下:

blr <寄存器>
其中,<寄存器>是一个通用寄存器(例如X0、X1等),它包含了调用函数的地址。

当执行到blr指令时,它会将寄存器中保存的地址作为返回地址,并跳转到该地址继续执行代码。这实现了函数调用的返回操作。通常,在函数调用完成后,使用blr指令返回到调用者的地址,以便程序继续执行下一条指令。

需要注意的是,blr指令只能在AArch64的执行状态下使用,不可用于AArch32代码。另外,返回地址由寄存器提供,因此寄存器中保存的地址应正确地指向调用函数的位置,否则可能导致未定义的行为或异常。

请注意,在实际的代码中,通常会有一系列先前的操作来设置返回地址,并且blr指令的使用方法可能因编程语言和上下文而有所不同。

BL 和 BLR 执行结果是将 PC 寄存器值的下一个值(也就是PC+8)放到链接寄存器 LR中, 然后将目的子程序的地址放到 PC 中。 BLR的结果 与 BL类似,但是新的PC的值是从特定的寄存器(如x2)取得。。例如:blr x2
【ARM 常见汇编指令学习 1 – 跳转指令 BL 与 BLR 区别】
举一反三:B指令只是单纯的跳转到目标地址执行(单程式/一去不复返式跳转)
BL 和 BLR 指令 跳转到目标地址执行完后,还会回到链接寄存器LR中保存的地址。

6.

7.

4.

4.

4.

麻烦帮忙详细讲解下arm64指令

以上部分内容来自ChatGPT

相关文章:

ARM64 指令用法学习整理

1. CBZ 当我们谈论ARM64指令集时&#xff0c;CBZ&#xff08;Compare and Branch on Zero&#xff09;是一种条件分支指令。它用于在寄存器上进行比较&#xff0c;并且如果该寄存器的值为零&#xff0c;则跳转到指定的标签或地址。 CBZ指令的基本语法如下&#xff1a; CBZ &…...

stable-diffusion 模型效果+prompt

摘自个人印象笔记&#xff0c;图不完整可查看原笔记&#xff1a;https://app.yinxiang.com/fx/55cda0c6-2af5-4d66-bd86-85da79c5574ePrompt运用规则及技巧 &#xff1a; 1. https://publicprompts.art/&#xff08;最适用于OpenArt 线上模型 https://openart.ai/&#xff09;…...

uniapp 小兔鲜儿 - 首页模块(1)

目录 自定义导航栏 静态结构 安全区域​ 通用轮播组件 静态结构 自动导入全局组件 全局组件类型声明 .d.ts文件 注册组件 vue/runtime-core 首页 – 轮播图指示点 首页 – 获取轮播图数据 首页 – 轮播图数据类型并渲染 首页 – 轮播图总结 首页分类 首页 – 前…...

selenium.webdriver Python爬虫教程

文章目录 selenium安装和使用 selenium安装和使用 pip install selenium 下载对应的浏览器驱动 实例化浏览器 from selenium import webdriverbrowser webdriver.Chrome()元素定位 控制浏览器...

USB-SC-09编程电缆驱动程序安装说明

USB-SC-09编程电缆驱动程序安装说明 概述 USB编程电缆是通过将电脑的USB口模拟成传统的串行口&#xff08;通常为COM3&#xff09;&#xff0c;从而使编程软件SWOPC-FXGP/WIN和GPP通过USB-SC-09编程电缆与FX系列PLC进行通信。 功能 ● 支持的操作系统Windows XP/ Windows2000 …...

ONVIF对讲功能漫谈

ONVIF对讲功能漫谈 前言一、onvif对讲功能和onvif协议关系大吗?二、如何上报设备支持onvif对讲功能呢?三、onvif协议中哪个接口上报音频解码配置?四、献上抓包报文:前言 本篇文章尝试使用提问的方式来分享onvif对讲功能那点事。 一、onvif对讲功能和onvif协议关系大吗? on…...

计算文本相似度

目录 Python中的difflib模块模块用法报告涉及的符号实现文本对比普通文本对比文本对比生成HTML报告 余弦相似度sklearn安装使用sklearn的余弦相似度词袋模型 Jaccard相似度编辑距离&#xff08;Levenshtein距离&#xff09;TF-IDFWord2VecDoc2VecBERT结论 Python中的difflib模块…...

oracle 增加控制文件

oracle 增加控制文件 1、看control_file路径 SQL> show parameter controlNAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_file_record_keep_time integer …...

OpenFeign超时时间设置不生效问题排查

最近升级springboot 3&#xff0c;突然发现配置文件中的openFeign的超时时间设置不生效了 之前配置如下&#xff1a; feign: client: config: default: connectTimeout: 3000 readTimeout: 5000 查资料都是说ribbon或者hystrix的超时时间设置问…...

Go和Java实现原型模式

Go和Java实现原型模式 下面将通过一个克隆的示例来说明原型模式的使用。 1、原型模式 原型模式是用于创建重复的对象&#xff0c;同时又能保证性能。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对 象的最佳方式之一。 这种模式是实现了一个原型接口&am…...

linux I/O性能优化

Linux 文件系统 磁盘和文件系统的关系&#xff1a; 磁盘为系统提供了最基本的持久化存储。 文件系统则在磁盘的基础上&#xff0c;提供了一个用来管理文件的树状结构。 文件系统工作原理 索引节点和目录项 文件系统&#xff0c;本身是对存储设备上的文件&#xff0c;进行组织…...

PHP最简单自定义自己的框架model使用(七)

1、实现model使用效果 2、自动加载model,KJ.php //自动加载文件public static function _autoload($className){switch ($className){//自动model类case substr($className,-5)Model:$path MODEL./.$className..php;if(is_file($path)) include $path;break;//自动加载控制器…...

程序猿成长之路之密码学篇-分组密码加密模式及IV(偏移量)的详解

Cipher.getInstance("AES/ECB/PKCS5Padding"); Cipher cipher Cipher.getInstance("AES/CBC/PKCS5Padding"); 在进行加解密编程的时候应该有很多小伙伴接触过以上的语句&#xff0c;但是大伙儿在编码过程中是否了解过ECB/CBC的含义、区别以及PKCS5Padding…...

Windows下批处理删除文件

最近我使用Maven的时候会出现下载jar包不成功的现象&#xff0c;然后需要把它删除然后重新下载&#xff0c;但是有时候文件过多&#xff0c;一个个删除太花费时间&#xff0c;所以用bat的批处理会很舒服。 bat的语法我之前没遇到过&#xff0c;然后我是边学习边试验&#xff0…...

html中文件上传储存到本地路径

第一步:写html文件 <form action"/uplode" method"post" enctype"multipart/form-data">姓名:<input type"text" name"username"><br>年龄:<input type"text" name"age"><…...

第九章 SpringBoot 自动配置原理 入门

1. 引导加载自动配置类 SpringBootApplication -- SpringBootConfiguration -- EnableAutoConfiguration -- ComponentScan //SpringBootApplicationSpringBootConfiguration EnableAutoConfiguration ComponentScan(excludeFilters { Filter(type FilterType.CUSTOM, cl…...

String str=new String(“tango“) 创建了几个对象?

面试回答 创建的对象数 应该是1个或者2个。 首先要清楚什么是对象&#xff1f; Java 是一种面向对象的语言&#xff0c;而 Java 对象在 JVM 中的存储也是有一定的结构的&#xff0c;在 HotSpot 虚拟机中&#xff0c;存储的形式就是 oop-klass model&#xff0c;即 Java 对象模型…...

引入三阶失真的非线性放大器的模拟输出及使用中值滤波器去除峰值研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

【观察者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

简介 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型模式。它定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 观察者模式使用三个类Subject、Observer和Client。Subject…...

精细解析中文公司名称:智能分词工具助力地名、品牌名、行业词和后缀提取

精细解析中文公司名称&#xff1a;智能分词工具助力地名、品牌名、行业词和后缀提取 中文公司名称分词工具&#xff0c;支持公司名称中的地名&#xff0c;品牌名&#xff08;主词&#xff09;&#xff0c;行业词&#xff0c;公司名后缀提取。 对公司名文本解析&#xff0c;识…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...