ICS计算系统概论实验3—LC3汇编代码实现最长重复子字符串Longest-duplicate-substring

news2024/11/16 13:44:25

Lab03 Longest-duplicate-substring

Purpose

子字符串是字符串中至少出现一次的连续字符序列。重复子字符串是一种由相同字符组成的子字符串。例如,“aabbbc”的重复子字符串是“aa”,“bbb”和“c”。
给定一个字符串及其长度,计算出它最长的重复子字符串的长度。

condition:
请注意,(1<=N<=100) 将存储在 x3100 中,并且 的每个字符都存储在从地址 x3101 开始的连续内存位置。
您可以假设仅包含 a-z 和 A-Z。
任务:将输出、最长的重复子字符串存储在 x3050 中。
R0-R7 初始设置为零,程序应从 x3000 开始。

several examples:

Memory addressx3050x3100x3101x3102x3103x3104x3105x3106
example 1RESULT=3NUM=6aabbbc
example 2RESULT=4NUM=5ZZZZz
example 3RESULT=3NUM=6aabaaa

Principles

Key issues:

如何记录最长重复的数量

要记录最长的重复数量,我们对字符串进行分析,可以看出,任意一个字符串,我们取其具有连续相同子串的模式,在任一时刻可以看作三部分,如xxxyzzz、xxxyzyzwww等,即两部分连续重复子串间隔一部分不连续的子串,即任意时刻我们最多只需要两个变量分别保存最长长度以及当前统计的连续重复子串长度,当这个相同连续被打破即出现不同字符时,比较一下两个长度,取其较大值。所以统计相同字符数量时使用两个寄存器:R2,R3,R2记录最长长度,R3记录当前子串相同字符长度,当判断到不同字符时,R3停止记录,跳转至比较R2与R3的大小,取其较大值存至R3中,并将R3清零后继续向后读取字符串,直至结束。

如何判断两个字符是否相同

在使用其他高级语言编程统计重复字符时,通常会用到双指针进行记录,所以联系到汇编语言,我们可以使用两个寄存器R5、R6作为两个指针,初始时分别指向第一个字符和第二个字符,每次判断是否满足R5==R6,满足则当前长度+1并后移指针,否则说明两个字符不相同,当前长度不变并将指针后移,直至R6指向最后一个字符,程序也相应结束。

Flow chart:

yes
yes
no
no
yes
yes
no
no
R0<-mem[x3100]
R0<-R0-2
R1<-x3101
R5<-mem[R1]
R6<-mem[R1+1]
NOT R5<-R5
R5<-R5+1
R5<-R5+R6
if R5 == 0
R3<-R3+1
R0 <- R0-1
if R0<0
R1<-R1+1
R4<- NOT R3
R4<- R4+1
R4<-R2+R4
if R4<=0
R2<-R3
R3<-0
R2<-R2+1
mem[x3050]<-R2
HALT
R7<-R0+1
if R7==0
R3<-0

Procedure

初始化:R0存放字符串总长度,因为使用双指针比较字符,所以R0=R0-2作为循环的总次数,R1存放字符串的起始地址,R2,R3分别存放最大长度和当前长度,R5,R6分别记录前一个字符和后一个字符,作为双指针向前移动
循环:将R5与R6相减用于比较当前两个字符是否相等,相等则R3+1,不相等则跳转比较,令R2=max(R2,R3),再回到循环,判断循环计数R0是否满足R0>0,满足则R1+1,R5,R6对应+1,即向前读入一个字符进行比较,重复循环过程。
结束:R0<0时跳转至存储,存储之前需要再做一次R2与R3的比较,将最大值放入R2中,最后将R2的值存入x3050内存单元

Result

Debug:

过程中遇到的主要问题有:
对于下列两个样例

89:sdsdsdssssssssdsdsfdjkkkkkkkkkkdlslsjdfnnnnnsdswiejdjskjsfkdsfdfskdksknsnsjsndllbbbbbdfsd:10

92:sdsdsdssssssssdsdsfdjkkkkkkkkkkdlslsjdfnnnnnsdswiejdjskjsfkdsfdfskdksknsnsjsndllbbbbbdfsdddd:10

分别输出10 以及 13,结果如下图所示,两个样例最长的子串都应该是连续的10个k,两个样例的区别仅在于最后的ddd,然而输出结果却不同
在这里插入图片描述
在调试模式中发现,在处理最后的子串时R3由8变为9后,遇到了不同的子串却没有清零,而是继续增加,即由9到10

在这里插入图片描述

在这里插入图片描述
检查发现代码中对R3的清零操作仅当R2<R3时才进行清零,所以上述情况就是在特殊情况下R2==R3,但未正确清零R3,导致R3继续计数输出错误结果

