ARM 汇编指令

  • blr指令的基本概念和用途

    • 在 ARM64 汇编中,blr是 “Branch with Link to Register” 的缩写。它是一种分支指令,主要用于跳转到一个由寄存器指定的地址,并将返回地址保存到链接寄存器(Link Register,LR)中。这个指令在函数调用过程中起到关键作用,类似于高级语言中的函数调用机制。
    • 指令格式通常为blr <Xn>,其中<Xn>是一个通用寄存器,它包含了要跳转到的目标函数或代码块的地址。当执行blr指令时,程序流程会跳转到<Xn>寄存器所指向的地址,并且会把当前指令的下一条指令地址(也就是返回地址)存入 LR 寄存器,以便在被调用的函数或代码块执行完毕后能够正确地返回到调用点。
  • blr指令在函数调用中的作用机制

    • 函数调用示例:假设我们有一个主函数和一个被调用的子函数。在主函数中,我们要调用子函数,并且在 ARM64 汇编中实现这个过程。
; 主函数部分
mov x0, #10       ; 假设设置一个参数,将10存入x0寄存器
adrp x1, my_sub_function ; 获取子函数地址所在页面的基地址,存入x1
add x1, x1, #:lo12:my_sub_function ; 计算子函数的确切地址,存入x1
blr x1            ; 跳转到子函数,将返回地址存入LR寄存器; 子函数部分(my_sub_function)
; 子函数可以从x0寄存器获取参数进行操作
;...子函数的具体操作...
ret               ; 子函数执行完毕,通过ret指令返回,ret指令会从LR寄存器获取返回地址并跳转
  • 在这个示例中,blr指令实现了从主函数跳转到子函数的操作。在跳转到子函数之前,参数可以通过寄存器(如x0)传递给子函数。当blr指令执行时,它会将主函数中blr指令的下一条指令地址存入 LR 寄存器。子函数执行完后,通过ret指令返回,ret指令会自动从 LR 寄存器中获取返回地址并跳转到主函数的相应位置,从而实现函数调用和返回的完整流程。
  • 与其他指令的对比和关联
    • b指令的对比b(分支)指令是一种简单的无条件跳转指令,它只是跳转到一个指定的地址,不会保存返回地址。而blr指令在跳转的同时保存返回地址,这使得它适用于函数调用场景。例如,b my_label只是简单地跳转到my_label标记的位置,而blr指令则用于调用一个函数或代码块,并且能够确保正确返回。
    • blr相关的指令ret指令与blr指令紧密相关。ret指令用于从一个被调用的函数或代码块返回,它的操作是从 LR 寄存器获取返回地址并跳转。在函数调用的整个过程中,blrret指令协同工作,实现了类似于高级语言中函数调用和返回的功能。另外,在设置目标地址时,adrpadd指令常常与blr指令配合使用,用于准确地定位要跳转到的函数或代码块的地址,就像前面示例中展示的那样。

 

  • str指令的基本概念

    • 在 ARM64 汇编中,str是存储(Store)指令。它的主要作用是将一个寄存器中的数据存储到内存中。ARM64 架构采用了加载 / 存储(Load/Store)架构,这意味着数据的处理和存储是分开的操作,str指令用于完成存储这一环节。
    • 指令格式通常为str <register>, [<address>],其中<register>是要存储数据的寄存器,<address>是数据存储的目标内存地址。这个内存地址可以是一个寄存器(里面存放着实际的内存地址),也可以是一个通过某种寻址方式计算出来的内存地址表达式。
  • 简单示例及说明

    • 假设我们有一个寄存器x0,里面存放着一个 32 位的数据,我们想要把这个数据存储到内存地址为0x1000的位置。可以使用以下指令:
