汇编基础语法及其示例

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"

。。。。。。

输出列表

输入列表

破坏列表

);
 

 

 


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/9042.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FLTK - FLTK1.4.1 - 搭建模板,将FLTK自带的实现搬过来做实验

文章目录 FLTK - FLTK1.4.1 - 搭建模板&#xff0c;将FLTK自带的实现搬过来做实验概述笔记my_fltk_test.cppfltk_test.hfltk_test.cxx用adjuster工程试了一下&#xff0c;好使。END FLTK - FLTK1.4.1 - 搭建模板&#xff0c;将FLTK自带的实现搬过来做实验 概述 用fluid搭建UI…

基于物联网设计的疫苗冷链物流监测系统

一、前言 1.1 项目开发背景 随着全球经济的发展和物流行业的不断创新&#xff0c;疫苗和生物制品的运输要求变得越来越高。尤其是疫苗的冷链物流&#xff0c;温度、湿度等环境因素的控制直接关系到疫苗的质量和效力&#xff0c;因此高效、可靠的冷链监控系统显得尤为重要。冷…

JVM对象分配内存如何保证线程安全?

大家好&#xff0c;我是锋哥。今天分享关于【JVM对象分配内存如何保证线程安全?】面试题。希望对大家有帮助&#xff1b; JVM对象分配内存如何保证线程安全? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在JVM中&#xff0c;对象的内存分配是通过堆内存进行的。…

移动光猫怎么自己改桥接模式?

环境&#xff1a; 型号H3-8s 问题描述&#xff1a; 家里宽带用的是H3-8s 光猫&#xff0c;想改桥接模式。 解决方案&#xff1a; 1.默认管理员账号和密码&#xff1a; 账号&#xff1a;CMCCAdmin 密码&#xff1a;aDm8H%MdAWEB页面我试了登陆不了&#xff0c;显示错误 …

大数据Hadoop入门3

第五部分&#xff08;Apache Hive DML语句和函数使用&#xff09; 1.课程内容大纲和学习目标 2.Hive SQL-DML-load加载数据操作 下面我们随机创建文件尝试一下 先创建一个hivedata文件夹 在这个文件夹中写一个1.txt文件 下面使用beeline创建一张表 只要将1.txt文件放在t_1文件…

2025.1.26机器学习笔记:C-RNN-GAN文献阅读

2025.1.26周报 文献阅读题目信息摘要Abstract创新点网络架构实验结论缺点以及后续展望 总结 文献阅读 题目信息 题目&#xff1a; C-RNN-GAN: Continuous recurrent neural networks with adversarial training会议期刊&#xff1a; NIPS作者&#xff1a; Olof Mogren发表时间…

基于物联网的火灾报警器设计与实现(论文+源码)

1 总体方案设计 本次基于物联网的火灾报警器&#xff0c;其系统总体架构如图2.1所示&#xff0c;采用STM32f103单片机作为控制器&#xff0c;通过DS18B20传感器实现温度检测&#xff1b;通过MQ-2烟雾传感器实现烟雾检测&#xff1b;.通过火焰传感器实现火焰检测&#xff0c;当…

ResNeSt: Split-Attention Networks论文学习笔记

这张图展示了一个名为“Split-Attention”的神经网络结构&#xff0c;该结构在一个基数组&#xff08;cardinal group&#xff09;内进行操作。基数组通常指的是在神经网络中处理的一组特征或通道。图中展示了如何通过一系列操作来实现对输入特征的注意力机制。 以下是图中各部…

模糊综合评价

模糊综合评价的特点主要体现在以下几个方面&#xff1a; 一、系统性强 模糊综合评价法能够综合考虑多种因素的影响&#xff0c;将定性指标和定量指标相结合&#xff0c;对评价对象进行全面、系统的分析。这种方法避免了单一指标评价的片面性&#xff0c;提高了评价的准确性和…

宫本茂的游戏设计思想:有趣与风格化

作为独立游戏开发者之一&#xff0c;看到任天堂宫本茂20年前的言论后&#xff0c;深感认同。 游戏研发思想&#xff0c;与企业战略是互为表里的&#xff0c;游戏是企业战略的具体战术体现&#xff0c;虚空理念的有形载体。 任天堂长盛不衰的关键就是靠简单有趣的游戏&#xf…

