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. 如何…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...

Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...

CTF show 数学不及格
拿到题目先查一下壳,看一下信息 发现是一个ELF文件,64位的 用IDA Pro 64 打开这个文件 然后点击F5进行伪代码转换 可以看到有五个if判断,第一个argc ! 5这个判断并没有起太大作用,主要是下面四个if判断 根据题目…...