ARM汇编第一次上机(顺序、分支、单重循环)【嵌入式系统】

news/2024/12/26 21:27:43/

ARM汇编第一次上机(顺序、分支、单重循环)【嵌入式系统】

  • 前言
  • 推荐
  • 说明
  • ARM汇编第一次上机(顺序、分支、单重循环)
    • 内容
    • 1 sum1
      • 流程图
      • 代码编写
      • 结果分析
    • 2 sum2
      • 流程图
      • 代码编写
      • 结果分析
    • 3 numbers
      • 流程图
      • 代码编写
      • 结果分析
  • 最后

前言

2023-4-14 19:30:55

以下内容源自《创作模板三》
仅供学习交流使用

推荐

ARM简单程序设计【嵌入式系统】

说明

第一点 关于&

不会有人不知道?
我流程图中写的R3=&nums
&是什么意思吧?

请看下面C语言程序

#include<stdio.h>
int main(){int n=10;int *p=&n;printf("%x\n",p); 	//62fe14printf("%x\n",&n); 	//62fe14printf("%d\n",n); 	//10printf("%d\n",*p); 	//10
} 

回答&号是取地址的意思哦

第二点 关于说明中的R0++

说明
此处R0用来遍历数组的指针
流程图中R0++表示指针移动到下一个存储数据
因为此数组nums是按字对齐存储数据的
所以实际代码中是R0=R0+4(一个字是4字节)

请看以下C语言程序

