ARM64常见指令


### 📌 栈操作和函数框架设置


`.text:00000000000038D0                 SUB             SP, SP, #0x30`

**SUB SP, SP, #0x30**: 为本地变量在堆栈上分配48字节的空间(0x30字节)。

`.text:00000000000038D4                 STP             X29, X30, [SP,#0x20+var_s0]`

**STP X29, X30, [SP,#0x20+var_s0]**: 将帧指针(X29)和链接寄存器(X30)以对的形式存储到栈中。


`.text:00000000000038D8                 ADD             X29, SP, #0x20`

**ADD X29, SP, #0x20**: 设置新的帧指针,指向当前堆栈指针SP加上0x20的地址。

### 📌 加载字符串地址和处理字符


`.text:00000000000038DC                 ADRL            X8, aAlice ; "Alice"`

**ADRL X8, aAlice**: 将字符串"Alice"的地址加载到X8寄存器中。

`.text:00000000000038E4                 LDR             W9, [X8] ; "Alice"`

**LDR W9, [X8]**: 从X8寄存器指向的内存地址加载一个32位字到W9寄存器。

`.text:00000000000038E8                 SUB             X1, X29, #-var_8`

**SUB X1, X29, #-var_8**: 将X29寄存器的值减去-var_8,并将结果存储到X1寄存器。

`.text:00000000000038EC                 STUR            W9, [X29,#var_8]`

**STUR W9, [X29,#var_8]**: 将W9寄存器中的值存储到X29寄存器加上var_8偏移地址指向的内存中。

`.text:00000000000038F0                 LDRH            W8, [X8,#(aAlice+4 - 0x12A3)] ; "e"`

**LDRH W8, [X8,#(aAlice+4 - 0x12A3)]**: 从X8寄存器加上偏移地址处加载一个半字(16位)到W8寄存器。

`.text:00000000000038F4                 STURH           W8, [X29,#var_4]`

**STURH W8, [X29,#var_4]**: 将W8寄存器中的值存储到X29寄存器加上var_4偏移地址指向的内存中。

`.text:00000000000038F8                 MOV             W8, #0x1E`

**MOV W8, #0x1E**: 将立即数0x1E加载到W8寄存器中。

`.text:00000000000038FC                 STUR            W8, [X29,#var_C]`

**STUR W8, [X29,#var_C]**: 将W8寄存器中的值存储到X29寄存器加上var_C偏移地址指向的内存中。

### 📌 浮点操作和内存访问


`.text:0000000000003900                 MOV             W8, #0x42830000`

**MOV W8, #0x42830000**: 将立即数0x42830000加载到W8寄存器中。

`.text:0000000000003904                 FMOV            S0, W8`

**FMOV S0, W8**: 将W8寄存器中的值移动到S0浮点寄存器中。

`.text:0000000000003908                 STR             S0, [SP,#0x20+var_10]`

**STR S0, [SP,#0x20+var_10]**: 将S0寄存器中的值存储到堆栈指针加上var_10偏移地址指向的内存中。

`.text:000000000000390C                 LDUR            W2, [X29,#var_C]`

**LDUR W2, [X29,#var_C]**: 从X29寄存器加上var_C偏移地址处加载一个字到W2寄存器。

`.text:0000000000003910                 LDR             S0, [SP,#0x20+var_10]`

**LDR S0, [SP,#0x20+var_10]**: 从堆栈指针加上var_10偏移地址处加载一个浮点数到S0寄存器。

`.text:0000000000003914                 FCVT            D0, S0`

**FCVT D0, S0**: 将S0寄存器中的单精度浮点数转换为D0寄存器中的双精度浮点数。

### 📌 打印和返回


`.text:0000000000003918                 ADRL            X0, aNameSAgeDWeigh ; "Name = %s, Age = %d, Weight = %.1f\n"`

**ADRL X0, aNameSAgeDWeigh**: 将字符串"Name = %s, Age = %d, Weight = %.1f\n"的地址加载到X0寄存器中。

`.text:0000000000003920                 BL              .printf`

**BL .printf**: 调用printf函数,并保存返回地址。

`.text:0000000000003924                 FMOV            S0, #10.0`

**FMOV S0, #10.0**: 将浮点数10.0加载到S0寄存器中。

`.text:0000000000003928                 STR             S0, [SP,#0x20+var_14]`

**STR S0, [SP,#0x20+var_14]**: 将S0寄存器中的值存储到堆栈指针加上var_14偏移地址指向的内存中。

`.text:000000000000392C                 LDR             S0, [SP,#0x20+var_14]`

**LDR S0, [SP,#0x20+var_14]**: 从堆栈指针加上var_14偏移地址处加载一个浮点数到S0寄存器。

`.text:0000000000003930                 FCVT            D0, S0`

**FCVT D0, S0**: 将S0寄存器中的单精度浮点数转换为D0寄存器中的双精度浮点数。

`.text:0000000000003934                 ADRL            X0, a0f ; "%.0f\n"`

**ADRL X0, a0f**: 将字符串"%.0f\n"的地址加载到X0寄存器中。

`.text:000000000000393C                 BL              .printf`

**BL .printf**: 调用printf函数,并保存返回地址。

### 📌 函数结尾和返回

`.text:0000000000003940                 LDP             X29, X30, [SP,#0x20+var_s0]`

**LDP X29, X30, [SP,#0x20+var_s0]**: 从栈中加载帧指针(X29)和链接寄存器(X30)。

`.text:0000000000003944                 ADD             SP, SP, #0x30`

**ADD SP, SP, #0x30**: 释放48字节的栈空间。

`.text:0000000000003948                 RET`

**RET**: 返回调用者,执行函数返回。


### 数据处理指令

#### MOV - 数据传送

**作用**: 将一个值传送到寄存器中。

`MOV X0, X1        ; 将X1寄存器的值传送到X0寄存器 MOV X0, #42       ; 将立即数42加载到X0寄存器`


#### ADD/SUB - 加法/减法

**作用**: 对寄存器中的值进行加法或减法操作。

`ADD X0, X1, X2    ; X0 = X1 + X2 SUB X0, X1, #10   ; X0 = X1 - 10`


#### MUL/DIV - 乘法/除法

**作用**: 对寄存器中的值进行乘法或除法操作。

`MUL X0, X1, X2    ; X0 = X1 * X2 UDIV X0, X1, X2   ; X0 = X1 / X2 (无符号除法)`


### 逻辑指令

#### AND/ORR/EOR - 与/或/异或

**作用**: 对寄存器中的值进行位运算。

`AND X0, X1, X2    ; X0 = X1 & X2 ORR X0, X1, X2    ; X0 = X1 | X2 EOR X0, X1, X2    ; X0 = X1 ^ X2`


#### LSL/LSR - 逻辑左移/右移

**作用**: 对寄存器中的值进行位移操作。

`LSL X0, X1, #3    ; X0 = X1 << 3 (逻辑左移3位) LSR X0, X1, #2    ; X0 = X1 >> 2 (逻辑右移2位)`

### 内存访问指令

#### LDR/STR - 加载/存储

**作用**: 从内存加载数据到寄存器,或将寄存器中的数据存储到内存。

`LDR X0, [X1, #8]  ; 从内存地址(X1 + 8)加载数据到X0 STR X0, [X1, #8]  ; 将X0的数据存储到内存地址(X1 + 8)`


#### LDUR/STUR - 未对齐加载/存储

**作用**: 从未对齐地址加载或存储数据。

`LDUR X0, [X1, #8] ; 从未对齐地址(X1 + 8)加载数据到X0 STUR X0, [X1, #8] ; 将X0的数据存储到未对齐地址(X1 + 8)`


### 分支指令

#### B - 无条件跳转

**作用**: 无条件跳转到指定的标签。

`B label           ; 跳转到label标签 label:     ; 目标代码`


#### BL - 跳转并链接

**作用**: 跳转到子函数,并保存返回地址。

`BL func           ; 跳转到func函数,并保存返回地址 func:     ; 函数代码 RET               ; 返回调用者`


#### BR - 寄存器跳转

**作用**: 跳转到寄存器中存储的地址。

`BR X0             ; 跳转到X0寄存器中存储的地址`


#### CBNZ/CBZ - 条件跳转

**作用**: 当寄存器不为零或为零时进行跳转。

`CBNZ X0, label    ; 如果X0不为零,跳转到label标签 CBZ X0, label     ; 如果X0为零,跳转到label标签`


### 条件指令

#### CMP - 比较

**作用**: 比较两个寄存器的值,设置条件标志。

`CMP X0, X1        ; 比较X0和X1`


#### CSEL - 条件选择

**作用**: 根据条件标志选择两个寄存器中的一个。

`CSEL X0, X1, X2, EQ  ; 如果条件标志为EQ(相等),则X0 = X1,否则X0 = X2`

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

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

相关文章

show/hide信号演示

代码&#xff1a; #include <gtk-2.0/gtk/gtk.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <glib-2.0/glib.h> #include <stdio.h>gint delete_event(GtkWidget *window, GdkEvent *event, gpointer data) {gtk_widget_hide(window);return TRU…

SpringBoot + Vue 实现 AES 加密和 AES 工具类总结

目录 一、加密知识回顾 AES加密模式 二、Java 自定义 AES 工具类 三、SpringBoot 实现 AES 加密登陆 controller 层 server 层 四、Vue 实现 AES 加密登陆 五、前端AES工具类 六、实现结果 一、加密知识回顾 密钥是AES算法实现加密和解密的根本。对称加密算法之所以…

基于MATLAB仿真LFM线性调频信号

基于MATLAB仿真LFM线性调频信号 目录 前言 一、LFM信号简介 二、LFM信号基本原理 三、LFM信号仿真 四、代码 总结 前言 仿真中的接收信号&#xff0c;有时为了简单会直接用一个正弦波代替&#xff0c;但实际中接收到的信号极少是点频信号&#xff0c;一般都是PSK信号、OF…

MySQL事务、数据库的存储引擎

目录 1. 事务的概念 1.1事务的 ACID 2. 存储引擎 2.1 存储引擎 2.2 常用存储引擎 3.MyISAM 3.1 MyISAM 表支持 3 种不同的存储格式​编辑 3.2 适用的生产场景 4. InnoDB 4.1 InnoDB特点 4.2 适用生产场景分析 5. MyISAM 和 InnoDB 的区别 6. 命令操作 7. 死锁 7.…

EasyExcel 导出批注信息

1. 批注信息 package com.xxx.demo;import lombok.Getter;/*** This class represents the comment information associated with a specific cell in an Excel sheet.* The columnIndex field specifies the column number of the cell, and the comment field stores the te…

计算机系统基础实训八—ProxyLab实验

实验目的与要求 1、让学生应用套接字接口实现网络编程&#xff1b; 2、让学生理解Web服务器开发的相关知识&#xff1b; 3、让学生应用并发编程技术进行并发服务器的开发&#xff1b; 实验原理与内容 Web代理是一种在Web浏览器和终端服务器之间充当中介角色的程序。在Web代…

java-正则表达式 1

Java中的正则表达式 1. 正则表达式的基本概念 正则表达式&#xff08;Regular Expression, regex&#xff09;是一种用于匹配字符串中字符组合的模式。正则表达式广泛应用于字符串搜索、替换和解析。Java通过java.util.regex包提供了对正则表达式的支持&#xff0c;该包包含两…

使用Vue实现Excel文件的导入与导出

在现代Web应用中&#xff0c;数据的导入与导出是常见的需求之一。本文将介绍如何在Vue项目中实现Excel文件的导入与导出功能。我们将使用流行的xlsx库来处理Excel文件&#xff0c;并结合file-saver库来实现文件的保存。此外&#xff0c;还会展示如何使用Element UI实现文件上传…

堆排序的实现原理

一、什么是堆排序&#xff1f; 堆排序就是将待排序元素以一种特定树的结构组合在一起&#xff0c;这种结构被称为堆。 堆又分为大根堆和小根堆&#xff0c;所谓大根堆即为所有的父节点均大于子节点&#xff0c;但兄弟节点之间却没有什么严格的限制&#xff0c;小根堆恰恰相反&a…

Spring注解-@RestControllerAdvice

Spring注解-RestControllerAdvice RestControllerAdvice注解是什么 RestControllerAdvice是一个组合注解,由ControllerAdvice、ResponseBody组成。而ControllerAdvice又是由Component组合。使用RestControllerAdvice可用自定义一个异常处理类。一般配合ExceptionHandler、Init…

高通安卓12-在源码中查找应用的方法

1.通过搜索命令查找app 一般情况下&#xff0c;UI上看到的APP名称会在xml文件里面定义出来&#xff0c;如 搜索名字为WiGig的一个APP 执行命令 sgrep "WiGig" 2>&1|tee 1.log 将所有的搜索到的内容打印到log里面 Log里面会有一段内容 在它的前面是这段内…

Stable Diffusion部署教程,开启你的AI绘图之路

本文环境 系统&#xff1a;Ubuntu 20.04 64位 内存&#xff1a;32G 环境安装 2.1 安装GPU驱动 在英伟达官网根据显卡型号、操作系统、CUDA等查询驱动版本。官网查询链接https://www.nvidia.com/Download/index.aspx?langen-us 注意这里的CUDA版本&#xff0c;如未安装CUD…

CSS动画(动态导航栏)

1.项目简介 一个具有创意的导航菜单不仅能为你的大作业增色&#xff0c;还能展示你的技术实力。本文将分享一系列常用于期末大作业的CSS动画导航效果&#xff0c;这些效果不仅外观酷炫&#xff0c;而且易于实现。我们提供了一键复制的代码&#xff0c;让你能够快速集成到自己的…

掌握ChatGPT:提示工程入门详解

随着人工智能的发展&#xff0c;提示工程成为了使用ChatGPT等语言模型的核心技术。对于初学者&#xff0c;理解和运用提示工程是提高与ChatGPT互动效果的关键。 什么是提示工程&#xff1f; 提示工程是通过设计和优化输入文本&#xff08;提示&#xff09;来引导AI生成特定输出…

破碎的像素地牢探险:游戏分享

软件介绍 《破碎的像素地牢》是开源一款地牢冒险探索类的游戏&#xff0c;融合了日系RPG经典风格&#xff0c;玩家将控制主角进行未知场景的探索。除了经典地牢玩法外&#xff0c;游戏还添加了更多创意内容&#xff0c;如黑屏状态前的挑战性等&#xff0c;使得游戏更加富有挑战…

Vue78-缓存路由组件

一、需求 路由切走的时候&#xff0c;组件会被销毁&#xff0c;路由切回来&#xff0c;组件被挂载&#xff01; 需要&#xff1a;路由切走的时候&#xff0c;组件不会被销毁。 二、代码实现 若是不加include属性&#xff0c;则在<router-view>里面展示的路由&#xff0c…

ubuntu20.04安装配置openMVG+openMVS

安装 主要跟着官方教程逐步安装 openMVG https://github.com/openMVG/openMVG/blob/master/BUILD.md openMVS https://github.com/cdcseacave/openMVS/wiki/Building 注意事项 1. 库版本要求 使用版本&#xff1a; openMVS 2.2.0 openMVG Eigen 3.4.0 OpenCV 4.6.0 Ce…

华为开发者大会:全场景智能操作系统HarmonyOS NEXT

文章目录 一、全场景智能操作系统 - HarmonyOS NEXT1.1 系统特性1.2 关于架构、体验和生态 二、应用案例2.1 蚂蚁mpaas平台的性能表现 三、新版本应用框架发布3.1 新语言发布3.2 新数据库发布3.3 新版本编译器的发布 四、CodeArts和DataArts4.1 CodeArts4.2 DataArts 五、总结 …

高通安卓12-Input子系统

1.Input输入子系统架构 Input Driver(Input设备驱动层)->Input core(输入子系统核心层)->Event handler(事件处理层)->User space(用户空间) 2.getevent获取Input事件的用法 getevent 指令用于获取android系统中 input 输入事件&#xff0c;比如获取按键上报信息、获…

C++实现简单的哈希表

使用除留余数法计算哈希地址&#xff0c;使用拉链法解决哈希冲突&#xff0c;使用模板编程实现value为任意类型&#xff0c;但是key值只能是整型。链表使用CSTL库中的list&#xff0c;实现了一个简单的哈希表。 #include <iostream> #include <vector> #include &l…