ARM微架构与程序编写

news2024/9/28 11:20:01

目录

1.流水线

2.指令流水线 

3. 多核处理器​编辑

4. 工程搭建

4.1为Keil软件配置编译工具链

5.程序编写 

5.1 数据处理指令

5.2 带标志位的加法ADC ADDS

5.3 跳转指令B\BL

5.4 单寄存器内存访问

5.5 批量寄存器内存访问

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

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

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

相关文章

算法基础学习笔记——⑭欧拉函数\快速幂\扩展欧几里得算法\中国剩余定理

✨博主:命运之光 ✨专栏:算法基础学习 目录 ✨欧拉函数 🍓求欧拉函数 : 🍓筛法求欧拉函数 : ✨快速幂 ✨扩展欧几里得算法 ✨中国剩余定理 前言:算法学习笔记记录日常分享,需要的看哈O(∩_∩)O&#…

chatgpt赋能python:Python中的倒序输出方法

Python中的倒序输出方法 在Python中,倒序输出是一个经常用到的操作。倒序输出可以用于字符串、列表、元组等数据类型,帮助我们更方便地处理数据。 字符串的倒序输出 对于字符串,我们可以使用字符串切片的方法倒序输出。例如,我…

十二、Vben之Vue3+vite跨域代理地址实现

在vue2中使用proxy进行跨域的原理是:将域名发送给本地的服务器(启动vue项目的服务,loclahost:8080),再由本地的服务器去请求真正的服务器。 代码如下: 1.在proxy中设置要访问的地址,并重写/api为空的字符串,这里如果不重写,会相当于在代理的地址上默认加了/api,所以…

chatgpt赋能python:Python中安装jieba分词器

Python中安装jieba分词器 介绍 中文分词是文本挖掘中非常重要的一个环节,而jieba是Python中最受欢迎的中文分词器之一。jieba分词器是基于汉语词汇库进行分词,并支持多种分词模式,可以满足不同场景的分词需求。 本文将介绍如何在Python环境…

chatgpt赋能python:Python中如何安装pip

Python中如何安装pip 什么是pip? pip,全称pip installs packages,是一个Python包管理工具,可以用来安装、升级和卸载Python包。它广泛地应用于Python社区,可以帮助Python开发者快速地获取和分享Python代码。 安装pi…

对比 RS232,RS422,RS485

对比 RS232,RS422,RS485 首先, 串口、UART口、COM口、RJ45网口、USB口是指的物理接口形式(硬件)。TTL、RS-232、RS-485、RS-422是指的电平标准(电信号)。 RS232,RS422,RS485 对比表格 通信标准RS-232RS-422RS-485工作方式单端差分差分通信线数量4 地线52 地线3节…

《深入理解计算机系统(CSAPP)》第5章 优化程序性能 - 学习笔记

写在前面的话:此系列文章为笔者学习CSAPP时的个人笔记,分享出来与大家学习交流,目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记,在复习回看时发现部分内容存在一些小问题,因时间紧张来不及再次整理…

Java中如何判断是否为闰年

✨博主:命运之光 ✨专栏:Java经典程序设计 目录 ✨介绍 🍓引言:闰年的定义和在编程中的应用 🍓目的:介绍如何使用Java编写一个函数来判断年份是否为闰年 ✨闰年的条件 ✨提供数学原理和背景知识 &…

软考A计划-试题模拟含答案解析-卷十一

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

牛客网刷题学习SQL(三)

SQL23 统计每个学校各难度的用户平均刷题数 首先分析题目: 想要计算一些参加了答题的不同学校、不同难度的用户平均答题量 不同学校: group by 学校 不同难度: group by 难度 平均答题量:注意用户去重,还有指定questi…

python:绘制GAM非线性回归

作者:CSDN _养乐多_ 本文将介绍使用python语言绘制广义线性模型(Generalized Additive Model,GAM)非线性回归散点图和拟合曲线。并记录了计算RMSE、ubRMSE、R2、Bias的代码。 文章目录 一、GAM非线性回归详解二、代码三、计算RM…

华为OD机试真题B卷 Java 实现【统计字符】,附详细解题思路

一、题目描述 输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数。 数据范围:输入的字符串长度满足 1 \le n \le 1000 \1≤n≤1000 。 二、输入描述 输入一行字符串,可以有空格。 三、输出描述 统计其中英文字符&#…

chatgpt赋能python:Python中如何空一行

Python中如何空一行 在Python编程中,许多情况下我们需要在输出内容的时候空出一行。今天我们将介绍如何在Python中实现空一行的方法。 方法1:使用print()函数 在Python中,我们可以使用print()函数打印空行。我们只需在print()函数中输入两…

并发编程 原子性 可见性 有序性

并发编程的三个重要特性 原子性所谓原子性是指在一次的操作或者多次操作中,要么所有的操作全部都得到了执行并且不会受到任何因素的干扰而中断,要么所有的操作都不执行。可见性可见性是指,当一个线程对共享变量进行了修改,那么另…

chatgpt赋能python:Python中如何合并列表-详细教程

Python中如何合并列表 - 详细教程 在Python编程中,有时候需要把两个或多个列表合并成一个单一的列表,以便更好地进行数据处理。Python中有几种方法可以实现列表合并,本文将介绍其中的三种方法。 1. 使用“”符号 最常见的方法是使用“”符…

InsCode AI 创作助手:源于 CSDN 的 AI 创作助手,不一样的创作体验

文章目录 📋前言🎯AIGC 时代的产物🎯InsCode AI 创作助手体验🎯一些感受和建议🧩感受🧩建议(个人看法) 📝最后 📋前言 是的没错,CSDN AI 写作助手…

Vue组件化开发

1. 认识组件 1.1 基础示例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widt…

STM32CubeIDE + HAL + STM32f103C8T6 系列教程1 ---板载PC13LED闪烁

STM32CubeIDE HAL STM32f103C8T6 系列教程1 --- 板载PC13LED闪烁 引言硬件关于开发板[^2]控制器内置存储器原理图 硬件连线硬件连接表硬件连线图 软件STM32CubeIDE下载及安装Stm32CubeIDE设置补全快捷键和主题新建一个工程选择开发板核心芯片型号设置工程相关参数STM32CubeMX…

最热门高效的Node.JS开源第三方开发库和特点(持续更新......)

目录 1. Express 2. Socket.io 3. Mongoose 4. Passport 5. Async 6. PM2 7. Nodemailer 8. Request 9. Cheerio 10. Lodash 11. Bluebird 12. Winston 13. Socket.io-client 14. Node-sass 15. Moment 16. Gulp 17. Grunt 18. Chai 19. Sinon 20. Nodemon…

Java线程之间如何通信的,有哪些方式?

线程之间的通信方式主要有以下几种&#xff1a; 共享变量&#xff1a;线程之间可以通过共享变量来进行通信。不同的线程可以共享同一个变量&#xff0c;并在变量上进行读写操作。需要注意的是&#xff0c;共享变量可能会引发线程安全问题&#xff0c;需要通过同步机制来确保线程…