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

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 字节对齐的内存地址可能会触发异常。

 

相关文章:

ARM 汇编指令

blr指令的基本概念和用途 在 ARM64 汇编中&#xff0c;blr是 “Branch with Link to Register” 的缩写。它是一种分支指令&#xff0c;主要用于跳转到一个由寄存器指定的地址&#xff0c;并将返回地址保存到链接寄存器&#xff08;Link Register&#xff0c;LR&#xff09;中。…...

打造个性化体验:在Axure中创建你的专属组件库

打造个性化体验&#xff1a;在Axure中创建你的专属组件库 在数字产品设计的浪潮中&#xff0c;效率和一致性是设计团队追求的两大圣杯。 随着项目的不断扩展&#xff0c;重复性的工作逐渐增多&#xff0c;设计师们开始寻找能够提高工作效率、保持设计一致性的解决方案。 而 …...

如何用WordPress和Shopify提升SEO表现?

选择合适的建站程序对于SEO优化非常重要。目前&#xff0c;WordPress和Shopify是两种备受推崇的建站平台&#xff0c;各有优势。 WordPress最大的优点是灵活性。它支持大量SEO插件&#xff0c;帮助你调整元标签、生成站点地图、优化内容结构等。这些功能让你能够轻松地提升网站…...

不泄密的安全远程控制软件需要哪些技术

在数字化浪潮中&#xff0c;远程控制软件已不再是简单的辅助工具&#xff0c;而是成为企业运作和日常工作中不可或缺的一部分。随着远程办公模式的广泛采纳&#xff0c;这些软件提供了一种既安全又高效的途径来管理和访问远端系统。无论是在家办公、技术支持还是远程教育&#…...

rust高级特征

文章目录 不安全的rust解引用裸指针裸指针与引用和智能指针的区别裸指针使用解引用运算符 *&#xff0c;这需要一个 unsafe 块调用不安全函数或方法在不安全的代码之上构建一个安全的抽象层 使用 extern 函数调用外部代码rust调用C语言函数rust接口被C语言程序调用 访问或修改可…...

STM32F407简单驱动步进电机(标准库)

配置 单片机型号&#xff1a;STM32F104ZGT6 步进电机&#xff1a;YK28HB40-01A 驱动器&#xff1a;YKD2204M-Plus 接线方式&#xff1a; pu&#xff1a;接对应的产生PWM的引脚&#xff0c;这里接PF9&#xff0c;对应TIM14_CH1通道&#xff01; pu-&#xff1a;接单片机的G…...

使用热冻结数据层生命周期优化在 Elastic Cloud 中存储日志的成本

作者&#xff1a;来自 Elastic Jonathan Simon 收集数据对于可观察性和安全性至关重要&#xff0c;而确保数据能够快速搜索且获得低延迟结果对于有效管理和保护应用程序和基础设施至关重要。但是&#xff0c;存储所有这些数据会产生持续的存储成本&#xff0c;这为节省成本创造…...

LeetCode131. 分割回文串(2024冬季每日一题 4)

给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 示例 1&#xff1a; 输入&#xff1a;s “aab” 输出&#xff1a;[[“a”,“a”,“b”],[“aa”,“b”]] 示例 2&#xff1a; 输入&#xff1a;s “a…...

万字长文解读深度学习——训练(DeepSpeed、Accelerate)、优化(蒸馏、剪枝、量化)、部署细节

&#x1f33a;历史文章列表&#x1f33a; 深度学习——优化算法、激活函数、归一化、正则化深度学习——权重初始化、评估指标、梯度消失和梯度爆炸深度学习——前向传播与反向传播、神经网络&#xff08;前馈神经网络与反馈神经网络&#xff09;、常见算法概要汇总万字长文解读…...

STM32—独立看门狗(IWDG)和窗口看门狗(WWDG)

概述&#xff1a; WDG(Watchdog) 看门狗&#xff0c;看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能计时复位程序&#xff0c;避免程序陷入长时间的罢工状态&#xff0c;保证系…...

ks8 本地化部署 F5-TTS

