汇编第二次上机实验(续第一次,字符串比较及双重循环)【嵌入式系统】

news2024/10/5 19:12:32

汇编第二次上机实验(续第一次,字符串比较及双重循环)【嵌入式系统】

  • 前言
  • 推荐
  • 说明
  • 汇编第二次上机实验(续第一次,字符串比较及双重循环)
    • 内容
    • 1 sort
      • 说明
      • 流程图
      • 代码编写
      • 结果分析
    • 2 string
      • 流程图
      • 代码编写
      • 结果分析
    • 3 Bibble
      • 流程图
      • 代码编写
      • 结果分析
    • 4 factorial
      • 流程图
      • 代码编写
      • 结果分析
    • 5 略
  • 最后

前言

2023-4-14 21:29:03

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

推荐

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

说明

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

汇编第二次上机实验(续第一次,字符串比较及双重循环)

内容

按照要求编程实现以下功能,简要写出设计思路,画出程序流程图,并把调试结果截图附录,提交实验报告。
录制上传视频,演示实验并讲述主要过程。(10分钟左右视频)

1、修改排序程序,按照字节方式排序,画出编程思路及程序流程。(5分)
2、编程实现统计任意两个字符串各自包含的字符个数的功能,约定字符串以0为结束标志,然后对这两个字符串判断是否匹配(是否一致)?灵活一点可以给定3个字符串,然后进行比较。(基本功能8分,字符统计4分,字符串比较4分)
3、课本第11题,参考冒泡排序程序完成编程与调试(7分)
4、编写一个求阶乘 N!的 ARM 汇编程序,给定N 值(10~20中间取值),然后完成求和运算:SUM=1!+2!+…+N!。(5分)
5、附加功能,结合C语言,在第4题基础上增加输入、输出人机交互功能,根据输入字符统计字符个数并比较输入的字符串是否匹配,打印显示结果。(10分)

1 sort

说明

第一点 为什么拷贝数组

首先,Keil4会把READWITER区初始化为0
其次,原始数据放到READONLY区,将不能改变
所以,要把原数数据(READONLY)拷贝到拷贝数组(READWITER)中,进行排序

第二点 右指针的计算

	LDR	R1,=nums				; (右指针)R1起初指向src第一个单元	
	LDRB R4,  count         	; R4中是数据区中待排序数据个数
	SUB	R4,  R4,  #1			; R4--
	ADD	R1,R1,R4				;(右指针)R1指向src最后一个单元 R1=R1+R4*1,

参见如下C语言

此处,不做过得解释

#include<stdio.h>
int main(){
	int nums[10]={0,1,2,3,4,5,6,7,8,9};
	int *p=nums;//nums[0]的地址 
	printf("%x\n",p);//62fdf0
	p=p+9;//nums[9]的地址 
	printf("%x\n",p);//62fe14
	printf("%d\n",*p);//9
} 

	//地址计算 
	//0x62fdf0+36=0x62fe14
	//address9=address0+9*sizeof(int) 
	//sizeof(int) =4

流程图

此处简画流程图

知道冒泡排序的思想即可

在这里插入图片描述

具体实现
可以结合注释
查看代码即可

代码编写

	AREA sort, CODE, READONLY
	ENTRY
start

	;实现数组拷贝 需要输入原数组 数组长度 输出目的数组 即可
    LDR R1,=nums0        	; R1指向数据区的源字符串
    LDR R0,=nums        	; R0指向数据区的目的字符串
	LDRB R3,count			;数组个数
    BL  numscopy            ; 调用子程序numscopy,完成数组拷贝


	LDR	R1,=nums				; (右指针)R1起初指向src第一个单元	
	MOV	R2,  #0					; 用于外层循环控制计数器,并初始化为0
	LDRB R4,  count         	; R4中是数据区中待排序数据个数
	SUB	R4,  R4,  #1			; R4--
	ADD	R1,R1,R4				;(右指针)R1指向src最后一个单元 R1=R1+R4*1,
outer						; 外层循环
	LDR	R0,  =nums				;(左指针)R0指向数据区src单元
