3.18号arm

4 跳转指令

实现汇编程序跳转的两种方式

直接修改PC的值

mov  pc , #0x04

通过跳转指令跳转

b 标签

@程序跳转到指定的标签下执行,此时LR寄存器不保存返回地址

bl 标签

@程序跳转到指定的标签下执行,此时LR寄存器保存返回地址

5 内存读写指令(重点)

查看可用内存

查看指定内存数据

5.1 单寄存器内存读写指令

从内存中读取一个寄存器大小的数据或者向内存中写入一个寄存器的数据

写操作

str{条件码} 目标寄存器,[目标地址]  @将目标寄存器的数值写入到目标地址为首地址的内存中,写入4字节数据
strh{条件码} 目标寄存器,[目标地址]  @将目标寄存器的数值写入到目标地址为首地址的内存中,写入2字节数据
strb{条件码} 目标寄存器,[目标地址]  @将目标寄存器的数值写入到目标地址为首地址的内存中,写入1字节数据

读操作

ldr{条件码} 目标寄存器,[目标地址] @从目标地址为首地址的内存中读取4字节数据保存到目标寄存器
ldrh{条件码} 目标寄存器,[目标地址] @从目标地址为首地址的内存中读取2字节数据保存到目标寄存器
ldrb{条件码} 目标寄存器,[目标地址] @从目标地址为首地址的内存中读取1字节数据保存到目标寄存器

 单寄存器读写时地址索引方式

前索引

str{条件码} 目标寄存器,[基地址,偏移量]  @将目标寄存器的数值写入到以基地址+偏移量为首地址的内存中,写入4字节数据

ldr{条件码} 目标寄存器,[基地址,偏移量] @从基地址+偏移量为首地址的内存中读取4字节数据保存到目标寄存器

后索引

str{条件码} 目标寄存器,[基地址],偏移量  @将目标寄存器的数值写入到以基地址为首地址的内存中,然后基地址改变数值偏移量大小

ldr{条件码} 目标寄存器,[基地址],偏移量 @从基地址为首地址的内存中读取4字节数据保存到目标寄存器,基地址数值增加偏移量大小

自动索引

str{条件码} 目标寄存器,[基地址,偏移量]!  @将目标寄存器的数值写入到以基地址+偏移量为首地址的内存中,然后基地址数值增加偏移量大小

ldr{条件码} 目标寄存器,[基地址,偏移量]! @从基地址+偏移量为首地址的内存中读取4字节数据保存到目标寄存器,基地址数值增加偏移量大小

5.2 批量寄存器内存读写方式

将多个寄存器的数值向内存中写入或者从内存中读取多个寄存器大小的数据放到寄存器中

写:
    stm 基地址,{寄存器列表}  @将寄存器列表中寄存器的数值写入到基地址位首地址的内存中
读:
    ldm 基地址,{寄存器列表}  @从基地址为首地址的内存中读取多个字节的数据写入到寄存器列表中每个寄存器中

注意:
1.寄存器列表中寄存器可以用','分隔,如果寄存器列表中寄存器编号连续,可以用'-'链接一片连续的寄存器
2.不管寄存器列表中寄存器编号的顺序是怎么样的,处理器操作时永远是低地址对应小编号寄存器

批量寄存器内存读写时基地址的增长方式

通过基地址的地址增长方式设置可以让我们操作内存的同时让基地址也发生变化,可以防止前一次的数据被后一次覆盖

地址增长方式分为ia\ib\da\db四种不同的方式:

stmia 基地址!,{寄存器列表} @先向基地址内存中写入数据,基地址数值往地址大的方向增长

stmib 基地址!,{寄存器列表} @先让基地址数值往地址大的方向增长,然后向基地址内存写入数据

stmda 基地址!,{寄存器列表} @先向基地址内存中写入数据,基地址数值往地址小的方向增长

stmdb 基地址!,{寄存器列表} @先让基地址数值往地址小的方向增长,然后向基地址内存写入数据

5.3 栈内存的读写

在内存中会分配一段内存,叫做栈内存,主要用于保存一些临时数据。操作栈时需要栈顶的地址,栈顶地址保存在SP中。

栈的分类

1.根据栈指针地址增长的方式,分为增栈和减栈
    增栈:操作栈时栈指针往高地址增长    A
    减栈:操作栈时栈指针往低地址增长    D
2.根据压栈结束后栈指针指向的内存中有没有有效数据,分为空栈和满栈
    空栈:压栈结束后栈指针指向的内存中没有有效数据  E
    满栈:压栈结束后栈指针指向的内存中有有效数据   F
    
根据上面的划分标准,栈分为空增栈(EA)、满增栈(FA)、空减栈(ED)、满减栈(FD)

栈内存读写示例---叶子函数的调用过程

叶子函数:函数中不存在别的函数调用,这种类型的函数叫做叶子函数