huggingface上有一个demo可以打开就能玩 https://huggingface.co/spaces/mrfakename/E2-F5-TTS 上传了一段懂王的演讲片段&#xff0c;然后在 generate text框内填了点古诗词&#xff0c;生成后这语气这效果&#xff0c;离真懂王就差一个手风琴了。 F5-TTS 项目地址&#xf…...

Web组态大屏可视化编辑器

1、零代码、一键构建、一键下载 用户只需通过拖拉拽操作&#xff0c;即可在画布上添加、调整和排列各种设备组件、图表和控件。零代码拖拽方式让用户能够实时预览界面效果&#xff0c;直观地观察布局、样式和数据的变化。 2、实时展示&#xff0c;自动化连接数据&#xff0c;用…...

【comfyui教程】让模特换衣服,comfyui一键搞定!

前言 一键穿上别人的衣服&#xff1f;揭秘ComfyUI模特换装工作流&#xff01; 你有没有想过&#xff0c;某天早晨你起床后&#xff0c;只需轻轻一点&#xff0c;就能穿上明星昨晚在红毯上的华丽礼服&#xff1f;这种听起来像是科幻电影的情节&#xff0c;如今通过ComfyUI模特…...

数据湖与数据仓库的区别

数据湖与数据仓库是两种不同的数据存储和管理方式&#xff0c;它们在多个方面存在显著的区别。以下是对数据湖与数据仓库区别的详细阐述&#xff1a; 一、数据存储方式 数据仓库 通常采用预定义的模式和结构来存储数据。数据在存储前通常经过清洗、转换和整合等处理&#xff0…...

golang分布式缓存项目 Day6 防止缓存击穿

该项目原作者&#xff1a;https://github.com/geektutu/7days-golang。本文旨在记录本人做该项目时的一些疑惑解答以及部分的测试样例以便于本人复习。 1 缓存雪崩、缓存击穿与缓存穿透 概念解析&#xff1a; 缓存雪崩&#xff1a;缓存在同一时刻全部失效&#xff0c;造成瞬…...

Redis高可用-主从复制

这里写目录标题 Redis主从复制主从复制过程环境搭建从节点配置常见问题主从模式缺点 Redis主从复制 虽然 Redis 可以实现单机的数据持久化&#xff0c;但无论是 RDB 也好或者 AOF 也好&#xff0c;都解决不了单点宕机问题&#xff0c;即一旦 redis 服务器本身出现系统故障、硬…...

Angular框架:构建现代Web应用的全面指南

文章目录 前言一、Angular简介二、Angular的核心特性三、Angular的应用场景四、Angular的发展趋势五、如何开始使用Angular结语 前言 在当今高度竞争的互联网环境中&#xff0c;构建高效、响应迅速且易于维护的Web应用成为企业成功的关键。Angular框架以其强大的功能、灵活的架…...

Golang | Leetcode Golang题解之第563题二叉树的坡度

题目&#xff1a; 题解&#xff1a; func findTilt(root *TreeNode) (ans int) {var dfs func(*TreeNode) intdfs func(node *TreeNode) int {if node nil {return 0}sumLeft : dfs(node.Left)sumRight : dfs(node.Right)ans abs(sumLeft - sumRight)return sumLeft sumRi…...

gdb编译教程(支持linux下X86和ARM架构)

1、下载源码 http://ftp.gnu.org/gnu/gdb/ 我下载的8.2版本。 2、下载完后拷贝到linux的x86系统。 3、解压&#xff0c;然后进入到目录下&#xff0c;打开当前目录的命令行窗口。 4、创建一个生成目录。 5、我们先开始x86版本&#xff0c;这个比较简单&#xff0c;不需要配置…...

Android 开发指南:初学者入门

Android 是全球最受欢迎的移动操作系统之一&#xff0c;为开发者提供了丰富的工具和资源来创建各种类型的应用程序。本文将为你提供一个全面的入门指南&#xff0c;帮助你从零开始学习 Android 开发。 目录 1. 了解 Android 平台[1]2. 设置开发环境[2]3. 学习基础知识[3]4. 创…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...