inner						; 内层循环
	LDRB	R5,  [R0]				; 将R0所指向单元的数加载到R5中
	LDRB	R6,[R0, #1]				; 将相邻单元的数加载到R6中
	CMP	R5,  R6     			; 比较相邻两单元中的数
	STRBGT  R6,  [R0]  			;如果前者大于后者,那么两个数交换
	STRBGT  R5, [R0, #1]  	    ; 内层循环修改、控制部分
	ADD	R0,  R0,  #1  			; 地址指针向下拨移1个字节
	CMP	R0,  R1   				; 是否扫描了一遍
	BNE	inner 					; 没有完成一遍,继续内循环
							; 外层循环修改、控制部分,表示已经完成了一遍,
	ADD	R2,  R2,  #1		; 外层循环控制计数器加1
	SUB	R1,  R1,  #1		; 右指针R1向左指针方向移动1字节
	CMP	R2,  R4				; 是否全部扫描	
	BNE	outer				; 没有完成全部扫描,继续外循环
stop
	MOV R0,  #0x18  		; 程序结束返回编译器调试环境
	LDR		R1,  =0x20026
	SWI		0x123456
	
numscopy 	
    LDRB     R2,     [R1],    #1    ; 将R1指向的单元内容加载到R2中
    STRB     R2,     [R0],    #1    ; 将R2中的数存储到R0指向的单元中
	SUBS    R3,R3,#1			   ;R3--
    CMP     R3,      #0            ; 检查R0的值是否等于0
    BNE     numscopy               ; 如果不等于0,那么转到strcopy处执行 
    MOV     PC,    LR              ; 子程序返回 
        	
	AREA BlockData0, DATA, READONLY
nums0 DCB	1,2,3,4,5,9,8,7,6,0
count DCB	10

	AREA BlockData, DATA, READWRITE
nums DCB	1,2,3,4,5,9,8,7,6,0   ;Keil会把此数组初始化为0

	END

结果分析

数组拷贝

在这里插入图片描述

初始化右指针

R1=0x40000009   //右指针指向数组的最右端
R2=0			//计算器
R4=9 			//外循环次数

在这里插入图片描述

第一遍排序

R1=0x40000008	//右指针左移
R2=1			//计算器+1
R5,R6用于交换相邻数组元素

在这里插入图片描述

排序完成

R2=R4=9

在这里插入图片描述

2 string

流程图

在这里插入图片描述

代码编写

		AREA  string ,CODE, READONLY
        ENTRY
        CODE32
start
        LDR R1,=str1        ; R1指向数据区的源字符串1
		LDR R3,=0           ;暂存长度
		BL length			; 调用子程序length,完成求长度
		MOV R4,R3			;R4存str1的长度
		LDR R3,=0           ;暂存长度
        LDR R1,=str2        ; R1指向数据区的目的字符串2
        BL length           ; 调用子程序length,完成求长度
		MOV R5,R3			;R5存str2的长度

		LDR R1,=str1
		LDR R2,=str2 
		BL compare
		LDR R9,=eqstate
		STRB R8,[R9]

stop
        MOV     R0,     #0x18	         ; 程序结束返回编译器调试环境
        LDR      R1,     =0x20026
        SWI        0x123456
		
		;求字符串长度 输入R1 字符串起始地址 返回R3长度
length 
		ADD R3,R3,#1				 ;R3++
        LDRB R2,     [R1,#1]!        ; 将R1+1指向的单元内容加载到R2中 先前1位搜索
        CMP  R2,    #0               ; 检查R2的值是否等于0
        BNE  length                  ; 如果不等于0,那么转到length处执行 
        MOV  PC,    LR               ; 子程序返回 
        
		
		;比较字符串是否相等
		;输入R1 str1的地址 R4 str1的长度 R2 str2的地址 R5 str2的长度
		;输出 R8 比较结果 ;0表示不一样 1表示一样
compare		
		;比较长度是否相等
		CMP R4,R5
		MOVNE R8,#0
		MOVNE PC, LR        		; 子程序返回 
		
		MOV R4,#0					;作为计数
loop		
		LDRB R6,[R1],#1				;R6遍历str1
		LDRB R7,[R2],#1				;R7遍历str2		
				
		CMP R6,R7				;字符不相等
		MOVNE R8,#0				;即字符串不相等
		MOVNE PC,LR             ; 子程序返回 
		
		ADD R4,R4,#1			;计数器
		CMP R4,R5				;控制循环次数
		BNE loop

		MOV R8,#1				;遍历完 即为相等
		MOV PC,LR               ; 子程序返回 		
		
        AREA    Strings0, DATA, READONLY
str1  DCB "12345",0		; 源字符串1
str2  DCB "12345",0		; 源字符串2	
        AREA    Strings, DATA, READWRITE
eqstate DCB 0							;0表示不一样 1表示一样
        END 

结果分析

求长度

R4=5
R5=5

在这里插入图片描述
比较结果

R8=1
[0x40000000]=0x01

在这里插入图片描述

3 Bibble

流程图

与1相同

代码编写

	AREA Bibble, CODE, READONLY
	ENTRY
start

	;想实现数组拷贝 需要输入原数组 数组长度 输出目的数组 即可
	;这里借用字符串拷贝 要求源数组最后加一个无效元素0 中间不能出现0
    LDR       R1,    =src0        	; R1指向数据区的源字符串
    LDR       R0,    =src        	; R0指向数据区的目的字符串
    BL          strcopy             ; 调用子程序strcopy,完成字符串拷贝


	LDR	R1,=src				; (右指针)R1起初指向src第一个单元	
	MOV	R2,  #0				; 用于外层循环控制计数器,并初始化为0
	LDR	R4,  num         	; R4中是数据区中待排序数据个数
	SUB	R4,  R4,  #1		;R4--
	ADD	R1,  R4,LSL #2			;(右指针)R1指向src最后一个单元 R1=R1+R4*4,
outer						; 外层循环
	LDR	R0,  =src				;(左指针)R0指向数据区src单元
inner						; 内层循环
	LDR	R5,  [R0]				; 将R0所指向单元的数加载到R5中
	LDR	R6,[R0, #4]				; 将相邻单元的数加载到R6中
	CMP	R5,  R6     			; 比较相邻两单元中的数
	STRGT  R6,  [R0]  			;如果前者大于后者,那么两个数交换
	STRGT  R5, [R0, #4]  	    ; 内层循环修改、控制部分
	ADD	R0,  R0,  #4  			; 地址指针向下拨移4个字节
	CMP	R0,  R1   				; 是否扫描了一遍
	BNE	inner 					; 没有完成一遍,继续内循环
							; 外层循环修改、控制部分,表示已经完成了一遍,
	ADD	R2,  R2,  #1		; 外层循环控制计数器加1
	SUB	R1,  R1,  #4		; 右指针R1向左指针方向移动4字节
	CMP	R2,  R4				; 是否全部扫描	
	BNE	outer				; 没有完成全部扫描,继续外循环
stop
	MOV R0,  #0x18  		; 程序结束返回编译器调试环境
	LDR		R1,  =0x20026
	SWI		0x123456
	
strcopy 
    LDR     R2,     [R1],    #4    ; 将R1指向的单元内容加载到R2中
    STR     R2,     [R0],    #4    ; 将R2中的数存储到R0指向的单元中
    CMP     R2,      #0            ; 检查R0的值是否等于0
    BNE     strcopy                ; 如果不等于0,那么转到strcopy处执行 
    MOV     PC,    LR              ; 子程序返回 
        	
	AREA BlockData0, DATA, READONLY
src0 DCD	18,4,2,35,3,20,1,23,12,21,0		
num	DCD	10
	AREA BlockData, DATA, READWRITE
src	DCD	18,4,2,35,3,20,1,23,12,21,0   ;Keil会把此数组初始化为0

	END

结果分析

分析过了:略

4 factorial

流程图

在这里插入图片描述

代码编写

	AREA factorial, CODE, READONLY
	ENTRY
start

;迭代算法思想 把每个阶乘放到数组中 接着求和 避免阶乘的重复计算
;1!=1
;n!=n*(n-1)!

	
    LDR R0,n     			; R0是n
    LDR R1,=1        		; R1是计数器 1->n
	LDR R2,=nums			; R2指向nums

	STR R1,[R2]				;放入1!
	ADD R1,R1,#1			;2开始
loop
	LDR R3,[R2]         	;R3=(n-1)!
	MUL R4,R1,R3            ;R4=n*(n-1)!
	STR R4,[R2,#4]!;		;存入
	ADD R1,R1,#1            ;R1++
	CMP R1,R0
	BLS loop

    LDR R0,n     			; R0是n
    LDR R1,=1        		; R1是计数器 1->n
	LDR R2,=nums			; R2指向nums	
	LDR R5,=sum				; R5指向sum
	LDR R6,=0				; R6存入sum
sumloop
	LDR R3,[R2],#4         ;R3取出遍历数组的值 ;R3=[R2++]
	ADD R6,R6,R3            ;R6+=R3
	ADD R1,R1,#1            ;R1++
	CMP R1,R0
	BLS sumloop	
	
	STR R6,[R5]				;存入

stop
	MOV R0,  #0x18  		; 程序结束返回编译器调试环境
	LDR	R1,  =0x20026
	SWI	0x123456

        	
	AREA BlockData0, DATA, READONLY
n   DCD	4

	AREA BlockData, DATA, READWRITE
nums DCD	1,2,3,4,5,9,8,7,6,0   ;Keil会把此数组初始化为0
sum DCD 0
	END

结果分析

当n=4时

求阶乘

01 02 06 18

在这里插入图片描述

阶乘求和

01+02+06+18=21

在这里插入图片描述
当n=10时

0x003D9D19=4037913

在这里插入图片描述

5 略

最后

2023-4-14 23:40:30

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

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

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

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

相关文章

Nginx的安装、反向代理、负载均衡及部署项目

Nginx 一、Nginx简介 Nginx称为:负载均衡器或 静态资源服务器:html,css,js,img ​ Nginx(发音为“engine X”)是俄罗斯人编写的十分轻量级的HTTP服务器,是一个高性能的HTTP和反向代理服务器&#xff0c;同时也是一个IMAP/POP3/SMTP 代理服务器。Nginx是由俄罗斯人 Igor Syso…

DOM(上)

DOM&#xff08;文档对象模型&#xff09;&#xff1a;处理可扩展标记语言(HTML或XML&#xff09;的标准编程接口&#xff0c;可以改变网页的内容、结构和样式。DOM树&#xff1a; …

大数据项目实战之数据仓库:电商数据仓库系统——第2章 数据仓库建模概述

第2章 数据仓库建模概述 2.1 数据仓库建模的意义 如果把数据看作图书馆里的书&#xff0c;我们希望看到它们在书架上分门别类地放置&#xff1b;如果把数据看作城市的建筑&#xff0c;我们希望城市规划布局合理&#xff1b;如果把数据看作电脑文件和文件夹&#xff0c;我们希…

CMake——从入门到百公里加速6.7s

目录 一、前言 二、HelloWorld 三、CMAKE 界面 3.1 gui正则表达式 3.2 GUI构建 四 关键字 4.1 add_library 4.2 add_subdirectory 4.3 add_executable 4.4 aux_source_directory 4.5 SET设置变量 4.6 INSTALL安装 4.7 ADD_LIBRARY 4.8 SET_TARGET_PROPERTIES 4.9…

[JavaEE]----Spring03

文章目录Spring_day031&#xff0c;AOP简介1.1 什么是AOP?1.2 AOP作用1.3 AOP核心概念2&#xff0c;AOP入门案例2.1 需求分析2.2 思路分析2.3 环境准备2.4 AOP实现步骤步骤1:添加依赖步骤2:定义接口与实现类步骤3:定义通知类和通知步骤4:定义切入点步骤5:制作切面步骤6:将通知…

测试-子查询及数据更新

测试-子查询及数据更新 目录测试-子查询及数据更新1、修改borrow表增加一列&#xff1b;修改日期数据&#xff08;两条语句完成&#xff09;题目代码题解2、 SQL更新&#xff1a;删除-删除“吴宾”的所有成绩记录题目代码3、SQL查询&#xff1a;查询没有被订购的商品题目代码4、…

CMake GUI工具使用 MinGW 64构建工程

系列文章目录 文章目录系列文章目录前言一、open Project是灰色&#xff1f;前言 CMake GUI 打开 CMake GUI。 在 “Where is the source code” 字段中&#xff0c;选择 Krita 源代码目录&#xff1a;E:/krita-dev/krita。 在 “Where to build the binaries” 字段中&#x…

9.Java面向对象----封装

Java面向对象—封装 面向对象简称 OO&#xff08;Object Oriented&#xff09;&#xff0c;20 世纪 80 年代以后&#xff0c;有了面向对象分析&#xff08;OOA&#xff09;、 面向对象设计&#xff08;OOD&#xff09;、面向对象程序设计&#xff08;OOP&#xff09;等新的系统…

Python 小型项目大全 26~30

二十六、斐波那契 原文&#xff1a;http://inventwithpython.com/bigbookpython/project26.html 斐波那契数列是一个著名的数学模式&#xff0c;被认为是 13 世纪意大利数学家斐波那契的杰作&#xff08;尽管其他人发现它的时间更早&#xff09;。序列从 0 和 1 开始&#xff0…

SAR ADC系列16:CDAC上机实践+作业

目录 作业和上机实践&#xff1a; 通过仿真确定桥接电容Ca的尺寸 采样技术和CDAC相结合 电容校正 为什么在100...0和011...1之间最差&#xff1a;电容的瓶颈在MSB上面 为什么INL最差也发生在中间Code 其他问题 频谱混叠 上级板采样网络时序问题 共模相关问题 关于V…

数据库----------约束、主键约束

目录 1.简介 1.概念 2.作用 3.分类 2.主键约束 1.概念 2.操作 1.添加单列主键 2.添加多列联合主键 3. 通过修改表结构添加主键 4.删除主键 1.简介 1.概念 约束英文: constraint 约束实际上就是表中数据的限制条件 2.作用 表在设计的时候加入约束的目的就是为了…

系统无损迁移、硬盘系统复制完整教程(常用于升级更大硬盘的场景)

阿酷TONY / 2023-4-15 / 长沙 这个教程的应用背景或场景是这样的&#xff1a; 原本使用的ThinkPad笔记本电脑是250G的SSD固态硬盘&#xff0c;使用了一两年后&#xff0c;空间不足了&#xff0c;这个时候需要换一块500G或更大的SSD硬盘&#xff0c;那么问题来了&#xff0c;通…

人员跌倒识别检测系统 yolov7

人员跌倒识别检测系统通过PythonYOLO7网络模型算法&#xff0c;人员跌倒识别检测算法模型对现场画面中有人员倒地摔倒行为实时分析预警&#xff0c;发现则立即抓拍存档告警同步提醒后台值班人员及时处理。YOLOv7 的发展方向与当前主流的实时目标检测器不同&#xff0c;研究团队…

(十二)排序算法-插入排序

1 基本介绍 1.1 概述 插入排序属于内部排序法&#xff0c;是对于欲排序的元素以插入的方式找寻该元素的适当位置&#xff0c;以达到排序的目的。 插入排序的工作方式非常像人们排序一手扑克牌一样。开始时&#xff0c;我们的左手为空并且桌子上的牌面朝下。然后&#xff0c;…

Flink处理大型离线任务稳定性与性能调优探索

Apache Flink作为分布式处理引擎&#xff0c;用于对无界和有界数据流进行状态计算。其中实时任务用于处理无界数据流&#xff0c;离线任务用于处理有界数据。通过本文你将掌握让大型离线任务运行稳定的能力&#xff0c;同时能够通过分析离线任务运行特点&#xff0c;降低任务运…

150.网络安全渗透测试—[Cobalt Strike系列]—[DNS Beacon原理/实战测试]

我认为&#xff0c;无论是学习安全还是从事安全的人多多少少都会有些许的情怀和使命感&#xff01;&#xff01;&#xff01; 文章目录一、DNS Beacon原理1、DNS Beacon简介2、DSN Beacon工作原理二、DNS Beacon实战测试1、实战测试前提2、实战测试过程一、DNS Beacon原理 1、…

大数据分析工具Power BI(三):导入数据操作介绍

导入数据操作介绍进入PowBI&#xff0c;弹出的如下页面也可以直接关闭&#xff0c;在Power BI中想要导入数据需要通过Power Query 编辑器&#xff0c;Power Query 主要用来清洗和整理数据。文件资料下载&#xff1a;https://download.csdn.net/download/xiaoweite1/87587711一、…

Wijmo JavaScript UI 5.20222.877 Crack

Wijmo使用更快、更灵活的 JavaScript UI 组件构建更好的应用程序 使用 Wijmo&#xff0c;利用我们引人注目的 UI 组件库&#xff0c;将更多时间花在应用程序的核心功能上。要求零依赖&#xff0c;Wijmo sports弹性网格&#xff0c;业内最好的 JavaScript 数据网格&#xff0c;提…

JVM性能调优方法和模板

每天 100 万次登陆请求&#xff0c;8G 内存该如何设置 JVM 参数&#xff0c;大概可以分为以下 8 个步骤 。 第一步、新系统上线如何规划容量&#xff1f; 1. 套路总结 任何新的业务系统在上线以前都需要去估算服务器配置和 JVM 的内存参数&#xff0c;这个容量与资源规划并不…

关于 AI ,大家关心的问题

阅读本文大概需要 1.46 分钟。兄弟们&#xff0c;自从我跟曹老师准备合伙做一个 AI 生态的新社群之后&#xff0c;很多人问我最多的问题就是&#xff1a;AI 时代对我们普通人来说意味着什么&#xff1f;普通人又该如何去把握 AI 时代的机会&#xff1f;那么&#xff0c;今天&am…