#include<stdio.h>
int main(){int nums[10]={0,1,2,3,4,5,6,7,8,9};int *p=nums;for(int i=0;i<10;i++){printf("%x ",p);//62fde0 62fde4 62fde8 62fdec 62fdf0 62fdf4 62fdf0 62fdf8 62fdfc 62fe00 62fe04printf("%d ",*p++);//0 1 2 3 4 5 6 7 8 9}
} 

结论不再赘述

//结果显而易见
//p是int型指针 
//int存储32位数据 4字节
//p++就是指针移动到下一个存储数据	

ARM汇编第一次上机(顺序、分支、单重循环)

内容

按照要求编程实现以下功能
1、编程实现两种求和运算,1+2+…+100求和运算,按条件求和运算1+2+…+n >1000 ? ,不局限于这个题目,可以按自己的想法分别完成按计数、条件判断的循环编程与调试(6分)
2、给定10-20个数中找出最大数和最小数(自定义),求平均值,统计小于、大于及等于平均值的个数; (9分)

要求:
1、提交自己实际调试结果截图;
2、上传录制视频,讲述实验完成情况,先演示完成的功能,然后简要分析代码。(控制在5~6分钟左右)
3、简要写出设计思路,画出程序流程图,并把调试结果截图附录,以PDF格式形成报告(与下次实验一起提交)。

1 sum1

流程图

在这里插入图片描述

代码编写

	AREA  sum1, CODE, READONLY		; 代码段的名字 sum1ENTRY                   		; 程序的入口CODE32
num	EQU	100                   		; 求和的次数
startLDR	R0,  =0           	; R0 求和结果LDR	R1,  =1      	  	; R1作为被加数LDR	R2,  =num         	; R2作为计数器LDR R3,  =sum		  	; R3指向sum
sumloopADD	R0, R0,	R1    		; R0=R0+R1ADD	R1, R1,#1       	; R1=R1+1SUBS R2,  R2,  #1    	; 计数器值减1BNE	sumloop           		; 如果不为0,那么继续跳到sum执行STREQ	R0,  [R3]  
stopMOV	r0, #0x18LDR	r1, =0x20026		SWI	0x123456        AREA  Data, DATA, READWRITE
sum DCD	0END

结果分析

初始化后

R0=0
R1=1
R2=0x64=100
R3=&sum=0x40000000

在这里插入图片描述

运算结果

R0=0x000013BA=5050
R1=0x65=101
R2=0
R3=&sum=0x40000000
[0x40000000]=0x000013BA

在这里插入图片描述

2 sum2

流程图

在这里插入图片描述

代码编写

	 AREA  SUM, CODE, READONLY	; 代码段的名字 SUMENTRY                   			; 程序的入口CODE32
startLDR   R0,   =n            ; 将数据段中自然数的个数n的地址加载到R0寄存器LDR   R1,   =sum       ; 将数据段中自然数的累加和sum的地址加载到R1寄存器LDR   R3,   =0            ; R3存放自然数的累加和LDR   R4,   =0            ; R4用于循环个数的统计/每次取得的自然数LDR   R5,   =1000      ; R5用于循环结束的界限值
continueADD	R4,   R4,	    #1    ; 取下一个自然数ADD	R3,   R3,	   R4    ; 累加自然数CMP	R3,   R5             ; 比较累加和是否超过了1000BCC	continue            ; 如果小于1000,那么跳到compare执行STRCS   R3,  [R1]     ; 如果大于1000,那么将累加和存储到R1所指向的单元中STRCS   R4,   [R0]    ; 如果大于1000,那么将已累加的自然数个数值存储; 到R0所指向的单元中 stopMOV    r0, #0x18LDR     r1, =0x20026			SWI     0x123456 AREA  Data, DATA, READWRITE
n	DCD	0	    ; 定义累加的自然数的个数
sum	DCD	0 	   ; 定义自然数的累加和

结果分析

初始化后

R0=&n=0x40000000
R1=&sum=0x40000004
R3=0
R4=0
R5=0x3E8=1000

在这里插入图片描述
运算结果

R3=0x40B=1035
R4=0x2D=45
[0x40000000]=0x0000002D
[0x40000004]=0x0000040B

在这里插入图片描述

3 numbers

流程图

总体流程图
请添加图片描述

流程图1
在这里插入图片描述
流程图2
在这里插入图片描述
流程图3
在这里插入图片描述
流程图4
在这里插入图片描述

代码编写

	AREA  numbers, CODE, READONLY		; 代码段的名字 maxENTRY                   		; 程序的入口CODE32
num	EQU	17                   		; 比较的次数 数组长度-1
startLDR	R0,  =nums           		; R0指向源数据块xLDR	R1,  =max           		; R1指向单元maxLDR	R3,  [R0]        			; 将源数据块x中第一个数加载到R3中 用来保存maxLDR	R5,  [R0]        			; 将源数据块x中第一个数加载到R5中 用来保存minLDR R7,  =0						; R7 总和sumLDR R8,  =0 					; R8 单元avgLDR R9,  =0						; R9 小于平均值的个数LDR R10, =0						; R10 等于平均值的个数LDR R11, =0						; R11 大于平均值的个数;最大最小总和	LDR	R2,  =num      				; R2作为计数器ADD R7,R3						; 加第一项ADD	R0, R0,	#4					; 跳过第一项
numbersloopLDR	R4, [R0],#4       			; 依次将源数据块x中下一个数加载到R4中ADD R7,R4						; 求和R7+=R4CMP	R3, R4             			; 比较R3和R4中数的大小 MOVCC  R3,  R4          		; 如果R3小于R4,则将较大的数送入R3中CMP R5, R4						; 比较R5和R4中数的大小MOVCS R5,R4 					; 如果R5大于R4,则将较小的数送入R5中SUBS R2,  R2,  #1       		; 计数器值减1BNE	numbersloop          		; 如果不为0,那么继续跳到numsloop执行; 如果为0,那么循环比较结束;求平均值								LDR R8,  =5 					; R8 单元avg									;统计...LDR	R0,  =nums           		; R0指向源数据块x	LDR	R2,  =num      				; R2作为计数器LDR	R4, [R0]					;先比较一次CMP	R8, R4             			; 比较R8和R4中数的大小 ADDHI  R9, R9, #1          		; 如果R8大于R4,则R9++ADDEQ R10,R10,#1				; 如果R8等于R4,则R10++ADDCC R11, R11, #1  			; 如果R8小于R4,则R11++ADD	R0, R0,	#4					; 跳过第一项
numsloopLDR	R4, [R0],#4       			; 依次将源数据块x中下一个数加载到R4中CMP	R8, R4             			; 比较R8和R4中数的大小 ADDHI  R9, R9, #1          		; 如果R8小于R4,则R9++ADDEQ R10,R10,#1				; 如果R8等于R4,则R10++ADDCC R11, R11, #1  			; 如果R8大于R4,则R11++SUBS R2,  R2,  #1       		; 计数器值减1BNE	numsloop          			; 如果不为0,那么继续跳到numsloop执行; 如果为0,那么循环比较结束;多寄存器寻址STMIA R1!,{R3,R5,R8,R9,R10,R11};stopMOV	r0, #0x18LDR	r1, =0x20026		SWI	0x123456        AREA  Data0, DATA, READONLY  ;平均值5
nums	DCD	1,9,2,8,3,7,4,6,5	 ;8 2 8DCD	1,9,2,8,3,7,4,6,5AREA  Data, DATA, READWRITE
max	DCD	0
min DCD 0
avg DCD 0
ltavg DCD 0
eqavg DCD 0
gtavg DCD 0END

结果分析

初始化后

R0=&nums=0xB0
R1=&max=0x40000000
R3=[R0]=nums[0]
R5=[R0]=nums[0]
R7=0
R8=0
R9=0
R10=0
R11=0
[0x000000B0]=0x00000001

在这里插入图片描述

计算最大最小总和

R0=0xF8 	//最后一个元素地址
R3=0x09		//最大值
R5=0x01		//最小值
R7=0x5A=90	//求和结果

在这里插入图片描述

计算统计结果

R8=0x05  		//平均值
R9=0x08			//小于平均值的个数
R10=0x02		//等于平均值的个数
R11=0x08		//大于平均值的个数

在这里插入图片描述

存储结果

[0x40000000]=0x00000009	//最大值
[0x40000004]=0x00000001 //最小值
[0x40000008]=0x00000005 //平均值
[0x4000000C]=0x00000008 //小于平均值的个数
[0x40000010]=0x00000002 //等于平均值的个数
[0x40000014]=0x00000008 //大于平均值的个数

在这里插入图片描述

最后

2023-4-14 21:26:20

你对我百般注视,并不能构成万分之一的我,却是一览无余的你。

祝大家逢考必过
点赞收藏关注哦


http://www.ppmy.cn/news/46975.html

相关文章

基于C#编程建立泛型Vector数据类型及对应处理方法

目录 一、简介 二、方法 2.1 建立Vector类 2.2 Vector成员 2.3 Vector属性 2.4 Vector方法 2.4.1 构造函数 2.4.2 Vector元素操作方法 2.4.3 Vector 运算 三、调用方法 3.1 方法 3.1.1 Append 3.1.2 this[] 3.1.3 Insert 3.1.4 DelLen 3.1.5 FindNumber 3.1.6 …

觉非科技发布:基于BEV的数据闭环融合智驾解决方案

2023年上海车展期间&#xff0c;觉非科技基于BEV的数据闭环融合智能驾驶解决方案正式发布。 该方案可通过量产车BEV的实时感知结果&#xff0c;提供完整的城市Map-lite及Map-free数据闭环融合解决方案&#xff0c;并满足城市NOA、记忆通勤/泊车以及感知大模型训练的需要。 车…

数据结构之顺序表

&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;博主大一智能制造在读&#xff0c;热爱C/C&#xff0c;会不定期更新系统、语法、算法、硬件的相关博客&#xff0c;浅浅期待下一次更新吧&#xff01; ✈️算法专栏&#xff1a;算法与数据结构 &#x1f618;博客制…

【动手学深度学习】使用块的网络(VGG)

使用块的网络&#xff08;VGG&#xff09; 本文为李沐老师《动手学深度学习》一书的学习笔记&#xff0c;原书地址为&#xff1a;Dive into Deep Learning。 另&#xff0c;给自己练习时没有gpu资源的小伙伴推荐下kaggle数据科学网站&#xff0c;每周免费训练时长30h。 1 网络结…

大数据=SQL Boy,SQL Debug打破SQL Boy 的僵局

网上经常盛传 大数据sql boy&#xff0c;后端开发crud boy&#xff0c;算法工程师调参boy 在大数据领域也工作了好几年了&#xff0c;确实大数据开发&#xff0c;很多工作就是写sql&#xff0c;hive sql、spark sql、flink sql等等sql 一、背景&#xff1a; 但是经常有这样一…

不能使用chatGPT?这3个平替甚至比chatGPT更强

不能使用chatGPT&#xff1f;这3个平替甚至比chatGPT更强 chatGPT&#xff0c;一款由OpenAI开发的新型AI聊天机器人&#xff0c;正在势如破竹地改变着许多人的工作和生活方式。作为一款基于大语言模型的聊天机器人&#xff0c;chatGPT能够理解自然语言并进行人机对话。与传统的…

【LeetCode: 300. 最长递增子序列 | 暴力递归=>记忆化搜索=>动态规划】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

E4--光纤接口通信测试应用2023-04-17

1.场景 使用两块开发板A和B&#xff0c;通过光纤接口将在A板上ROM中存储的图片数据转发到B板并显示在B板连接的显示屏上&#xff0c;实现光纤接口通信。 具体场景是&#xff0c;由于A735T片上资源有限&#xff0c;因此ROM IP存储了一张1024*600&#xff08;LVDS屏幕&#xff0…