汇编基础语法及其示例
1.汇编指令
1.1汇编指令的基本格式
<opcode>{<cond>}{s} <Rd> , <Rn> , <shifter_operand>
<功能码>{<条件码>}{cpsr影响位} <目标寄存器> , <第一操作寄存器> , <第二操作数>
注:第一操作寄存器只能是寄存器, 不能写数值
第二操作数可以写寄存器名, 也可以写#一个数值
汇编不区分大小写
操作数可以是一个寄存器,也可以是一个立即数
立即数:能够经过编码后保存到指令空间中直接当作指令一部分去执行的数据。一个32位指令空间中预留了12位空间保存当前操作数, 可以通过某一个规则对操作数进行处理,将处理后数值放在这12个空间中。所以处理完能够保存到12位空间中的数据就是立即数。通常通过循环右移看是否能得到一个0-255之间的数,如果可以,说明该数据就是立即数
1.2数据处理指令
1.2.1数据搬移指令
1.mov {条件码} Rd ,Sh~
将操作数搬移到目标寄存器中
mov R1 , #0x1
MOV R2, R1
2.mvn {条件码} Rd Sh~
将操作数按位取反后搬移到目标寄存器中
mvn R1 , #0x1
MVN R2, R1
3.通过伪指令实现非立即数的搬移:ldr Rd, =非立即数
ldr Rd , =0x81
1.2.2数据移位指令
1.逻辑左移
lsl{<cond>} Rd , Rn , Sh~
将Rn左移Sh~位存到Rd中
2.逻辑右移
lsr{<cond>} Rd , Rn , Sh~
将Rn右移Sh~位存到Rd中
3.循环右移
ror{<cond>} Rd , Rn , Sh~
将Rn循环右移Sh~位存到Rd中
LSL R1 , R2, #(0x1<<2)
LSR R1 , R2, #2)
1.2.3位运算指令
1.与, 与0清零,与1不变
and {<cond>} Rd , Rn , Sh~
and R1, r2 , #(0x1<<2)
将Rn与Sh~进行与运算存于Rd
2.或,有1为1, 全0为0
orr {<cond>} Rd , Rn , Sh~
Orr r1, r2, #(0x1<<2)
将Rn与Sh~进行或运算存于Rd
3.异或 ,相同为0, 不同为1
eor {<cond>} Rd , Rn , Sh~
Eor R2, R1, #(0x1<<0)
将Rn与Sh~进行异或运算存于Rd
4.按位取反,01交换
mvn(见搬移指令2)
5,按位清零,指为1,清为0
bic {<cond>} Rd , Rn , Sh~
将Rn与Sh~取反进行与运算存于Rd
bic r1, r2, #(0x1<<2) === and r1, r2, #(~(0x1<<2))
1.2.4算术运算指令
1.加法指令
add{<cond>}{s} Rd, Rn,Sh~
Rd = Rn+Sh~
adc{<cond>}{s} Rd, Rn,Sh~
Rd = Rn+Sh~+cpsr寄存器的c位
2.减法指令
sub {<cond>}{s} Rd, Rn,Sh~
Rd = Rn-Sh~
sbc{<cond>}{s} Rd, Rn,Sh~
Rd = Rn-Sh~-cpsr寄存器的c位
3.乘法指令
mul{<cond>}{s} Rd, Rn,Sh~
Rd = Rn*Sh~
注 :{s}存在时运算,加法进位和减法不借位时,cpsr位置1
32位处理器进行64位数据运算时先低八位,后高八位,低位运算影响c位,高位运算考虑c位
1.2.5比较指令
1.cmp Rn , Sh~
将Rn和Sh~比较,本质是将二者进行减法运算,并将结果存到cpsr寄存器 的nzcv位,通常和条件码一起使用