deepseek-r1 本地部署

deepseek 最近太火了 1&#xff1a;环境 win10 cpu 6c 内存 16G 2: 部署 1>首先下载ollama 官网&#xff1a;https://ollama.com ollama 安装在c盘 模型可以配置下载到其他盘 OLLAMA_MODELS D:\Ollama 2>下载模型并运行 ollama run deepseek-r1:<标签> 1.5b 7b 8…

electron typescript运行并设置eslint检测

目录 一、初始化package.json 二、安装依赖 1、安装electron 2、安装typescript依赖 3、安装eslint 三、项目结构 四、配置启动项 一、初始化package.json 我的&#xff1a;这里的"main"没太大影响&#xff0c;看后面的步骤。 {"name": "xlo…

每日一题-判断是否是平衡二叉树

判断是否是平衡二叉树 题目描述数据范围题解解题思路递归算法代码实现代码解析时间和空间复杂度分析示例示例 1示例 2 总结 ) 题目描述 输入一棵节点数为 n 的二叉树&#xff0c;判断该二叉树是否是平衡二叉树。平衡二叉树定义为&#xff1a; 它是一棵空树。或者它的左右子树…

WS2812 梳理和颜色表示方法的对比:RGB和HSV

WS2812 WS2812是一种可编程的LED灯&#xff0c;具有RGB显示效果&#xff0c;可显示的颜色数量为2^24。 常用颜色表示方法 表示方法&#xff1a; RGB 表示 加法混色原理&#xff1a;RGB 颜色模型基于加法混色原理&#xff0c;将红&#xff08;Red&#xff09;、绿&#xff08…

一文简单回顾Java中的String、StringBuilder、StringBuffer

简单说下String、StringBuilder、StringBuffer的区别 String、StringBuffer、StringBuilder在Java中都是用于处理字符串的&#xff0c;它们之间的区别是String是不可变的&#xff0c;平常开发用的最多&#xff0c;当遇到大量字符串连接的时候&#xff0c;就用StringBuilder&am…

对游戏宣发的粗浅思考

1.两极分化 认真观摩了mgs系列制作人的x账号&#xff0c; 其更新频率吓死人&#xff0c;一天能发几十条之多&#xff0c;吓死人。大部分都是转发相关账号的ds2或mgs相关内容&#xff0c; 每日刻意的供给这些内容来满足几十万粉丝需求&#xff0c;维护热情。 幕后是专业的公…

【数据结构】空间复杂度

目录 一、引入空间复杂度的原因 二、空间复杂度的分析 ❥ 2.1 程序运行时内存大小 ~ 程序本身大小 ❥ 2.2 程序运行时内存大小 ~ 算法运行时内存大小 ❥ 2.3 算法运行时内存大小 ❥ 2.4 不考虑算法全部运行空间的原因 三、空间复杂度 ❥ 3.1空间复杂度的定义 ❥ 3.2 空…

实践网络安全:常见威胁与应对策略详解

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 引言 在数字化转型的浪潮中&#xff0c;网络安全的重要性已达到前所未有的高度。无论是个人用户、企业&#xff0c;还是政府机构…

Tensor 基本操作2 理解 tensor.max 操作,沿着给定的 dim 是什么意思 | PyTorch 深度学习实战

前一篇文章&#xff0c;Tensor 基本操作1 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 目录 Tensor 基本操作torch.max默认指定维度 Tensor 基本操作 torch.max torch.max 实现降维运算&#xff0c;基于指定的 d…

图像处理之HSV颜色空间

目录 1 RGB 的局限性 2 HSV 颜色空间 3 RGB与HSV相互转换 4 HSV颜色模型对图像的色相、饱和度和明度进行调节 5 演示Demo 5.1 开发环境 5.2 功能介绍 5.3 下载地址 参考 1 RGB 的局限性 RGB 是我们接触最多的颜色空间&#xff0c;由三个通道表示一幅图像&#xff0c;分…