栈内存读写示例---非叶子函数的调用过程

非叶子函数:函数中存在别的函数的调用,这种类型的函数叫做非叶子函数

6 状态寄存器传送指令

当前程序状态寄存器CPSR保存了当前的程序的工作状态,包括工作模式、处理器状态、中断禁止状态等信息

我们无法通过常规方式对CPSR的值进行读写,只有通过专门的读写指令才可以实现

注意:在特权模式下可以通过修改CPSR数值切换到非特权模式,但是非特权模式不能随便切换到特权模式,不然系统会受到不利的影响,只有发生对应的异常时才可以从user切换到特权模式

读CPSR数值:
    MRS 目标寄存器,CPSR @将CPSR寄存器的数值读取出来保存到目标寄存器
修改CPSR数值:
    MSR CPSR,数值  @将数值写入到CPSR寄存器中

7 软中断产生指令

软中断是从软件层次上模拟硬件中断,当软中断触发以后可以让处理器进入SVC模式下工作

7.1 软中断产生指令以及使用实例

格式: swi 中断号    @这条指令执行之后就会触发一个软中断

注意:中断号用来区分不同的中断,这里中断号十一个12位的整型数

7.2 异常模式和异常源

ARM处理器有5种异常模式和7种异常源

异常模式是处理器的工作模式

异常源是引发处理器进入异常模式的源头

7.3 异常向量表

异常向量表是内存中的一段内存,这段异常向量表内存通常是程序最开始的内存,一共32字节,被平分为8等份,其中一份保留,其他的每一份4字节,对应一种异常源,内部保存了切换到异常源对应的异常模式的指令。

当一个异常源产生,处理器分析异常,进入异常源对应的异常向量表位置,切换到异常处理程序进行异常的处理

每一种异常源在异常向量表中的位置是固定不变的,不可以改变

7.4 异常触发后处理器做的事情---四大步三小步(重点)

一、将异常出现前的CPSR的值保存到对应异常的SPSR中
二、修改CPSR数值
    1.修改模式位为对应异常的模式
    2.切换处理器状态为ARM状态
    3.根据产生得异常合理禁止中断
三、保存程序返回地址到对应异常的LR寄存器中
四、修改PC寄存器的值为对应异常的异常向量表位置

7.5 异常返回

1.将SPSR寄存器保存的异常触发前的CPSR数值赋值给CPSR

2.将LR保存的返回地址赋值给Pc

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

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

相关文章

Vue+SpringBoot打造用户画像活动推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活动档案模块2.4 活动报名模块2.5 活动留言模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 数据流程设计3.4 E-R图设计 四、系统展示五、核心代码5.1 查询兴趣标签5.2 查询活动推荐…

英伟达深夜放王炸|字节跳动游戏之路波折不断|文旅短剧风口将至|25岁QQ魅力不减,5亿人在用|云计算市场疯长152%|电商巨头齐瞄向富足悠闲银发族

新闻一分钟速览 文旅短剧风口将至,一地狂拍十部,影视界看法分歧,悬念丛生!字节跳动游戏之路波折不断,能否逆风翻盘引关注。折叠屏手机痛症治愈,实力席卷高端市场,势头强劲!雷军豪言…

学习笔记Day12:初探LInux 2