2.tst Rd, #(0x1<<N)
判断第N位是否为0.
3.TEQ Rd , sh~
判断二者是否相等
只能影响到z位,无法影响到cvn位
1.2.6跳转指令
1.b 标签
跳转到指定标签下,跳转后LR寄存器不保存程序的返回地址
2.bl 标签
跳转到指定标签下,跳转后LR寄存器保存程序的返回地址
可实现程序到循环执行操作 ,比如累乘和阶乘
1.2.7内存读写指令
类比c语言通过指针读写地址下内存中的数据
*((unsigned int*)0x12345678) = 数值
向内存中写
1.str Rd,[目标地址]
将Rd中的四字节数据写入到目标地址对应的内存中
2.strh Rd,[目标地址]
将Rd中的2字节数据写入到目标地址对应的内存中
3.strb Rd,[目标地址]
将Rd中的1字节数据写入到目标地址对应的内存中
向内存中读
4.ldr Rd,[目标地址]
从目标地址对应的内存中读取4字节数据保存到Rd中
5.ldrh Rd,[目标地址]
从目标地址对应的内存中读取2字节数据保存到Rd中
6.ldrb Rd,[目标地址]
从目标地址对应的内存中读取1字节数据保存到Rd中
此外还分前索引,后索引和自动索引
前索引:以基地址偏移后为首地址读写
str Rd,[基地址, 偏移量]
将Rd的数据写入到基地址+偏移量为首地址到内存中
ldr Rd,[基地址, 偏移量]
从基地址+偏移量为首地址到内存中读取数据保存到Rd中
后索引:以基地址进行为首地址进行读写,之后基地址在进行偏移
str Rd , [基地址],偏移量
将目标寄存器到数据写入以基地址为首地址的内存中,然后基地址增加偏移量
ldr Rd , [基地址], 偏移量
从以基地址为首地址的内存中读取数据保存到目标寄存器中,然后将基地址增加偏移量的大小
自动索引:以基地址偏移后为首地址进行读写,同时基地址也进行自增自减
str Rd , [基地址,偏移量]!
将基地址自增偏移量大小,再将Rd的数据写入到以基地址为首地址的内存中
ldr Rd,[基地址,偏移量]!
先将基地址自增偏移量大小,再从基地址为首地址到内存中读取数据保存到Rd中
注:基地址要保存到一个寄存器中,偏移量要是一个立即数
此外还可以通过寄存器列表对内存批量读写
写:
stm 基地址, { 寄存器列表}
将寄存器列表中的所有寄存器数据写入到以基地址为首地址的内存中
读:
ldm 基地址,{寄存器列表}
从基地址开始往下读取数据,保存到寄存器列表中的每一个寄存器中
注:
寄存器的写法有:起始寄存器-终止寄存器 /寄存器1、寄存器2、、、、
并且无论寄存器列表编号顺序与否排列,内存读写始终是从小编号寄存器对应着低地址的数据
批量寄存器地址的增长方式有以下四种
ia、ib、da、db
a:先读写,基地址再增长
b:基地址先增长,再进行读写
i:基地址往大地址方向增长
d:基地址往小地址方向增长
栈内存读写
1.空栈和满栈(E&F)
2.增栈和减栈(A&D)
也就形成了四类栈,空增(EA)空减(ED)满增(FA)满减(FD)
ARM默认使用满减栈(FD)
"交叉读写"即:ia写那就db读
对于ARM,满减是由ib写入那么就需要用da读出(对应满减栈就是先读再偏移)
满减栈的实现主要通过三种方式:压栈出栈、strdb和满减栈专用的后缀fd
1.压栈出栈
push {寄存器列表}
pop {寄存器列表}
start:
mov sp ,#0x40000020 @初始化的栈
mov R1, #0x1
mov r2,#0x2
mov r3,#0x3
push {R1-r5}
2.stmdb
将上述代码的push替换成stmdb
3.stmfd(满减专用)
push换成stmfd
最后就是关于叶子函数和非叶子函数的压栈出栈注意事项
关于叶子函数,为了叶子函数在操作寄存器时,不改变非叶子函数的需求,通常将从非叶子函数中已经使用且叶子函数中要使用寄存器数据进行压栈处理,在叶子函数处理完之后进行出栈释放,从而保证函数返回后寄存器的值和调用函数前的保持一致
针对于非叶子函数,还要额外的将返回地址进行压栈出栈处理将LR寄存器压栈非叶子函数调用完成后将其中 的地址数据出栈于sp寄存器中使程序继续正常运行
核心即压栈保护现场push{}出栈恢复现场pop{}
1.2.8状态寄存器传送指令
读取状态寄存器
mrs Rd,cpsr
读取CPSR的数值,保存到Rd中
修改状态寄存器
MSR cpsr , sh~
修改cpsr寄存器的数值为操作数
注:在特权模式下可以通过修改CPSR到非特权模式(USER模式),但是非特权模式不能通过修改cpsr寄存器的数值实现转化为特权模式,只有当对应的特权事件发生之后,处理器会自动进入对应的特权模式
1.2.9异常产生指令
1.2.9.1软中断产生指令
当软中断产生指令执行后会产生一个如饭中断,让处理器进入SVC模式下进行软中断的处理
swi sh~
sh~是一个立即数即产生软中断的中断号
例子
:
start:
MRS r0 , cpsr @
Msr cpsr,#0x1
swi 1
loop
b loop
end
:
1.2.9.2异常模式和异常源
前者时处理器发生异常后进入的工作模式,后者是引发处理器产生异常的源头
总共分为五种异常模式和7种异常源

