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…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
