3.18号arm

news2024/11/30 6:47:35

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.coloradmin.cn/o/1529575.html

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

相关文章

docker安装华为opengauss高斯数据库

opengauss高斯数据库 openGauss是一款企业级开源关系型数据库,由华为公司推出。它深度融合了华为多年的数据库领域经验,充分结合企业级场景需求,基于openGauss自研生态而打造。 在架构上,openGauss着重于传统数据库的企业级能力和…

【Python爬虫】详解BeautifulSoup()及其方法

文章目录 🍔准备工作🌹BeautifulSoup()⭐代码实现✨打印标签里面的内容✨快速拿到一个标签里的属性✨打印整个文档🎆获取特定标签的特定内容 🌹查找标签🎈在文档查找标签 find_all🎈正则表达式搜索 &#x…

如何做好一个“标题党”?媒介盒子揭秘

广告界常说“酒香也怕巷子深”,好标题能够增强文案的点击率,标题党的目的就在于合理利用标题让自己的文案更有点击率。今天媒介盒子就来和大家聊聊:如何做好一个“标题党”。 一、 利用好奇心 好奇心是普遍存在的,比如当看小说的…

题目:反转列表

目录 一、题目描述 方法一:扭动箭头 思路: 注意点: 代码: 代码解析: 1. 2. 优化代码: 注意: 1. 2. 方法二:头插 1.介绍头插 2.解决思路 3.代码 4.注意点 总结&#…

AV1:帧内预测(一)

​VP9支持10种帧内预测模式,包括8种角度模式和非角度模式DC、TM(True Motion)模式,AV1在其基础上进一步扩展,AV1帧内预测角度模式更细化,同时新增了部分非角度模式。 扩展的角度模式 AV1在VP9角度模式的基础上进一步扩展&#xf…

漫谈微服务网关

一、什么是服务网关 服务网关 路由转发 过滤器 1、路由转发:接收一切外界请求,转发到后端的微服务上去; 2、过滤器:在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过…

AI智能客服的数据训练流程

实现智能客服的数据训练流程可以分为几个主要步骤,包括数据准备、模型选择、模型训练和评估。以下是一个基本的数据训练流程,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.数据准备&am…

软件开发项目管理/研发项目管理软件:国产EDA工具厂商行芯科技上线奥博思PowerProject项目管理软件平台

国内领先的EDA工具链提供商杭州行芯科技有限公司(以下简称:行芯科技)与北京奥博思软件技术有限公司达成战略合作,奥博思软件将基于PowerProject项目管理系统助力行芯科技实现研发项目的全生命周期管理,提升管理效能&am…

fastjson反序列化攻略

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

基于Springboot的船运物流管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的船运物流管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…

(总结)OpenOFDM接收端信号处理流程

Overview — OpenOFDM 1.0 documentation 本篇文章为学习OpenOFDM之后的产出PPT,仅供学习参考。

28-4 文件上传漏洞 - %00和00截断

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、白名单绕过、%00和O0截断 %00和O0截断定义: 在URL中,%00表示ASCII码中的0(零),而ASCII中0作为特殊字符保留,所以当URL中出现%00时就会认为读取已结束。这等同于一个结束…

springboot校服订购系统

摘 要 本文首先实现了校服订购系统设计与实现管理技术的发展随后依照传统的软件开发流程,最先为系统挑选适用的言语和软件开发平台,依据需求分析开展控制模块制做和数据库查询构造设计,随后依据系统整体功能模块的设计,制作系统的…

【c语言篇】每日一题-pta-实验11-2-9 链表逆置

题目如下&#xff1a; 裁判测试程序样例&#xff1a; #include <stdio.h> #include <stdlib.h>struct ListNode {int data;struct ListNode *next; };struct ListNode *createlist(); /*裁判实现&#xff0c;细节不表*/ struct ListNode *reverse( struct ListNod…

SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…

Transformer的前世今生 day04(ELMO

ELMO 前情回顾 NNLM模型&#xff1a;主要任务是在预测下一个词&#xff0c;副产品是词向量Word2Vec模型&#xff1a;主要任务是生成词向量 CBOW&#xff1a;训练目标是根据上下文预测目标词Skip-gram&#xff1a;训练目标是根据目标词预测上下文词 ELMO模型的流程 针对Wor…

15届蓝桥杯备赛(2)

文章目录 刷题笔记(2)二分查找在排序数组中查找元素的第一个和最后一个位置寻找旋转排序数组中的最小值搜索旋转排序数组 链表反转链表反转链表II 二叉树相同的树对称二叉树平衡二叉树二叉树的右视图验证二叉搜索树二叉树的最近公共祖先二叉搜索树的最近公共祖先二叉树层序遍历…

实现el-table合并列

效果图如下 <el-table :data"atlasDataList" style"width: 100%" :span-method"spanMethod"><el-table-column prop"stationName" label"" width"180" /><el-table-column prop"atlasNumbe…

刷题日记:面试经典 150 题 DAY6

刷题日记&#xff1a;面试经典 150 题 DAY6 392. 判断子序列167. 两数之和 II - 输入有序数组11. 盛最多水的容器15. 三数之和209. 长度最小的子数组 392. 判断子序列 原题链接 392. 判断子序列 双指针&#xff0c;i指向s&#xff0c;j指向t 如果s[i]t[j]&#xff0c;则匹配…

ARM开发板实现24位BMP图片缩放

ARM开发板实现24位BMP图片缩放 一、linux平台bmp图片缩放 最近想在ARM开发板实现BMP图片的缩放&#xff0c;查看了一些资料&#xff0c;大家部分理论知识可参考&#xff1a; akynazh博主 &#xff0c;这位博主程序以window平台为主进行显示&#xff0c;发现在linux平台下编译…