ARM微架构与程序编写
目录
1.流水线
2.指令流水线
3. 多核处理器编辑
4. 工程搭建
4.1为Keil软件配置编译工具链
5.程序编写
5.1 数据处理指令
5.2 带标志位的加法ADC ADDS
5.3 跳转指令B\BL
5.4 单寄存器内存访问
5.5 批量寄存器内存访问
5.6 栈的应用->叶子函数的调用过程
5.6 栈的应用->非叶子函数的调用过程
1.流水线

2.指令流水线

3. 多核处理器
4. 工程搭建
4.1为Keil软件配置编译工具链
4.1.1创建新工程

4.1.2设置工程保存的路径和工程的文件名字,在这里我将工程保存到 ARM-ASM 文件夹下,将工程命名为 arm-asm。

4.1.3 设置我们工程支持哪款 CPU,这里我们选择 Samsung 的 S3C2440A 芯片

4.1.4 单击“OK”之后,弹出提示框是否导入启动文件,选择“否”:

4.1.5建好工程后,软件界面如下图所示:

4.1.6 添加.s汇编文件到工程中



4.1.7 在.s汇编文件中写汇编代码

5.程序编写
1指令:编译完生成一条机器码存储在内存单元当中,CPU执行时能完成对应的操作
1) 数据处理指令: 对数据进行逻辑、算数运算
2) 跳转指令: 实现程序的跳转,实质是修改PC
3) Load/Store指令:对内存的读写操作
4)状态寄存器传送指令:对CPSR进行读写操作
5)异常中断产生指令:触发软中断,常用于内核的系统调用
6)协处理器指令;操作协处理器的指令
2.伪操作:不会生成机器码也不会占用内存,其作用是告诉编译器怎样编译(类似C中的宏定义)
3.伪指令:不是指令,编译器在编译时将其替换成等效的指令
5.1 数据处理指令
AREA RESET,CODE,READONLY;定义一个代码段RESET,属性为只读
ENTRY ;程序的入口
; 1)数据处理指令
; 搬移指令 MOV 作用:赋值=
MOV R0,#2
MOV R1,#3
MOV R2,#1
MOV R3,#3
MOV R4,#4
MOV PC,#0 ;PC取址0 循环;数据取反指令 MVN
MVN R4,#0X000000FF ;R4=~0X000000FF=0XFF000000
MOV R5,#255; 立即数:合法的数,包含在指令中的数
; 与普通变量的区别:立即数是存储在寄存器中,执行速度快
; 缺点:长度有限 这里规定最大为12bit,2^12=4096个数(连续数:0-255)其余为离散数
LDR R5,=0X12345678
; 加法指令 ADD
ADD R2,R0,R1 ;R2=R0+R1
; 减法指令 SUB
SUB R2,R1,R0 ;R2=R1-R0
; 乘法指令 MUL
MUL R2,R0,R1 ;R2=R0*R1
END