ldr x1, =0x1000  ; 将内存地址0x1000加载到寄存器x1中
str x0, [x1]     ; 将寄存器x0中的数据存储到x1所指向的内存地址(0x1000)
  • 在这个例子中,首先通过ldr指令(加载指令)将内存地址0x1000加载到x1寄存器中。然后使用str指令,将x0寄存器中的数据存储到x1所指向的内存位置。
  • 寻址方式与str指令的结合
  • 寄存器间接寻址:这是一种常见的寻址方式。例如,str x0, [x1]就是寄存器间接寻址,内存地址由x1寄存器的值确定。这种方式很灵活,因为x1的值可以在程序运行过程中动态改变,从而可以将数据存储到不同的内存位置。
  • 基址加偏移量寻址:ARM64 还支持基址加偏移量的寻址方式。例如,str x0, [x1, #8]表示将x0中的数据存储到x1寄存器所指向的内存地址再加上偏移量8字节后的位置。这个偏移量可以是一个立即数(像这里的#8),也可以是另一个寄存器的值。
  • 预索引和后索引寻址:ARM64 中有预索引和后索引寻址方式。以预索引为例,str x0, [x1, #8]!,这里的!表示在存储操作完成后,x1寄存器的值会更新为x1 + 8,即指向存储操作后的下一个内存位置。后索引方式类似,但x1寄存器的值是在存储操作完成后才更新。
  • 数据宽度和对齐要求
  • 在 ARM64 中,str指令存储的数据宽度可以是不同的,例如 32 位(str w0, [x1])或 64 位(str x0, [x1])。这里w0是 32 位寄存器,x0是 64 位寄存器。
  • 同时,ARM64 对存储操作有内存对齐要求。对于 64 位的数据存储,内存地址通常需要是 8 字节对齐的;对于 32 位的数据存储,内存地址通常需要是 4 字节对齐的。如果不满足对齐要求,可能会导致性能下降或者产生未定义行为。例如,在某些 ARM64 处理器上,试图将一个 64 位的数据存储到一个没有 8 字节对齐的内存地址可能会触发异常。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/59819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手机ip地址异常怎么解决

在现代社会中&#xff0c;手机已成为我们日常生活中不可或缺的一部分&#xff0c;无论是工作、学习还是娱乐&#xff0c;都离不开网络的支持。然而&#xff0c;有时我们会遇到手机IP地址异常的问题&#xff0c;这不仅会影响我们的网络体验&#xff0c;还可能带来安全隐患。本文…

【Linux系统编程】第四十七弹---深入探索:POSIX信号量与基于环形队列的生产消费模型实现

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、POSIX信号量 2、基于环形队列的生产消费模型 2.1、代码实现 2.1.1、RingQueue基本结构 2.1.2、PV操作 2.1.3、构造析构…

炼码LintCode--数据库题库(级别:入门;数量:144道)--刷题笔记_01

目录 炼码LintCode--数据库题库&#xff08;级别&#xff1a;入门&#xff1b;数量&#xff1a;144道&#xff09;--刷题笔记_01入门级别的笔记CRUD基本函数及语法汇总事务锁视图 炼码LintCode–数据库题库&#xff08;级别&#xff1a;入门&#xff1b;数量&#xff1a;144道&…

本地部署Apache Answer搭建高效的知识型社区并一键发布到公网流程

文章目录 前言1. 本地安装Docker2. 本地部署Apache Answer2.1 设置语言选择简体中文2.2 配置数据库2.3 创建配置文件2.4 填写基本信息 3. 如何使用Apache Answer3.1 后台管理3.2 提问与回答3.3 查看主页回答情况 4. 公网远程访问本地 Apache Answer4.1 内网穿透工具安装4.2 创建…

Argo workflow 拉取git 并使用pvc共享文件

文章目录 拉取 Git 仓库并读取文件使用 Kubernetes Persistent Volumes&#xff08;通过 volumeClaimTemplates&#xff09;以及任务之间如何共享数据 拉取 Git 仓库并读取文件 在 Argo Workflows 中&#xff0c;如果你想要一个任务拉取 Git 仓库中的文件&#xff0c;另一个任…

Jmeter中的后置处理器(三)

9--XPath2 Extractor 功能特点 数据提取&#xff1a;使用 XPath2 表达式从 XML 响应中提取特定的数据。动态参数传递&#xff1a;将提取的数据存储为变量&#xff0c;供后续请求使用。支持丰富的表达式&#xff1a;支持复杂的 XPath2 表表达式&#xff0c;提供丰富的数据提取…

【MySQL-1】MySQL数据库的基本操作

目录 1. 整体学习思维导图 2. 数据库的创建 2.1 创建一个数据库 2.2 创建一个指定字符集和校验规则的数据库 3. 字符集和校验规则 3.1 查看系统默认字符集以及校验规则 3.2 查看数据库所支持的字符集和校验规则 3.3 不同校验规则所带来的影响 4. 操作数据库 4.1查…

UE5遇到问题记录—在sequence制作时如何让角色隐藏/显示?

遇到问题&#xff1a; 在sequence制作时如何让角色隐藏/显示&#xff1f; 解决办法&#xff1a; 在角色通道添加轨道&#xff1a;actor hide in game即可&#xff0c;添加后有可视性&#xff0c;打勾或者取消来控制角色的可见性。

文献阅读11.17

扩散波模型的物理信息神经网络 文献摘要 扩散波模型(DWM)是浅水方程的非线性二阶简化形式&#xff0c;利用DWM正问题的解可以预测水位和流量的变化。求解其逆问题可以根据观测结果确定关键参数(如曼宁系数、降雨强度等)。文章将改进后的PINN应用于DWM的正解和逆解。在正演问题…

【网络安全 | 漏洞挖掘】在重置密码流程利用请求头实现ATO

未经许可,不得转载。 文章目录 HTTP Host头漏洞发现漏洞利用漏洞影响HTTP Host头 HTTP Host头是HTTP/1.1中一个强制性的请求头,它指定了用户要访问的域名。 例如,如果用户访问 https://example.com,浏览器会发出如下带有Host头的请求: GET / HTTP/1.1 Host: example.co…

计算机网络中的数据包传输机制详解

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 计算机网络中的数据包传输机制详解 计算机网络中的数据包传输机制详解 计算机网络中的数据包传输机制详解 引言 数据包的基本概念…

Android AOSP 架构和各层次开发内容介绍

一、系统架构总况​​​​ 官方文档&#xff1a;架构概览 | Android Open Source Project (google.cn)https://source.android.google.cn/docs/core/architecture?hlzh-cn 下面是Google Android 提供的最新架构层次图&#xff1a; 图. AOSP 的软件堆栈层次 System API 表示…

shell编程--永久环境变量和字符串显位

环境变量 echo $HOME 在终端输出后会显示家目录有个root变量 我们会提出个疑问为什么平时我们在终端输入sl 或者which等等命令会输出一些内容呢&#xff0c;这是因为这些命令都有对应的环境变量。 我们查看一下环境变量 在终端输入&#xff1a; echo $PATH 我们看一下输出…

【QT】解决生成的exe文件出现“无法定位程序入口”或“找不到xxx.dll”的问题

【QT】解决生成的exe文件出现“无法定位程序入口”或“找不到xxx.dll”的问题 零、问题 使用QT编译好项目后&#xff0c;想直接在文件资源管理器中运行exe程序或想分享出去给别人使用发现出现如下问题&#xff1a; 系统错误&#xff1a;找不到xxx.dll。 无法找到入口&#x…

【网络】什么是路由器 (Router )网关设备(Gateway)?

路由器&#xff08;Router&#xff09;&#xff0c;又称路径器或网关设备&#xff08;Gateway&#xff09;&#xff0c;是一种重要的计算机网络设备。以下是关于路由器的详细解释&#xff1a; 一、路由器的定义与功能 定义&#xff1a;路由器是连接因特网中各局域网、广域网的…

GitLab 降级安装出现 500 错误,如何解决?

本文分享 GitLab 中文版在降级的过程中出现 500 错误的修复方法。 写在前面 强烈不建议大家自行降级&#xff0c;如果真有降级需求&#xff0c;要么自己能力过硬&#xff0c;要么寻求专业服务【https://dl.gitlab.cn/cm33bsfv】&#xff0c;要不出问题很麻烦&#xff01; 问…

TensorFlow 2.0 windows11 GPU 训练环境配置

前言 在一切开始之前&#xff0c;请确保你的cmd命令行和powershell命令行可以正常打开。如果不能&#xff0c;建议重装系统。我不确定这是否会影响你最终的结果&#xff0c;毕竟windows的坑太多了。 安装顺序&#xff1a;visual studio -> cuda -> cudnn -> python…

前馈神经网络 (Feedforward Neural Network, FNN)

代码功能 网络定义&#xff1a; 使用 torch.nn 构建了一个简单的前馈神经网络。 隐藏层使用 ReLU 激活函数&#xff0c;输出层使用 Sigmoid 函数&#xff08;适用于二分类问题&#xff09;。 数据生成&#xff1a; 使用经典的 XOR 问题作为数据集。 数据点为二维输入&#xff…

《操作系统 - 清华大学》3 -3:连续内存分配:内存碎片与分区的动态分配

文章目录 0. 概述1. 内存碎片问题2. 动态分配3. 首次适配算法4. 最优适配算法5. 最差适配算法 0. 概述 内存分配是操作系统管理过程中很重要的环节&#xff0c;首先需要考虑的是一块连续区域分配的过程&#xff0c;这个过程中会有很多问题&#xff0c;首先比较关注的一个问题是…

[Mysql基础]表的查询

一、表的增删改查 CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; 1.1 插入否则更新 由于 主键 或者 唯一键 对应的值已经存在而导致插入失败 -- 创建一张学生表 CREATE TABLE students (id INT UNSIGNED PR…