异常向量表:
ARM处理器在处理异常时采用了异常向量机制,通过在内存中申请一段空间为异常向量表,作为异常处理程序的索引项,根据索引项进入异常处理程序去执行。
cortex——a处理器的异常向量表时32字节,平分为8份。每一份时44字节,正好对应一条汇编指令,每一种异常源都会在异常向量表中有一个位置,剩下一份位置保留
1.2.9.3异常的处理(4⃣️大步3⃣️小步)
1.保存cpsr于spsr
2.修改cpsr(三小步)
修改为对应的异常模式【4;0】
修改工作状态为ARM状态【5】-》0
根据当前的异常的优先级禁用中断【7:6】
3.保存程序的返回地址到异常模式的LR寄存器中
4.修改PC的值到对应异常在异常向量表中的位置
1.2.9.4异常的返回
注:异常的返回必须要手动返回
1.将异常模式下的spsr数值赋值给cpsr,恢复程序的状态
2.将异常模式下的LR的数值赋值给PC,恢复程序执行的位置
1.2.10协处理器指令
2.伪操作:能够在编译过程中起到编译引导作用的 内容
.test .gloabal .if .else ..endif . .....
3.伪指令:不是汇编指令,但是可以起到指令的作用,也会占用一定的内存空间
4.注释
单行注释:@ 或 ;
多行注释:/**/
条件注释:
.if 逻辑值
指令段
.else
指令段
.endif
5.混合编程
目的:使c语言资源和汇编资源相互调用
要求:符合ATPCS规范,将变量传递给从低到高的寄存器实现二者之间的相互调用
函数与标签:函数名汇编中当标签使用,标签c语言中当函数名使用
内联汇编格式
asm volatile(
"汇编指令\n\t"
。。。。。。
输出列表
输入列表
破坏列表
);
相关文章:
汇编基础语法及其示例
1.汇编指令 1.1汇编指令的基本格式 <opcode>{<cond>}{s} <Rd> , <Rn> , <shifter_operand> <功能码>{<条件码>}{cpsr影响位} <目标寄存器> , <第一操作寄存器> , <第二操作数> 注:第一操作寄存器…...
android获取EditText内容,TextWatcher按条件触发
android获取EditText内容,TextWatcher按条件触发 背景:解决方案:效果: 背景: 最近在尝试用原生安卓实现仿element-ui表单校验功能,其中涉及到EditText组件内容的动态校验,初步实现功能后&#…...
Blazor-Blazor Web App项目结构
让我们还是从创建项目开始,来一起了解下Blazor Web App的项目情况 创建项目 呈现方式 这里我们可以看到需要选择项目的呈现方式,有以上四种呈现方式 ● WebAssembly ● Server ● Auto(Server and WebAssembly) ● None 纯静态界面静态SSR呈现方式 WebAs…...
【线上问题定位处理】及【性能优化】系列文章
目录 性能优化 性能优化 九大服务架构性能优化方式 如何进行GC调优 如何排查线上系统出现的Full GC MySQL - 性能优化 MySQL - 分库分表 大数据查询的处理方案 MySQL优化手段有哪些 服务CPU100%问题如何快速定位? 服务内存OOM问题如何快速定位? JVM调优6大步骤 线…...
现代 linux 里一个进程允许打开几个文件:答案是 1024 或者更多
(1) 测试一下: (2) 谢谢...
【仓颉】仓颉编程语言Windows安装指南 配置环境变量 最简单解决中文乱码问题和其他解决方案大全
适用于版本: 0.53.13 | 发布日期: 2024-10-24 (以后的可能也适用) 本机windows版本:24H2 内部版本号windows 10.0.26100 因为仓颉的官方文档一直没更新,所以在这里写一下如何在windows上完成这些…...
dm8在Linux环境安装精简步骤说明(2024年12月更新版dm8)
dm8在Linux环境安装详细步骤 - - 2025年1月之后dm8 环境介绍1 修改操作系统资源限制2 操作系统创建用户3 操作系统配置4 数据库安装5 初始化数据库6 实例参数优化7 登录数据库配置归档与备份8 配置审计9 创建用户10 屏蔽关键字与数据库兼容模式11 jdbc连接串配置12 更多达梦数据…...
学技术学英语:elasticsearch查询的两阶段queryingfetching
To understand Elasticsearch’s distributed search, let’s take a moment to understand how querying and fetching work. Unlike simple CRUD tasks, distributed search is like navigating through a maze of shards spread across the cluster. In Elasticsearch, CRU…...
Linux_线程互斥
互斥的相关概念 共享资源:指多个进程或线程可以共同访问和操作的资源临界资源:被保护的共享资源就叫做临界资源临界区:每个线程内部,访问临界资源的代码,就叫做临界区互斥:任何时刻,互斥保证有…...
基于 NodeJs 一个后端接口的创建过程及其规范 -- 【elpis全栈项目】
基于 NodeJs 一个后端接口的创建过程及其规范 一个接口的诞生: #mermaid-svg-46HXZKI3fdnO0rKV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-46HXZKI3fdnO0rKV .error-icon{fill:#552222;}#mermaid-sv…...
企业知识库提升企业核心竞争力促进团队协作和知识分享
内容概要 在快速发展的数字化时代,企业知识库的构建与运用变得愈发重要。其重要性不仅体现在信息的集中管理上,更在于推动企业整体竞争力的提升。一个高效的知识库可以作为团队合作的重要平台,促进不同部门之间的信息交流与协作,…...
C++ unordered_map和unordered_set的使用,哈希表的实现
文章目录 unordered_map,unorder_set和map ,set的差异哈希表的实现概念直接定址法哈希冲突哈希冲突举个例子 负载因子将关键字转为整数哈希函数除法散列法/除留余数法 哈希冲突的解决方法开放定址法线性探测二次探测 开放定址法代码实现 哈希表的代码 un…...
games101-作业3
由于此次试验需要加载模型,涉及到本地环节,如果是windows系统,需要对main函数中的路径稍作改变: 这么写需要: #include "windows.h" 该段代码: #include "windows.h" int main(int ar…...
【Block总结】高效多尺度注意力EMA,超越SE、CBAM、SA、CA等注意力|即插即用
论文信息 标题: Efficient Multi-Scale Attention Module with Cross-Spatial Learning 作者: Daliang Ouyang, Su He, Guozhong Zhang, Mingzhu Luo, Huaiyong Guo, Jian Zhan, Zhijie Huang 论文链接: https://arxiv.org/pdf/2305.13563v2 GitHub链接: https://github.co…...
Pwn 入门核心工具和命令大全
一、调试工具(GDB 及其插件) GDB 启动调试:gdb ./binary 运行程序:run 或 r 设置断点:break *0x地址 或 b 函数名 查看寄存器:info registers 查看内存:x/10wx 0x地址 (查看 10 个 …...
探索AI(chatgpt、文心一言、kimi等)提示词的奥秘
大家好,我是老六哥,我正在共享使用AI提高工作效率的技巧。欢迎关注我,共同提高使用AI的技能,让AI成功你的个人助理。 "AI提示词究竟是什么?" 这是许多初学者在接触AI时的共同疑问。 "我阅读了大量关于…...
利用飞书机器人进行 - ArXiv自动化检索推荐
相关作者的Github仓库 ArXivToday-Lark 使用教程 Step1 新建机器人 根据飞书官方机器人使用手册,新建自定义机器人,并记录好webhook地址,后续将在配置文件中更新该地址。 可以先完成到后续步骤之前,后续的步骤与安全相关&…...
小白爬虫冒险之反“反爬”:无限debugger、禁用开发者工具、干扰控制台...(持续更新)
背景浅谈 小白踏足JS逆向领域也有一年了,对于逆向这个需求呢主要要求就是让我们去破解**“反爬机制”**,即反“反爬”,脚本处理层面一般都是decipher网站对request设置的cipher,比如破解一个DES/AES加密拿到key。这篇文章先不去谈…...
Ubuntu中MySQL安装-02
服务器端安装 安装服务器端:在终端中输入如下命令,回车后,然后按照提示输入 sudo apt-get install mysql-server 当前使用的ubuntu镜像中已经安装好了mysql服务器端,无需再安装,并且设置成了开机自启动服务器用于接…...
大数据相关职位介绍之一(数据分析,数据开发,数据产品经理,数据运营)
大数据相关职位介绍之一 随着大数据、人工智能(AI)和机器学习的快速发展,数据分析与管理已经成为各行各业的重要组成部分。从互联网公司到传统行业的数字转型,数据相关职位在中国日益成为推动企业创新和提升竞争力的关键力量。以…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...
Copilot for Xcode (iOS的 AI辅助编程)
Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot,它能根据上下文补全代码,快速生成常用…...
