汇编基础语法及其示例
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)和机器学习的快速发展,数据分析与管理已经成为各行各业的重要组成部分。从互联网公司到传统行业的数字转型,数据相关职位在中国日益成为推动企业创新和提升竞争力的关键力量。以…...

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

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...

C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...