; nzcv验证
; SUBS R2,R0,R1 ;验证N 加S并使用减法指令产生负数,验证N位,发现被置位 n=1负数
; SUBS R1,R0,R2 ;验证Z 加S并使用减法指令产生0,验证z位,发现z和c都被置1,
;因为减法时产生借位c会被置0,没有借位被置1
; MOV R1,#0XFFFFFFFE
; MOV R2,#2
; ADDS R3,R1,R2 ;验证C,加法指令产生了进位(注意这里是32位),C位被置1
5.2 带标志位的加法ADC ADDS
; 第一个数;0X00000001 0XFFFFFFFF
; 第二个数;0X00000003 0X00000004
; 第一个数的低32位放到R1,高32bit放R2
; 第二个数的低32位放R3,高32bit放R4
; 低加低 高加高 运算结构的低32bit放R5,高32bit放R6
MOV R1,#0XFFFFFFFF
MOV R2,#0x00000001
MOV R3,#0X00000004
MOV R4,#0X00000003
ADDS R5,R1,R3 ;ADDS进位 C标志位置1
ADC R6,R4,R2 ;本质R6=R4+R2+‘c’ ADC带进位的加法
5.3 跳转指令B\BL
MOV R0,#2
CMP R0,#1
;B JUMP ;B 只是跳转
;BL JUMP ;BL 跳转后PC=LR 可跳转回去
;BEQ JUMP ;CMP相等时跳转==if((EQ)(B JUMP)) 本质:if(R0-#1==0){B JUMP}
;BNE JUMP ;CMP不相等时跳转
MOV R0,#2
MOV R0,#3
JUMP
MOV R0,#4
MOV R1,#5
MOV PC,LR
5.4 单寄存器内存访问

单寄存器内存访问的索引方式(寻址方式)
MOV R0,#0XFFFFFFFF
MOV R1,#0X40000000
STR R0,[R1] ;将R0的数据写到R1地址内
LDR R2,[R1] ;读取R1地址里的内容到R2中
前索引 先偏移8位后存储数据
STR R0,[R1,#8]
后索引 先存储数据后偏移地址
STR R0,[R1],#4
自动索引 (前后索引)偏移地址并存储数据
STR R0,[R1,#4]!




5.5 批量寄存器内存访问
MOV R0,#1
MOV R1,#2
MOV R2,#3
MOV R3,#4
MOV R4,#5
MOV R5,#0X40000020
STM R5,{R0-R4}
STM R5,{R4,R2,R3,R1,R0}STMIA R5!,{R0-R4} ; 空增
STMIB R5!,{R0-R4} ; 满赠
STMDA R5!,{R0-R4} ; 空减
STMDB R5!,{R0-R4} ; 满减
5.6 栈的应用->叶子函数的调用过程
MOV SP,#0X40000020 ;初始化栈地址
MAIN
MOV R1,#1
MOV R2,#2
BL FUNC
ADD R3,R1,R2
TOP
B TOP
FUNC
STMFD SP!,{R1,R2}
MOV R1,#10
MOV R2,#5
SUB R3,R1,R2
LDMFD SP!,{R1,R2}
MOV PC,LR
5.6 栈的应用->非叶子函数的调用过程
MOV SP,#0X40000020 ;初始化栈地址
MAIN
MOV R1,#1
MOV R2,#2
BL FUNC
ADD R3,R1,R2
TOP
B TOP
FUNC
STMFD SP!,{R1,R2,LR}
MOV R1,#10
MOV R2,#5
BL FUNC1
SUB R3,R1,R2
LDMFD SP!,{R1,R2,LR}
MOV PC,LR
FUNC1
STMFD SP!,{R1,R2}
MOV R1,#20
MOV R2,#10
SUB R3,R1,R2
LDMFD SP!,{R1,R2}
MOV PC,LR
END

相关文章:
ARM微架构与程序编写
目录 1.流水线 2.指令流水线 3. 多核处理器编辑 4. 工程搭建 4.1为Keil软件配置编译工具链 5.程序编写 5.1 数据处理指令 5.2 带标志位的加法ADC ADDS 5.3 跳转指令B\BL 5.4 单寄存器内存访问 5.5 批量寄存器内存访问 5.6 栈的应用->叶子函数的调用过程 5.…...
Windows下利用Anaconda创建多个CUDA环境
参考 https://blog.csdn.net/qq_42395917/article/details/126237388 https://blog.csdn.net/qq_42406643/article/details/109545766 (待学习补充) https://blog.csdn.net/qq_43919533/article/details/125694437 (待学习补充) 安装cudatoolkit和cudnn # 前提是我已经安装了…...
C SS复习笔记
1.img标签 img的src属性是图片显示不出来时显示的文字 ing的title属性是光标放到图片上,提示的文字 2.a标签 a标签的target属性表示打开窗口的方式,默认的值是_self表示当前窗口的打开页面,_blank表示新窗口打开页面。 a标签的href链接分…...
LeetCode 225 用队列实现栈
题目: 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回…...
Java对象的共享
要编写正确的并发程序,关键问题在于:在访问共享的可变状态时需要进行正确的管理。第2章介绍了如何通过同步来避免多个线程在同一时刻访问相同的数据,而本章将介绍如何共享和发布对象,从而使它们能够安全地由多个线程同时访问。这两…...
漏洞概述-0day漏洞利用原理(0)
0day专题对作者来说是一个很大的挑战,但无论有多难,作者会坚持进行大量的对新旧技术(精通二进制、汇编语言、操作系统底层的知识)实践并尽可能做到完善,最终利用技术发扬正能量。 bug 与漏洞 随着现代软件工业的发展,软件规模不断扩大,软件内部的逻辑也变得异常复杂。为…...
交换机的4种网络结构方式:级联方式、堆叠方式、端口聚合方式、分层方式
交换机是计算机网络中重要的网络设备之一,用于实现局域网(LAN)内部的数据转发和通信。交换机可以采用不同的网络结构方式来满足不同的网络需求和拓扑结构。本文将详细介绍交换机的四种网络结构方式:级联方式、堆叠方式、端口聚合方…...
firewall-cmd防火墙策略
--permanent 永久生效,重启后规则不消失 不执行 firewall-cmd --reload 命令配置不生效 添加单个IP为白名单 firewall-cmd --permanent --zonepublic -add-rich-rulerule family"ipv4" source address"IP" accept 删除白名单 firewall-cmd --…...
解决SQLException: Incorrect string value异常
java开发中会遇到如下异常: org.apache.ibatis.exceptions.PersistenceException: ### Error updating database. Cause: java.sql.SQLException: Incorrect string value: \xF0\x9F\x95\xB32:... for column baseInfo at row 1 ### The error may involve com.f…...
桂院校园导航 导入 与 配置教程
将 静态项目/云开发项目 文件夹下最新版本的 文件夹下的 项目 的整个文件夹 复制到项目路径下(比如 D:\WeChatProjects),强烈建议不要直接扔在桌面上 云开发项目 需开通 云开发 功能(首月免费,次月19.9)&am…...
Linux上安装jdk Tomcat mysql redis
1.安装JDk 1.1这里使用xshell中xfxp进行文件的上传,将jdk二进制包上传到Linux服务器上 下载地址:Java Downloads | Oracle 或者这里有下载好的安装包:链接:https://pan.baidu.com/s/1ZSJxBDzDaTwCH2IG-d2Gig 提取码:…...
Postman中加url环境变量和token全局变量
环境变量引用 语法:{{变量名}} 环境变量分类 1. 全局变量:全局有效,在Postman中的任何集合中都可以使用该变量,作用域最大。 2. 环境变量:要申明环境变量,先要创建环境,然后在该环境中创建变…...
多线程事务回滚方法
多线程事务回滚方法 介绍案例演示线程池配置异常类实体类控制层业务层mapper工具类验证 解决方案使用sqlSession控制手动提交事务SqlSessionTemplate注入容器中改造业务层验证成功操作示例业务层改造 介绍 1.最近有一个大数据量插入的操作入库的业务场景,需要先做一…...
java单元测试( Hamcrest 断言)
java单元测试( Hamcrest 断言) 单元测试特征: 1 范围狭窄 2 限于单一类或方法 3 体积小 为什么要编写单元测试? 为了防止错误(很明显!) 而且还可以提高开发人员的生产力,因为单元测试: (1) 帮助实施——在…...
讨论和总结 树模型 的三种序列化 方式的区别(模型存储大小、序列化所用内存、序列化速度)...
一、前言 本文总结常用树模型: rf,xgboost,catboost和lightgbm等模型的保存和加载(序列化和反序列化)的多种方式,并对多种方式从运行内存的使用和存储大小做对比 二、模型 2.1 安装环境 pip install xgboos…...
Halcon中的一些3D算子
一、记录一些Halcon里的关于3D的算子 1.read_object_model_3d 从文件读取一个3d模型 如下图,读的一个ply文件出来是个3d点云模型 2.visualize_object_model_3d 交互式展示3d模型 即上个算子读出来后,通过这个算子可以把3d模型显示出来旋转、平移&am…...
Android:Selector + Layer-lists 实现 AppCompatCheckBox
最近做项目涉及到一些UI相关的东东,虽然比较简单,但是也很有趣,写两篇简短的博客记录一下。 一."Selector 两张图片"实现 AppCompatCheckBox AppCompatCheckBox 是 androidx的一个widget:androidx.appcompat.widget.…...
TreeMap类型添加数据
package com.test.Test11;import java.util.*;public class Test02 {public static void main(String[] args) {/** 增加:put(K key,V value)* 删除:clear() remove(Object key)* 修改:* 查看:entrySet() get(Object key) keySet(…...
iOS 16 UI 设计系统免费在线使用方法
1、iOS 16 UI 设计系统中有什么? iOS 16 UI 设计系统通常包含以下组件和元素: 1. 按钮:包括操作按钮、图标按钮、导航按钮、滚动按钮、切换按钮、单选按钮、复选框按钮、呼叫按钮等各种类型的按钮。 2. 窗口和 UI 控件:包括标签…...
【接口测试】JMeter接口关联测试
1 前言 我们来学习接口管理测试,这就要使用到JMeter提供的JSON提取器和正则表达式提取器了,下面我们来看看是如何使用的吧。 2 JSON提取器 1、添加JSON提取器 在线程组右键 > 添加 > 后置处理器 > JSON提取器 2、JSON提取器参数说明 N…...
Python打包神器大PK:Nuitka vs PyInstaller,谁才是你的菜?(附实测数据)
Python打包工具深度评测:Nuitka与PyInstaller的终极对决 当开发者需要将Python项目分发给没有Python环境的用户时,打包工具的选择往往成为关键决策。本文将深入分析两大主流工具Nuitka和PyInstaller在多个维度的表现,帮助开发者根据项目需求做…...
Apifox供应链投毒攻击--完整解析
🔴 安全应急通告:Apifox 桌面端供应链投毒与高危凭证窃取事件 一、 事件概述 近期监测到 Apifox 公网 SaaS 版桌面客户端遭遇严重的供应链投毒攻击。攻击者通过劫持合法的运行追踪模块,向用户下发具备凭证窃取、动态执行与持久化能力的恶意 J…...
淘宝虚拟商品选品实操:从儿童学习资料到游戏攻略的蓝海挖掘术
淘宝虚拟商品选品高阶指南:从儿童教育到游戏产业的精细化运营策略 在淘宝虚拟商品领域,真正能够持续盈利的卖家往往不是那些追逐热门品类的跟风者,而是懂得在细分市场中寻找差异化机会的"蓝海猎手"。儿童学习资料和游戏攻略这两个看…...
告别桌面混乱:NoFences让文件管理效率提升80%的空间收纳方案
告别桌面混乱:NoFences让文件管理效率提升80%的空间收纳方案 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 每天在杂乱的桌面图标中寻找文件,就像在堆…...
用STM32和示波器搞定美的/格力空调红外遥控(附完整C代码)
STM32实战:从示波器捕获到空调红外协议逆向全解析 红外遥控技术看似简单,却蕴含着精妙的时序设计和协议逻辑。作为一名长期混迹于硬件开发领域的工程师,我经常遇到需要逆向控制家电的场景。最近在智能家居项目中,就遇到了需要通过…...
别再手动敲命令了!用PyCharm自带功能一键创建Linux桌面快捷方式(附手动配置备份方案)
告别终端:PyCharm内置工具3秒生成Linux桌面快捷方式(附应急手动方案) 每次打开PyCharm都要在终端输入一长串路径?作为开发者,我们的时间应该花在创造价值上,而不是重复输入命令。JetBrains早就为Linux用户准…...
3大技术突破重新定义魔兽地图编辑工作流
3大技术突破重新定义魔兽地图编辑工作流 【免费下载链接】HiveWE A Warcraft III world editor. 项目地址: https://gitcode.com/gh_mirrors/hi/HiveWE 对于《魔兽争霸III》地图制作者而言,最令人沮丧的体验莫过于:精心设计的地形布局在实际测试中…...
保姆级教程:从WOS下载文献到Citespace出图,手把手搞定科研可视化(附避坑指南)
科研可视化实战:从WOS数据采集到Citespace图谱优化的完整指南 第一次打开Citespace时,看着满屏的英文参数和报错提示,我盯着屏幕发了十分钟呆——这大概是每个科研新手都会经历的"震撼教育"。文献计量分析本应是揭示知识脉络的利器…...
python基于flask的学生学业质量成绩分析系统演可视化大屏 大数据
目录同行可拿货,招校园代理 ,本人源头供货商功能模块分析可视化大屏设计大数据处理架构预警与决策支持技术实现要点项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块分析 数据采…...
【PyTorch 3.0静态图分布式训练黑盒揭秘】:从FX Graph到Triton Kernel调度的7个隐藏断点与性能衰减临界值
第一章:PyTorch 3.0静态图分布式训练面试综述随着大规模模型训练需求激增,PyTorch 3.0正式引入原生静态图编译(torch.compile)与分布式训练深度协同机制,显著提升多GPU/多节点场景下的吞吐与可复现性。该版本将 torch.…...
