Dance with Compiler - EP2
今天来熟悉汇编指令。
基本指令特点
str: store value to memory
ldr: load value from memory
stp: store register value to stack
ldp: load stack value to register
更新寄存器的操作,一般结果寄存器是左操作数。
写内存的操作(str),一般寄存器是左操作数,结果内存是右操作数。
读内存操作(ldr),一般寄存器是左操作数,源内存是右操作数。
所以:
- 读写内存操作,寄存器始终在左边,内存地址始终在右边。
- 读写堆栈操作,寄存器始终在左边,堆栈内存地址始终在右边。
- 数学运算操作,结果寄存器在左边
约定:对于32位寄存器,用 Rn表示,64位寄存器,用Xn表示
常见指令
-
CMP w3, 1
等价于 SUBS XZR, w3, 1
SUBS XZR, Xn, #
功能:从寄存器 Xn 的值中减去一个立即数 #,并将结果存储到 XZR 寄存器,同时更新条件标志寄存器(N, Z, C, V)。
解释:
SUBS 代表 “subtract with flags”(减法并设置标志)。它执行减法操作,并且会根据结果更新条件标志寄存器。
XZR 是一个特殊的寄存器,在 ARMv8 中,它被用作只读零寄存器。任何写入到 XZR 的值都被丢弃,因为 XZR 的值总是 0。因此,XZR 用于忽略操作的结果,但仍然允许更新条件标志。
Xn 是源寄存器,包含要减去的值。
# 是立即数,用于从 Xn 中减去。
减法操作的结果不会存储在 XZR 中,因为 XZR 总是 0。操作的主要目的是更新条件标志以供后续的条件分支指令使用。
条件标志:
N(Negative):如果结果为负,则设置 N 标志。
Z(Zero):如果结果为零,则设置 Z 标志。
C(Carry):如果减法操作的结果没有借位,则设置 C 标志(即,如果 Xn >= #,则 C 标志被设置)。
V(Overflow):如果减法操作导致溢出,则设置 V 标志(即结果超出了表示范围)。 -
sub x9, sp, #16384
功能:计算并更新寄存器 x9 的值。
解释:将堆栈指针 sp 的值减去 16384 (0x4000),结果存储在寄存器 x9 中。这里 16384 是堆栈分配或调整的字节数。
例子:
如果 sp 的值是 0x8000,那么执行后 x9 的值将是 0x8000 - 0x4000 = 0x4000。 -
str xzr, [x9, 3968]
功能:将寄存器中的值存储到内存。
解释:将寄存器 xzr(零寄存器,其值始终为 0)存储到以 x9 为基地址加上偏移 3968 字节处的内存位置。这实际上是在 x9 + 3968 的地址上写入 0。
例子:
如果 x9 的值是 0x4000,则会把 0 存储到内存地址 0x4000 + 3968 = 0x7C00。 -
stp x29, x30, [sp, -128]!
功能:将两个寄存器的值存储到堆栈,并更新堆栈指针。
解释:将寄存器 x29 和 x30 的值存储到以 sp 为基地址减去 128 字节的内存位置,并将堆栈指针 sp 更新到 sp - 128 的位置。! 表示更新堆栈指针。
例子:
如果原来的 sp 是 0x7000,这条指令将 x29 和 x30 的值存储到 0x7000 - 128 = 0x6F80 地址,然后将 sp 更新为 0x6F80。 -
mov x29, sp
功能:将堆栈指针的值复制到寄存器。
解释:将堆栈指针 sp 的当前值复制到寄存器 x29 中。通常用于设置帧指针,将其指向当前的堆栈位置。
例子:
如果 sp 的值是 0x6F80,执行后 x29 的值将被设置为 0x6F80。
这段 ARM 汇编代码负责从堆栈中加载多个寄存器的值,并最终返回到调用者。下面逐条解释这些指令:
-
ldp x19, x20, [sp, 16]
功能:从内存中加载两个寄存器的值。
解释:从堆栈指针 sp 偏移 16 字节的地址开始,加载两个 64 位寄存器的值,分别存入寄存器 x19 和 x20。
例子:
如果 sp 的值是 0x5000,这条指令将从 0x5000 + 16 = 0x5010 的内存地址读取两个 64 位值,并将其存储到 x19 和 x20 中。 -
cmp w24, w25
功能:比较两个寄存器的值。
解释:将寄存器 w24 和 w25 的值进行比较。此操作会设置条件标志,用于后续的条件分支指令。
例子:
比较 w24 和 w25 的值,结果将影响后续指令的条件跳转。 -
cset w1, eq
功能:设置寄存器的值。
解释:如果条件标志中的 EQ(Equal,等于)被设置,则将寄存器 w1 设为 1;否则,设为 0。此指令用于基于上一个比较操作的结果设置寄存器值。
例子:
如果 w24 等于 w25,则 w1 的值将设置为 1;否则,设置为 0。 -
cbz w0, .L1301
功能:条件分支指令。
解释:如果寄存器 w0 的值为零(cbz 代表 “compare and branch if zero”),则跳转到标签 .L1301 处执行。
例子:
如果 w0 的值是 0,程序将跳转到 .L1301 标签处。 -
cbnz w1, .L1308
功能:条件分支指令。
解释:如果寄存器 w1 的值不为零(cbnz 代表 “compare and branch if not zero”),则跳转到标签 .L1308 处执行。
例子:
如果 w1 的值是 1,程序将跳转到 .L1308 标签处。 -
blr x1
功能:分支到寄存器指定的地址。
解释:将程序执行的控制权转移到寄存器 x1 中存储的地址。这个指令常用于函数调用或跳转到计算得到的地址。
例子:
如果 x1 的值是 0x1000,这条指令会跳转到地址 0x1000 处执行。 -
bne .L1391
功能:条件分支指令。
解释:如果条件标志中的 NE(Not Equal,不相等)标志被设置为 1(即上一个比较结果表明不相等),则跳转到标签 .L1391 处执行。
例子:
如果上一个比较操作的结果是不相等,程序将跳转到 .L1391 标签处。 -
bls .L1300
功能:条件分支指令。
解释:如果条件标志中的 LS(Less than or Equal,小于或等于)标志被设置为 1(即上一个比较结果表明小于或等于),则跳转到标签 .L1300 处执行。
例子:
如果上一个比较操作的结果是小于或等于,程序将跳转到 .L1300 标签处。 -
ccmp w24, w28, 0, eq
功能:条件比较操作。
解释:将寄存器 w24 和 w28 进行比较,但不会设置条件标志。该指令通常用于与条件分支指令配合使用,其中 0 表示不改变标志,eq 表示检查等于条件。
例子:
比较 w24 和 w28 的值,并检查它们是否相等,但不直接影响标志寄存器的状态。 -
bcc .L1389
功能:条件分支指令。
解释:如果条件标志中的 CC(Carry Clear,进位标志清除)被设置为 1(即上一个比较结果表明小于),则跳转到标签 .L1389 处执行。
例子:
如果上一个比较操作的结果是小于,程序将跳转到 .L1389 标签处。 -
ubfx x4, x4, 0, 48
功能:从寄存器中提取无符号位域。
解释:从寄存器 x4 中提取从位 0 开始的 48 位,并将结果存储回 x4。ubfx 代表 “unsigned bit field extract”。
例子:
如果 x4 的值是 0xFFFFF000,提取的结果将是 0xFFF000。 -
prfm PLDL1KEEP, [x4]
功能:数据预取。
解释:预取缓存行以提高数据访问速度。PLDL1KEEP 表示将数据从 L1 数据缓存中保留到 L1 中,并从内存中读取。[x4] 指定了预取的地址。
例子:
如果 x4 的值是 0x2000,这条指令将从内存地址 0x2000 预取数据到 L1 数据缓存。
ARM 特色:条件指令
CCMP Xn, #imm, #nzcv, cond
- 其中,cond 是说是否执行 CCMP 语句的比较操作的条件,cond 的内容来自 NZCV,也就是上一个算术操作的结果(手册里说得很不清晰)。
- CCMP 输出的 flags = if cond then compare(Xn, #imm) else #nzcv



所以
cmp x1, 0 (转化成 x1 - 0 操作,会设置 NZCV标记)ccmp w24, w28, 0, eq (如果上一个cmp不满足 eq 条件,也就是说没有设置 z 标记,则不执行 w24 和 w28 的比较,但会强制把当前指令的 NZCV 标记设置成 0。否则,比较 w24 和 w28,并按照一般 cmp 规则设置 NZCV 标记)bcc .L1389 (根据 NZCV 标记决策跳转,bcc 表示如果 C 位被设置了,则跳转,即w24 >= w28 则跳转)
翻译成 C 语言的理解就是:
if (x1 == 0 && w24 >= w28) {
// jump
}
相关文章:
Dance with Compiler - EP2
今天来熟悉汇编指令。 基本指令特点 str: store value to memory ldr: load value from memory stp: store register value to stack ldp: load stack value to register 更新寄存器的操作,一般结果寄存器是左操作数。 写内存的操作(str)&…...
微博视频无水印下载的方法
在如今的数字时代,社交媒体平台如微博已经成为人们分享日常生活、获取新闻和娱乐内容的重要渠道。我们时常会在刷微博时看到一些有趣的视频图片,或是名人的访谈,或是搞笑的短片,有时甚至是一些珍贵的历史资料。这些视频不仅内容丰…...
C语言 | Leetcode C语言题解之第390题消除游戏
题目: 题解: int lastRemaining(int n) {int a1 1;int k 0, cnt n, step 1;while (cnt > 1) {if (k % 2 0) { // 正向a1 a1 step;} else { // 反向a1 (cnt % 2 0) ? a1 : a1 step;}k;cnt cnt >> 1;step step << 1;}return …...
虚拟现实辅助工程技术助力多学科协同评估
在当今高速发展的经济环境中,制造业面临着多重挑战,包括提高产品性能、压缩设计周期、实现轻量化设计和降低成本。为了有效应对这些挑战,多学科协同评估成为缩短研发周期和提升研制质量的关键手段。 传统的多学科评估面临着数据孤立与融合困难…...
Java获取小程序码示例(三种小程序码)
首先我们可以看到官方文档上是有三种码的 获取小程序码 这里特别要注意的是第一种和第三种是有数量限制的,所以大家生成的时候记得保存,也不要一直瞎生成 还有一点要注意的是第一种和第二种是太阳码 第三种是方形码 好了直接上代码 这里要注意ÿ…...
【最新华为OD机试E卷-支持在线评测】分糖果(100分)-多语言题解-(Python/C/JavaScript/Java/Cpp)
🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,…...
Windows下Python和PyCharm的应用(二)__快捷键方式的设定
前言 程序写久了,难免会形成自己的编程习惯。比如对某一套快捷键的使用,已经形成了肌肉记忆。 为了方便快捷键的使用,可以在PyCharm中设置自己喜欢的快捷键。 我比较习惯于微软Visual Studio的快捷键设置。(因为早些年VC开发用的…...
网络安全宗旨和目标
网络安全涉及网络和相关数据及信息的保护与保障。它已从物理技术发展到防病毒和反网络钓鱼平台等软件方法。 在本章中,我们将详细讨论网络安全的主要目标和原则,并提供与之相关的具体示例。所以,让我们从网络安全的目标开始。 网络安全的目的…...
stm32之软件SPI读写W25Q64存储器应用案例
系列文章目录 1. stm32之SPI通信协议 文章目录 系列文章目录前言一、电路接线图二、应用案例代码三、应用案例分析3.1 SPI通信模块3.2 W25Q64模块3.3 主程序 前言 提示:本文主要用作在学习江科大自化协STM32入门教程后做的归纳总结笔记,旨在学习记录&a…...
Python数据验证库schema
目录 一、简述 二、安装schema库 三、使用 基本概念 代码示例 简单使用 列表验证 正则表达式 一、简述 schema用于简化数据验证的过程。它提供了一种简单的方式来定义数据结构,并验证传入的数据是否符合预期的结构。schema 库非常适合用于 Web 应用的请求验…...
python数据类型与运算符
1、数据类型 (1)Python中提供了基本数据类型: 数值类型:int整数类型、float浮点数类型、complex复数类型 布尔类型:bool,取值True / False 字符串:单引号包含、双引号包含、三对单引号/双引号…...
加密解密工具类
加密解密工具类 package com.example.modules.util;import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import java.security.SecureRandom; import java.util.Base64; public…...
validationtools中按键测试选项光标移除
最近处理一个问题,设备有方向键盘,做cit中的按键测试,发现按方向键第一次按键不能触发该键值,而是让屏幕第一个按钮获取焦点,然后再次按键,则其他正常。问题:进入界面第一次按键就要响应对应按键…...
【Hot100算法刷题集】哈希-02-字母异位词分组(含排序构造键、自定义键、自定义哈希函数法)
🏠关于专栏:专栏用于记录LeetCode中Hot100专题的所有题目 🎯每日努力一点点,技术变化看得见 题目转载 题目描述 🔒link->题目跳转链接 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺…...
用华为智驾,开启MPV的下半场
作者 |老缅 编辑 |德新 8月28日,岚图正式对外公布了全球首款搭载华为乾崑智驾和鸿蒙座舱的MPV——全新岚图梦想家。 新车定位「全景豪华科技旗舰MPV」,全系标配四驱,分为四驱鲲鹏版和四驱乾崑版。 其中岚图逍遥座舱和鲲鹏智驾构成的鲲鹏版…...
发烧时眼睛胀痛的多种原因
发烧时眼睛胀痛的多种原因 发烧时眼睛胀痛可能由多种原因引起,主要包括以下几个方面: 上呼吸道感染: 发烧通常由上呼吸道感染引起,如感冒等。这些疾病多由病毒或细菌感染导致,如流感病毒、副流感病毒、腺病毒等。当机…...
用ACF和PACF计算出一堆数据的周期个数以及周期时长,数据分析python
具体步骤 1使用ACF和PACF:可以通过查看ACF图中的周期性峰值,找到数据中的周期性。如果ACF图在某个滞后期处出现显著的正相关峰值,并且这种模式在多个滞后周期中重复出现,这就是周期性信号的特征。而PACF则可以帮助确定延迟的直接影…...
生活方式对人健康影响非常大 第三篇
身体健康因素中 生活方式占到60% 赶紧去调整自己哪错了 上游的生活方式管理 是药三分毒 药物会影响身体肝肾功能,代谢 所以你要去找上游到底是我哪错了 短板越多 个健康状态越差 饮食管理是生活方式管理中难度最大的 原则1:与基因相对应相平衡 只吃素 会导致大脑萎…...
ubuntu22.04 qemu 安装windows on arm虚拟机
ubuntu22.04 qemu 安装windows on arm虚拟机 iso: https://uupdump.net/ https://massgrave.dev/windows_arm_links vivo driver: https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.262-2/ qemu sudo apt update sudo a…...
前端框架的演变与选择
目录 前端框架的演变与选择 1. 什么是前端框架? 2. 前端框架的演变 2.1 早期的Web开发 2.2 JavaScript库的兴起 2.3 MVC架构的引入 3. 现代前端框架概览 3.1 React 3.2 Vue.js 3.3 Angular 4. 其他值得关注的前端框架 4.1 Svelte 4.2 Ember.js 5. 如何…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...
WEB3全栈开发——面试专业技能点P4数据库
一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库,基于 mysql 库改进而来,具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点: 支持 Promise / async-await…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
深入理解 React 样式方案
React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...
ffmpeg(三):处理原始数据命令
FFmpeg 可以直接处理原始音频和视频数据(Raw PCM、YUV 等),常见场景包括: 将原始 YUV 图像编码为 H.264 视频将 PCM 音频编码为 AAC 或 MP3对原始音视频数据进行封装(如封装为 MP4、TS) 处理原始 YUV 视频…...