在这里插入图片描述
所以上述代码应改为如下图所示:
在这里插入图片描述
并且,由于我的程序是通过检测到不同字符时,跳转至比较当前R3正在记录的长度与R2中记录的最长长度并取最大值存入R2中,所以在程序要结束时应该再比较一次,因为可能存最后结尾的子串是最长的重复子串的情况。

在这里插入图片描述

Judge:

在本地 LC3Tool \text{LC3Tool} LC3Tool调试完毕后,将代码整理如下:用于网站在线 lc3 \text{lc3} lc3评测

.ORIG x3000
LDI R0, NUM;
ADD R0, R0, #-2;循环次数
LD R1, DATA ; R1 is the pointer of the string
ADD R2, R2, #0;计数器
ADD R3, R3, #0;

CHECK LDR R5, R1, #0;第一个字符
      LDR R6, R1, #1;第二个字符
      NOT R5, R5;     
      ADD R5, R5, #1;R5取反
      ADD R5, R5, R6;相加为0说明相同
      BRz CNT      ;
      BRnp CMP      ;
      
CNT ADD R3, R3, #1  ;计数
LOOP ADD R0, R0, #-1 ;循环次数
    BRn BREAK       ;结束
    ADD R1, R1, #1  ;后移
    BR CHECK    
CMP NOT R4, R3;     
    ADD R4, R4, #1  ;R3取反
    ADD R4, R2, R4  ;
    BRnz MAX         ;R2<R3
    AND R3, R3, #0  ;R3<-0
    BR LOOP         ;
MAX ADD R2, R3, #0  ;R2=R3    
    AND R3, R3, #0  ;R3<-0
    BR LOOP;
BREAK 
    ADD R7, R0, #1 ;循环次数
    BRz CMP;
    ADD R2, R2, #1;     
    STI R2, RESULT
HALT
RESULT .FILL x3050
NUM .FILL x3100
DATA .FILL x3101
.END

评测结果如下,正常运行,输出正确。

在这里插入图片描述

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

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

相关文章

全球DTC品牌纷纷奔走线下,价值岂止于用户体验和品牌形象

走向线下&#xff0c;开设新零售门店/旗舰店/体验店/快闪店&#xff0c;已成为很多全球品牌的共同做法&#xff1a;从海外巨头亚马逊的Amazon go、国内的盒马O2O&#xff0c;到DTC经典品牌的Warby Parker、Allbirds们遍地开花的线下实体店&#xff0c;是什么让全球DTC品牌纷纷走…

【Matplotlib绘制图像大全】(二十三):Matplotlib保存图像

前言 大家好,我是阿光。 本专栏整理了《Matplotlib绘制图像大全》,内包含了各种常见的绘图方法,以及Matplotlib各种内置函数的使用方法,帮助我们快速便捷的绘制出数据图像。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmMatp…

Sqli-Libs 速通

Sqli-Libs持续更新...目标Less-1Less-2Less-3Less-4Less-5Less-6Less-7Less-8Less-9Less-10Less-11Less-12Less-13Less-14Less-15Less-16Less-17Less-18Less-19 bp处理Less-20目标 直接写payload&#xff0c;sql语句非预期执行就算成功 表&#xff1a;emails,referers,uagent…

scratch绘制旋转六边形 电子学会图形化编程scratch等级考试二级真题和答案解析2022年9月

目录 scratch绘制旋转六边形 一、题目要求 1、准备工作 2、功能实现

12月2日:thinkphp中数据库完结

数据库的查询 聚合查询 聚合查询的几种方法其中将count作为重点来说&#xff0c;由图所示&#xff0c;即为使用count()方法中需要注意的点 count(*)的使用count()中字段名为具体值的使用方法时间查询 官方文档中列举的是使用wheretime()进行查询的方法&#xff0c;但是在日常的…

如何在Windows上安装并启动MySql

如何在Windows上安装并启动MySql一、MySql 安装包下载二、MySql 初始化三、启动MySql服务四、登录MySql五、修改MySql的root密码六、关于远程登录七、设置环境变量一、MySql 安装包下载 首先进入以下网址&#xff0c;选择合适的版本进行下载即可。 https://dev.mysql.com/dow…

Bootstrap5 安装使用

我们可以通过以下两种方式来安装 Bootstrap5&#xff1a; 使用 Bootstrap5 CDN。 从官网 getbootstrap.com 下载 Bootstrap 5。 Bootstrap 5 CDN 国内推荐使用 Staticfile CDN 上的库&#xff1a; Bootstrap5 CDN <!-- 新 Bootstrap5 核心 CSS 文件 --> <link r…

基于vue-simple-uploader的断点续传

