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

这篇具有很好参考价值的文章主要介绍了ARM汇编第一次上机(顺序、分支、单重循环)【嵌入式系统】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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); 	//62fe14
	printf("%x\n",&n); 	//62fe14
	printf("%d\n",n); 	//10
	printf("%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 62fe04
		printf("%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

流程图

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

代码编写

	AREA  sum1, CODE, READONLY		; 代码段的名字 sum1
	ENTRY                   		; 程序的入口
	CODE32
num	EQU	100                   		; 求和的次数
start
	LDR	R0,  =0           	; R0 求和结果
	LDR	R1,  =1      	  	; R1作为被加数
	LDR	R2,  =num         	; R2作为计数器
	LDR R3,  =sum		  	; R3指向sum
sumloop
	ADD	R0, R0,	R1    		; R0=R0+R1
	ADD	R1, R1,#1       	; R1=R1+1

	
	SUBS R2,  R2,  #1    	; 计数器值减1
	BNE	sumloop           		; 如果不为0,那么继续跳到sum执行
	STREQ	R0,  [R3]  
stop
	MOV	r0, #0x18
	LDR	r1, =0x20026		
	SWI	0x123456        

	AREA  Data, DATA, READWRITE
sum DCD	0

	END

结果分析

初始化后

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

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

运算结果

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

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

2 sum2

流程图

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

代码编写

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

stop
        MOV    r0, #0x18
        LDR     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

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

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

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

3 numbers

流程图

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

流程图1
ARM汇编第一次上机(顺序、分支、单重循环)【嵌入式系统】
流程图2
ARM汇编第一次上机(顺序、分支、单重循环)【嵌入式系统】
流程图3
ARM汇编第一次上机(顺序、分支、单重循环)【嵌入式系统】
流程图4
ARM汇编第一次上机(顺序、分支、单重循环)【嵌入式系统】

代码编写

	AREA  numbers, CODE, READONLY		; 代码段的名字 max
	ENTRY                   		; 程序的入口
	CODE32
num	EQU	17                   		; 比较的次数 数组长度-1
start
	LDR	R0,  =nums           		; R0指向源数据块x
	LDR	R1,  =max           		; R1指向单元max
	LDR	R3,  [R0]        			; 将源数据块x中第一个数加载到R3中 用来保存max
	LDR	R5,  [R0]        			; 将源数据块x中第一个数加载到R5中 用来保存min
	LDR R7,  =0						; R7 总和sum
	LDR R8,  =0 					; R8 单元avg
	LDR R9,  =0						; R9 小于平均值的个数
	LDR R10, =0						; R10 等于平均值的个数
	LDR R11, =0						; R11 大于平均值的个数
	
	
	
;最大最小总和	
	LDR	R2,  =num      				; R2作为计数器
	ADD R7,R3						; 加第一项
	ADD	R0, R0,	#4					; 跳过第一项
numbersloop
	LDR	R4, [R0],#4       			; 依次将源数据块x中下一个数加载到R4中
	ADD R7,R4						; 求和R7+=R4
	CMP	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       		; 计数器值减1
	BNE	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					; 跳过第一项
numsloop
	LDR	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       		; 计数器值减1
	BNE	numsloop          			; 如果不为0,那么继续跳到numsloop执行
									; 如果为0,那么循环比较结束
	
	;多寄存器寻址
	STMIA R1!,{R3,R5,R8,R9,R10,R11};

stop
	MOV	r0, #0x18
	LDR	r1, =0x20026		
	SWI	0x123456        

	AREA  Data0, DATA, READONLY  ;平均值5
nums	DCD	1,9,2,8,3,7,4,6,5	 ;8 2 8
		DCD	1,9,2,8,3,7,4,6,5
	


	AREA  Data, DATA, READWRITE
max	DCD	0
min DCD 0
avg DCD 0
ltavg DCD 0
eqavg DCD 0
gtavg DCD 0
	END

结果分析

初始化后

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

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

计算最大最小总和

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

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

计算统计结果

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

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

存储结果

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

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

最后

2023-4-14 21:26:20

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

祝大家逢考必过
点赞收藏关注哦文章来源地址https://www.toymoban.com/news/detail-413806.html

到了这里,关于ARM汇编第一次上机(顺序、分支、单重循环)【嵌入式系统】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • shell第一次作业

    1、判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,每天检查次磁盘剩余空间。 2、判断web服务是否运行    1、查看进程的方式判断该程序是否运行,    2、通过查看端口的方式判断该程序是否运行,如果没有运行,则启动该服务并配置防火墙规

    2024年02月09日
    浏览(39)
  • 第一次面试复盘

    这个秋招到目前为止第一次拿到了面试机会,虽然是小公司,但是人家是有官网的!!!很爱!先赶紧复盘一下,因为还有很多笔试没有复盘。 你们的数学建模解决了什么问题?你觉得你们为什么能拿到这个成绩 说下对java这门语言的了解 它是一种面向对象的编程语言,所以

    2024年01月22日
    浏览(39)
  • 第一次PR经历

         

    2024年02月13日
    浏览(34)
  • python 第一次作业

    因为笔者有一些 c/c++ 语言的基础,所以应该学 python 会稍微简单一些 输入的时候所有的输入都是字符串类型,我们需要进行类型转换 参见资源里面的第三题和第四题,为了方便起见,直接把代码贴在下面

    2024年03月25日
    浏览(46)
  • 树莓派第一次开机

    树莓派由英国的树莓派基金会发行,旨在通过发行这个廉价开源的可随意破解的微型计算机,推动中小学编程教育,发行之后很快在全世界的开源创客圈中流行。截止到2018年10月,最新版本的树莓派主板是3B+,国内某宝上卖230元左右,还有更微型的树莓派主板Zero,国内某宝卖

    2024年02月13日
    浏览(42)
  • docker第一次作业

    docker第一次作业 1.安装docker服务,配置镜像加速器  yum install -y yum-utils device-mapper-persistent-data lvm2 y um-config-manager --add-repo https: //mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i \\\'s+download.docker.com+mirrors.aliyun.com/docker-ce+\\\'  /etc/yum.repos.d/docker-ce.repo yum makecache fast yum -y install docke

    2024年02月12日
    浏览(37)
  • 第一次作业

    作业内容:1,atd和crond的区别                   2,指定在2023/08/26 09:00将时间写入testmail.txt文件中                   3,指定在每天凌晨4:00将该时间点之前的系统日志信息备份到个目录下(/var/log/messages ),备份后日志文件名显示格式logfileYY-MM-DD HH-MM 1、运行方式不同

    2023年04月20日
    浏览(40)
  • 第一次博客作业

    这学期才开始接触Java,之前只学了C语言,所以一开始写题目的代码的时候对Java的众多函数和语法不是太熟悉,一开始就上手写代码有点不适应。 ​  关于类: 1、类似C中的struct,构造函数、内置方法(函数 )都比较相似 2、尽量避免代码的重复,把private和public的方法搞清晰。

    2024年02月08日
    浏览(51)
  • jQuery第一次接触

    jQuery是一个轻量级js库 1.下载jquery库,网址Download jQuery | jQuery npm i jquery 2.还可以从cdn中载入jquery script src=\\\"https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js\\\" 3.j代表js,query代表查询,jQuery可以进行查询的js语言,主要用来查询html元素 4.基础语法$(selector).action(),其中selector代表要进行操

    2024年02月12日
    浏览(34)
  • 新学期第一次课

    在信息化飞速发展的今天,大数据技术的应用日益广泛,其重要性也日益凸显。对于大数据学院的同学来说,掌握行业前沿技术是至关重要的。本篇文章将详细指导同学们如何加入QQ群、云班课,并学会使用思维导图和CSDN博客。 我们有两个QQ群,分别是2021计应1班行业前沿技

    2024年02月10日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包