汇编基础语法及其示例
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)和机器学习的快速发展,数据分析与管理已经成为各行各业的重要组成部分。从互联网公司到传统行业的数字转型,数据相关职位在中国日益成为推动企业创新和提升竞争力的关键力量。以…...
手把手教你用XDS110给TI开发板供电与调试(附CCS配置避坑指南)
手把手教你用XDS110给TI开发板供电与调试(附CCS配置避坑指南) 对于刚接触TI嵌入式开发的工程师或学生来说,XDS110调试探针是一个经济实惠且功能强大的入门选择。它不仅支持JTAG和SWD调试,还能为目标板提供电源,并集成了…...
STM32F407驱动0.96寸OLED屏:除了SPI,你还可以试试这几种通信方式(I2C/8080对比)
STM32F407驱动0.96寸OLED屏:SPI、I2C与8080接口的深度技术选型指南 当你在STM32F407VET6核心板上连接0.96寸OLED模块时,第一个技术决策往往就是通信接口的选择。这个看似简单的选择实际上会影响整个项目的硬件设计复杂度、软件维护成本以及最终显示性能。…...
5分钟掌握OBS虚拟摄像头:让所有视频软件都能用上专业直播效果
5分钟掌握OBS虚拟摄像头:让所有视频软件都能用上专业直播效果 【免费下载链接】obs-virtual-cam 项目地址: https://gitcode.com/gh_mirrors/obs/obs-virtual-cam 你是否曾经羡慕主播们精美的直播画面,却苦于无法在Zoom、Teams等日常软件中实现同…...
忘记压缩包密码怎么办?5分钟学会用ArchivePasswordTestTool找回密码
忘记压缩包密码怎么办?5分钟学会用ArchivePasswordTestTool找回密码 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool 你是否曾经…...
树与二叉树:数据结构核心解析
引言在前面的文章中,我们已经系统学习了线性数据结构——链表、栈、队列。线性结构的特点是元素之间存在一对一的先后关系。然而,现实世界中的很多数据关系是一对多的:文件系统中的目录与子目录、公司的组织架构、网页的 DOM 结构……树&…...
系统提示词工程:构建稳定可控的大语言模型应用实践
1. 项目概述与核心价值 最近在GitHub上看到一个挺有意思的项目,叫 edoardoavenia/chatgpt-system-prompts 。乍一看,这似乎又是一个收集ChatGPT提示词的仓库,但当你真正点进去,花点时间研究一下它的结构和内容,你会发…...
Cursor3.3发布:Skill 自动转为快捷操作
想象一下:每次发版之前,你盯着一个庞大PR,脑子里同时跑着十几个线程——这个模块要重构、那个API要优化、还有安全扫描不能忘。以前你得像个孤独的指挥家,一根根指挥棒轮流挥。 现在,Cursor直接给你拉来一支AI交响乐团…...
ncmdump终极指南:3步快速解锁网易云音乐NCM加密文件的完整免费解决方案
ncmdump终极指南:3步快速解锁网易云音乐NCM加密文件的完整免费解决方案 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的歌曲只能在特定客户端播放而烦恼吗?ncmdump这款强大的NCM解密工…...
音乐学者必看的NotebookLM冷启动指南,从乐谱OCR识别到和声进行语义建模,一步到位
更多请点击: https://intelliparadigm.com 第一章:NotebookLM在音乐学研究中的范式革命 NotebookLM(由Google Research推出的基于用户上传文档的AI助手)正悄然重塑音乐学研究的方法论边界。它不再依赖通用知识库的模糊匹配&#…...
考古现场数据智能治理新范式(NotebookLM+地层学语义建模深度解析)
更多请点击: https://intelliparadigm.com 第一章:考古现场数据智能治理新范式(NotebookLM地层学语义建模深度解析) 在田野考古数字化进程中,传统地层记录存在碎片化、非结构化与语义断层三大瓶颈。NotebookLM 作为基…...