Linux初探 同一个目录中不允许出现文件及文件夹重名 查看文件 cat (Concatenate)查看文本文件内容,输出到屏幕(标准输出流) 常用参数 -A打印所有字符,包括特殊字符(换行符、制表符等&#xff…

File的学习1

File对象就表示一个路径,可以是文件的路径,也可以是文件夹的路径 这个路径可以是存在的,也可以是不存在的。 package MyFile;import java.io.File;public class FileDemo01 {public static void main(String[] args) {//1.根据文件路径创建…

如何定期清理数据库中的无效数据?

企业的数据库在运行相当长一段时间后,都会出现无效数据的堆积,这些数据包含了过时、重复、错误、缺失(空字段)的数据,长期占据着宝贵的数据库空间。而在上云热潮的推动下,绝大多数企业已经将他们的业务数据…

fastjson反序列化攻略

漏洞原理 Json.parseObject(json, User.class)方法中,通过指定type的值实现定位某类,会执行User类的构造方法和属性中的get,set方法 判断是否是fastjson/(jackson) 1.2.24-1.2.83都会有dnslog的payload {"zer…

Java基础-IO流

文章目录 1.文件1.基本介绍2.常用的文件操作1.创建文件的相关构造器和方法代码实例结果 2.获取文件相关信息代码实例结果 3.目录的删除和文件删除代码实例 2.IO流原理及分类IO流原理IO流分类 3.FileInputStream1.类图2.代码实例3.结果 4.FileOutputStream1.类图2.案例代码实例 …

【Flink】Flink 中的时间和窗口之窗口其他API的使用

1. 窗口的其他API简介 对于一个窗口算子而言,窗口分配器和窗口函数是必不可少的。除此之外,Flink 还提供了其他一些可选的 API,可以更加灵活地控制窗口行为。 1.1 触发器(Trigger) 触发器主要是用来控制窗口什么时候…

【大模型系列】统一图文理解与生成(BLIP/BLIPv2/InstructBLIP)

文章目录 1 BLIP(2022, Salesforce Research)1.1 简介1.2 数据角度1.3 模型角度1.4 BLIP预训练的目标 2 BLIP2(ICML2023, Salesforce)2.1 简介2.2 模型架构2.3 训练细节 3 InstructBLIP(2023, Salesforce)3.1 指令微调技术(Instruction-tuning)3.2 数据集准备3.3 Instruction-a…

docker入门(二)—— docker三大概念(镜像、容器、仓库)

docker 的三大必要概念 docker 的三大必要概念——镜像、容器、仓库 docker 架构图 镜像(image):模版。(web项目:1、环境 2、配置变量 3、上线项目 4、配置项目需要的静态文件)打包成镜像 docker 镜像&a…

代码随想录阅读笔记-哈希表【两个数组的交集】

题目 给定两个数组&#xff0c;编写一个函数来计算它们的交集。 说明&#xff1a; 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 提示&#xff1a; 1 < nums1.length, nums2.length < 10000 < nums1[i], nums2[i] < 1000 思路 交集&…

【源码阅读】EVMⅢ

参考[link](https://blog.csdn.net/weixin_43563956/article/details/127725385 大致流程如下&#xff1a; 编写合约 > 生成abi > 解析abi得出指令集 > 指令通过opcode来映射成操作码集 > 生成一个operation 以太坊虚拟机的工作流程&#xff1a; 由solidity语言编…

鸿蒙实战开发:【FaultLoggerd组件】讲解

简介 Faultloggerd部件是OpenHarmony中C/C运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件&#xff0c;Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到故障日志&#xff0c;定位相关问题。 架构 Native InnerKits 接口 Si…

Linux操作系统——多线程

1.线程特性 1.1线程优点 创建一个新线程的代价要比创建一个新进程小得多与进程之间的切换相比&#xff0c;线程之间的切换需要操作系统做的工作要少很多线程占用的资源要比进程少很多能充分利用多处理器的可并行数量在等待慢速I/O操作结束的同时&#xff0c;程序可执行其他的计…

《1w实盘and大盘基金预测 day7》

昨日预测有点差劲&#xff0c;最低点也相差五个点。 打分C 公众号&#xff1a;JavaHelmet 昨天预测&#xff1a; 3052-3062-3076-3115 3067是趋势线&#xff0c;有回踩需求 5-30-60分钟级别顶钝 大盘冲到标红的点位3115或者3100就需注意。不要随意追高&#xff08;最高309…

备战蓝桥杯---牛客寒假训练营2VP

题挺好的&#xff0c;收获了许多 1.暴力枚举&#xff08;许多巧妙地处理细节方法&#xff09; n是1--9,于是我们可以直接暴力&#xff0c;对于1注意特判开头0但N&#xff01;1&#xff0c;对于情报4&#xff0c;我们可以把a,b,c,d的所有取值枚举一遍&#xff0c;那么如何判断有…

ModbusTCP转Profinet网关高低字节交换切换

背景&#xff1a;在现场设备与设备通迅之间通常涉及到从一种字节序&#xff08;大端或小端&#xff09;转换到另一种字节序。大端字节序是指高位字节存储在高地址处&#xff0c;而小端字节序是指低位字节存储在低地址处。在不动原有程序而又不想或不能添加程序下可选用ModbusTC…

OCP NVME SSD规范解读-13.Self-test自检要求

4.10节Device Self-test Requirements详细描述了数据中心NVMe SSD自检的要求&#xff0c;这一部分规范了设备自身进行各种健康检查和故障检测的过程。自检对于确保SSD的正常运行和提前预防潜在故障至关重要。 在进行设备自检时&#xff0c;设备应当确保不对用户数据造成破坏&am…

【人工智能】Gitee AI 天数智芯有奖体验开源AI模型,一定能有所收货,快来体验吧

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章。 这是《人工智能》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 目录 前言两大赛道天数智芯1.模型地址2.天数智芯专区3.选择模型4.模型详情页5.部署模型6.成功部署7.执行例子8.移除模型 千模盲…

03python注释与输入函数

Python 注释的作用: 注释可用于解释 Python 代码。 注释可用于提高代码的可读性。 在测试代码时,可以使用注释来阻止执行。 注释可以放在一行的末尾,Python 将忽略该行的其余部分: 实例1 print("Hello, World!") #打印输出Hello,World print(9-3) #输出9…