方案&#xff1a; 分片上传&#xff0c;再次上传时&#xff0c;查询已上传分片&#xff0c;继续上传剩余分片 实现效果&#xff1a; 1. 安装uploader和spark-md5的依赖 npm install --save vue-simple-uploader npm install --save spark-md5 2.mainjs导入uploader impo…

日期格式化 YYYY-MM-DD 出现时间偏移量

在js中&#xff0c;很多时候需要把日期字符串转换为一个 Date 对象。 如果得到的日期字符串有时间还好办&#xff0c;如果没有时间&#xff0c;只有日期的格式&#xff0c;例如 2022-12-01 这样的字符串呢&#xff1f; 大部分人可能什么都没想&#xff0c;直接就调用了 new D…

MyBatis-Plus分页查询(快速上手运用)

系列文章目录 Mybatis-Plus知识点[MyBatisMyBatis-Plus的基础运用]_心态还需努力呀的博客-CSDN博客 Mybatis-PlusSpringBoot结合运用_心态还需努力呀的博客-CSDN博客MyBaits-Plus中TableField和TableId用法_心态还需努力呀的博客-CSDN博客 MyBatis-Plus中的更新操作&#…

【实操篇】Linux实用指令总结

目录 1.运行级别类 ●运行级别 ●指定运行级别 2.帮助指令类 ●帮助指令 1.man获得帮助信息 2.help指令 3.文件目录类 ●pwd指令 ●ls指令 ●cd指令 ●mkdir指令 ●rmdir指令 ●touch指令 ●cp指令 ●rm指令 ●mv指令 ●cat指令 ●more指令 ●less指令 ●>指令和>>…

如此简单的K8S,来玩下pv和pvc,利用nfs来实现持久化存储(内网环境,非常详细)

如此简单的K8S,来玩下pv和pvc&#xff0c;利用nfs来实现持久化存储(内网环境&#xff0c;非常详细) k8s很简单&#xff0c;怎么个简单法呢&#xff0c;来给小编一起再来复习一边吧。今天主要来了解下pv和pvc的概念&#xff0c;小编也是当过多次的面试官&#xff0c;小编悄悄的告…

低代码助力制造型企业管理:项目管理系统

制造业企业经过近两个世纪的发展&#xff0c;已经成为世界各国经济发展的支柱产业&#xff0c;要增强一个国家的综合国力&#xff0c;就必须首先建设一个强大的制造业。因此&#xff0c;在一些率先进入知识经济的工业发达国家&#xff0c;汽车、航空、装备等制造业依然保持支柱…

QT QSpinBox 整数计数器控件 使用详解

本文详细的介绍了QSpinBox控件的各种操作&#xff0c;例如&#xff1a;获取数值、设置前后缀、设置最大/小值、进制转换、关联信号槽、优化信号、QSS优化、文件源码、样式表 、效果&#xff1a;可以设置背景、边框、向上按钮、向下按钮 等等操作。 本文作者原创&#xff0c;转载…

安装dolphinscheduler

四种安装方式&#xff0c;机器有限&#xff0c;最后选的伪集群安装&#xff0c;所有都装在一台机器上。 安装手册 需要依次安装 JDK&#xff1a;下载JDK (1.8)&#xff0c;安装并配置 JAVA_HOME 环境变量&#xff0c;并将其下的 bin 目录追加到 PATH环境变量中。如果你的环境…

[附源码]Python计算机毕业设计SSM居民个人健康服务平台(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

能耗物联网的入口—计量监测解决方案价值解析

能耗物联网的入口—计量监测解决方案价值解析 在双碳政策支持下&#xff0c;有着众多头部企业的引领&#xff0c;能源物联网呈现蓬勃发展势头。 然而作为该领域内占有重要位置的海量用电设备&#xff0c;其运行状态、设备利用率均是未知的&#xff0c;绝大多数用电设备仍未联网…

CTFHUB-web-文件上传

无验证 上传一句话木马 <?php eval($_POST[attack]) ?>蚁剑添加数据&#xff0c;密码为attack 成功连接 找到flag flag&#xff1a; ctfhub{5d24093c73fddbba912490b6} 前端验证 还是传那个一句话木马&#xff0c;不允许上传 只能上传指定后缀的文件&#xff0c;所以可…

如何在Centos8中添加附加的IP

有时可能需要为 CentOS 8 系统上的单个网卡分配附加的 IP 地址。例如应用程序要求或 SSL 证书的安装。在本文中&#xff0c;我们将解释如何在 CentOS 7/8 中添加附加或多个 IP 地址。 方法一&#xff1a;手动添加附加IP 在原网卡配置文件中添加附加IP 在继续配置辅助 IP 之前…

Kotlin高仿微信-第32篇-支付-我的零钱

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…