计算系统概论实验Lab 6——C重写Lab1-5

news2025/6/8 9:26:20

Lab 6 C重写Lab1-5

Purpose

使用高级编程语言(例如C / C++)来实现以前编写的所有代码。请注意,该算法需要与之前使用的算法一致

condition:

  1. 明确禁止使用LC3不直接支持的*、/、%>><<等操作及等效库函数;
  2. 可以使用+,-,=,++,--,==,!=,<,>,<=,>=,&,|,~;
  3. 可以使用 for 、 while 、do while 、if 、continue 、break、switch case;
  4. 可以定义不违反上述规则的帮助功能。

several examples:

在这里插入图片描述

Procedure

lab1:counting how many 1

int16_t lab1(int16_t a, int16_t b) {
    // initialize
    int16_t res = 0, ptr = 1;
    // calculation
    while(b--){
        if(a&ptr)
            res++;
        ptr += ptr ;
    }
    // return value
    return res;
}

第一个实验是统计给定数中低b位的数字,在汇编中使用的算法是利用与操作用一个探测数从最低位与指定数与,结果为1即说明该位为1,重复此操作直到循环结束,其中res存放结果,ptr为探测数,左移操作在这里使用自加实现,循环结束返回res即可

lab2:a variant of the fibonacci sequence

int16_t lab2(int16_t p, int16_t q, int16_t n) {
    // initialize
    int16_t R1 = p-1, R2 = q, R3 = n-2;
    int16_t R0 = 1, R4 = 1, R5 = -q, R6 = 1;
    // R0: F(n-2)%p  R4:F(n-1)  R6:F(n-1)%q
    // R1: p-1  R2:q  R3:n  R5:-q
    // calculation
        mod:
            R6 += R0;
            R3 -= 1;
        if(R3 < 0)     return R6;
        R0 = R4 & R1;
        R4 = R6;
        re:
            R6 += R5;
        if(R6>=0) goto re;
        R6 += R2;
    goto mod;
    // return value
}

第二个实验是计算修改过的斐波那契数,在这里我直接模拟当时汇编代码的实现,使用R0-R7共八个寄存器,其中使用if语句代替判断条件码,同样使用label标记代码段,使用goto语句实现跳转,取模操作则是与汇编中的方法相同,对于2的幂次数,使用与运算取模,不是则循环减,直至负数,再加上一个模数即可

lab3: longest duplicate substring

int16_t lab3(int16_t n, char s[]) {
    // initialize
    int16_t res = 1,temp = res;
    // calculation
    for(int i = 0,j = 1; j <= n; i++,j++ )
    {
        if(s[i] == s[j])
            res++;
        else
        {
            if(res > temp)  temp = res;
            res = 1;
        }
    }
    // return value
    if(temp>res) return temp;
    else return res;
}

第三个实验是统计给定字符串中最长的重复子串长度,在原汇编实现时,我使用的是双指针比较两个字符,在c中实现更便捷,在循环中使用两个变量i、j,其中i在前j在后,每次比较两者是否相同,使用res和temp记录当前重复字符的个数,由于最少一个相同字符,所以初始化为1,初始使用res记录,直到出现不同的字符,此时res置为1,判断两者的较大值,temp记录两者的较大值,最后循环结束,取两者中较大值即为结果
lab4:sort and count

void lab4(int16_t score[], int16_t *a, int16_t *b) {
    // initialize
    (*a) =0, (*b) = 0;
    int16_t temp;
    //冒泡排序
    for(int i = 1; i <=15; i++) {
        for (int j = 0; j <= 15 - i; j++) {
            if (score[j] > score[j + 1]) {
                temp = score[j];
                score[j] = score[j + 1];
                score[j + 1] = temp;
            }
        }
    }
    
    for(int i = 12; i <=15; i++)
    {
        if (score[i] >= 85)
            (*a)++;
        else if (score[i] >= 75)
            (*b)++;
    }

    for(int i = 8; i<=11 ;i++)
        if(score[i] >= 75)
            (*b)++;
}

第四个实验是对给定的成绩进行排序,并统计“A,B”等级的个数,在汇编代码中,使用冒泡排序先对成绩序列进行排序,再统计前四个和前八个符合范围的个数,在排序后的第12-15个是最高的四个,其中大于等于85分的都是A,否则大于等于75的为B,而8-11是次高的四个,其中大于等于75的都是B

Result

Debug:

过程中遇到的主要问题有:
lab3中 res应该要重新设置为1,一开始设置为0导致每个的结果都少了1

else
        {
            if(res > temp)  temp = res;
            res = 1;
        }

lab4中,由于传入的参数类型为指针类型int16_t *a, int16_t *b,所以后面对其的操作应该要使用(*a) (*b),否则会出现结果溢出int16的范围问题

Test:

Judge:

将代码整理如下:

int16_t lab1(int16_t a, int16_t b) {
    // initialize
    int16_t res = 0, ptr = 1;
    // calculation
    while(b--){
        if(a&ptr)
            res++;
        ptr += ptr ;
    }
    // return value
    return res;
}

int16_t lab2(int16_t p, int16_t q, int16_t n) {
    // initialize
    int16_t R1 = p-1, R2 = q, R3 = n-2;
    int16_t R0 = 1, R4 = 1, R5 = -q, R6 = 1;
    // R0: F(n-2)%p  R4:F(n-1)  R6:F(n-1)%q
    // R1: p-1  R2:q  R3:n  R5:-q
    // calculation
        mod:
            R6 += R0;
            R3 -= 1;
        if(R3 < 0)     return R6;
        R0 = R4 & R1;
        R4 = R6;
        re:
            R6 += R5;
        if(R6>=0) goto re;
        R6 += R2;
    goto mod;
    // return value
}

int16_t lab3(int16_t n, char s[]) {
    // initialize
    int16_t res = 1,temp = res;
    // calculation
    for(int i = 0,j = 1; j <= n; i++,j++ )
    {
        if(s[i] == s[j])
            res++;
        else
        {
            if(res > temp)  temp = res;
            res = 1;
        }
    }
    // return value
    if(temp>res) return temp;
    else return res;
}

void lab4(int16_t score[], int16_t *a, int16_t *b) {
    // initialize
    (*a) =0, (*b) = 0;
    int16_t temp;
    //冒泡排序
    for(int i = 1; i <=15; i++) {
        for (int j = 0; j <= 15 - i; j++) {
            if (score[j] > score[j + 1]) {
                temp = score[j];
                score[j] = score[j + 1];
                score[j + 1] = temp;
            }
        }
    }



    for(int i = 12; i <=15; i++)
    {
        if (score[i] >= 85)
            (*a)++;
        else if (score[i] >= 75)
            (*b)++;
    }

    for(int i = 8; i<=11 ;i++)
        if(score[i] >= 75)
            (*b)++;

    // calculation

    // return value
}


使用test文件评测结果如下,正常运行,输出正确。

在这里插入图片描述

Summary

  1. What is the difference between programming in a high-level language andprogramming in LC3 assembly language?
    高级语言可读性强,对程序员友好,提供的功能更全面更强大,适合编写较大的项目以及程序,但运行效率可能较低,而汇编语言可读性差,编写工程量大的代码时十分费劲,指令也很多而繁琐,许多细节都要程序员自己手动配置,对程序员不友好,但执行效率高

  2. What instructions do you think need to be added to LC3? (Hint: You can thinkabout the previous labs and what instructions could be added to greatly simplifythe previous programming)
    乘法指令和除法指令,这两个指令都需要通过循环以及其他各种指令来实现,如果多次用到那么程序会很臃肿并且写起来很麻烦,所以添加这个指令比较重要

  3. Is there anything you need to learn from LC3 for the high-level language you use?
    ​从LC-3,我学习到各种语言执行时机器码是如何变化的,特别是补码的运算,我觉得十分巧妙,以及左移右移实现的乘除操作,通过与运算等判断某一位的状态,这让我在写高级语言程序时能够更清楚其中的原理

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

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

相关文章

Cypress简介及在Windows下安装

cypress 简单介绍 Cypress 是基于 JavaScript 的前端测试工具&#xff0c;它是自集成的&#xff0c;提供了一套完整的端到端测试&#xff0c;无须借助其他外部工具&#xff0c;安装后即可快速地创建、编写、运行测试用例&#xff0c;可以对浏览器中运行的任何内容进行快速、简…

springboot 针对rabbitmq多vhost情况处理

目录说明代码自定义rabbitmq的pom信息&#xff1a;重写one的连接工厂重写two的连接工厂&#xff1a;创建队列、交换机并绑定&#xff1a;消费者消费消息生产者发送消息说明 需求场景&#xff1a; 项目中在已接入rabbitmq一个vhost的基础上&#xff0c;需要再引入多个vhost进行…

线性杂双功能peg化试剂——HS-PEG-COOH,Thiol-PEG-Acid

英文名称&#xff1a;HS-PEG-COOH&#xff0c;Thiol-PEG-Acid 中文名称&#xff1a;巯基-聚乙二醇-羧基 HS-PEG-COOH是一种含有硫醇和羧酸的线性杂双功能聚乙二醇化试剂。它是一种有用的带有PEG间隔基的交联或生物结合试剂。巯基或SH、巯基或巯基选择性地与马来酰亚胺、OPSS、…

基于“python+”潮汐、风驱动循环、风暴潮等海洋水动力模拟实践技术

ADCIRC是新一代海洋水动力计算模型&#xff0c;它采用了非结构三角形网格广义波动连续方程的设计&#xff0c;在提高计算精确度的同时还减小了计算时间。被广泛应用于&#xff1a;模拟潮汐和风驱动的循环、预测风暴潮和洪水和近岸海上作业等。除此之外&#xff0c;ADCIRC也是我…

MySQL 存储引擎

MySQL内部展示图 分为三个层次 客户端 mysqlserver 存储引擎 我认为与之前先的UBD三层相类似 UI端传数据 B端逻辑处理 数据库端进行执行方面进行类似 存储引擎的分类 mySQL 5.5 版本采用InnoDB 为默认引擎&#xff08;生成.frm和.ibd文件&#xff09; 给大家介绍其他存储引…

I/O多路复用

基础概念 Socket 套接字。百科&#xff1a;对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。 例子1&#xff1a;客户端将数据通过网线发送到服务端&#xff0c;客户端发送数据需要一个出口&#xff0c;服务端接收数据需要一个入口&#xff0c;这两个“口子”就是…

【面试题】2023 Vue面试题 高频考题

大厂面试题分享 面试题库 后端面试题库 (面试必备) 推荐:★★★★★ 地址:

【微服务】Elasticsearch数据聚合自动补全数据同步(四)

&#x1f697;Es学习第四站~ &#x1f6a9;Es学习起始站&#xff1a;【微服务】Elasticsearch概述&环境搭建(一) &#x1f6a9;本文已收录至专栏&#xff1a;微服务探索之旅 &#x1f44d;希望您能有所收获 在第二站的学习中&#xff0c;我们已经导入了大量数据到es中&…

IBM AIX 升级Openssh 实现篇(编译安装)

升级成功佐证 !!!本文所有内容仅作参考,请在测试环境中具体测试完毕后才能应用于生产环境!!! [1]备份和恢复方案 开启telnet 服务,防止ssh 掉线后无法重连维护。在修复漏洞后关闭telnet。 备份该服务相关的所有文件,以便恢复。 root@TEST:/etc# vi inetd.conf #ftp…

原型图设计软件哪个好用?6款好用软件推荐

原型图软件列表 1、墨刀-极简超快的移动应用原型工具 2、ProcessOn-在线作图工具&#xff0c;你不用装 Visio 了 3、摩客-简洁高效的原型图设计工具 4、xiaopiu-国内优雅高效的在线 APP 原型工具 5、Axure-老牌原型工具&#xff0c;8.0 开始对响应式设计做了更好的支持&…

ONES 支持多项信创适配,打造自主可控的国产化平台

近日&#xff0c;ONES 顺利通过麒麟软件 NeoCertify、华为鲲鹏技术、达梦数据库的兼容性测试认证&#xff0c;至此&#xff0c;ONES 已完成国产操作系统、国产 CPU、国产数据库的多维度适配&#xff0c;成为目前唯一支持信创的研发管理平台&#xff0c;这标志着 ONES 在自主可控…

聚类分析--基本原理、方法(Kmeans,层次聚类)

文章目录聚类分析的定义基本原理商业应用场景聚类分析步骤聚类分析方法层次分析法/系统聚类法&#xff08;小样本&#xff09;提问&#xff1a;如何选择合适的分类结果K-means疑问&#xff1a;聚类分析的定义 聚类分析就是将研究对象根据一些特征指标&#xff0c;把比较相似的…

ubuntu qt程序无法输入中文 QLineEdit输入框无法切换输入法

目录一、问题描述二、解决思路三、步骤描述一、问题描述 测试软件在运行时无法通过键盘快捷键切换中文输入法&#xff0c;主要原因为qt应用程序没成功加载到输入法插件。 本文的以测试程序demo为例&#xff0c;进行过程展示&#xff0c;demo名字为“test-chinese-lineedit”。…

stream流处理初识

stream流处理初识 java8中的集合支持stream方法, 它会返回一个流(java.util.stream.Stream)IDEA集成的工具查看流式链过程&#xff1a; 流的操作 &#xff1a; 流的概念&#xff1a; java8中的集合支持stream方法,它会返回一个流(java.util.stream.Stream) 元素序列: 就像集…

【数据结构】优先级队列----堆

优先级队列----堆优先级队列堆堆的创建堆的插入&#xff1a;堆的删除&#xff1a;PriorityQueue的特性PriorityQueue的构造与方法优先级队列 优先级队列&#xff1a; 不同于先进先出的普通队列&#xff0c;在一些情况下&#xff0c;优先级高的元素要先出队列。而这种队列需要提…

开启Openharmony 开发之旅

之前因为太懒&#xff0c;所以很少写博客。最近做了一年的鸿蒙开发。想记录下&#xff0c;故开始写点东西&#xff0c;作为学习和开发笔记吧&#xff01;先分享几个开源鸿蒙的学习网站。 1.开源鸿蒙官网 OpenAtom OpenHarmonyhttps://docs.openharmony.cn/pages/v3.1/zh-cn/a…

《MySQL系列-InnoDB引擎19》文件-日志文件-二进制日志

日志文件 日志文件记录了影响MySQL数据库的各种类型活动。MySQL数据库中常见的日志文件有&#xff1a; 错误日志(error log)二进制日志(bilog)慢查询日志(slow query log)查询日志(log) 这些日志文件可以帮助DBA对MySQL数据库的运行状态进行诊断&#xff0c;从而更好的进行数…

INTx中断机制源码分析

INTx中断机制源码分析 文章目录INTx中断机制源码分析参考资料&#xff1a;一、 配置空间二、 扫描设备时分配中断号三、 使用INTx中断四、 PCIe中断树五、 PCIe INTx中断映射过程5.1 PCIe控制器支持的中断5.2 PCIe控制器注册中断5.3 PCIe设备中断号的分配5.3.1 IRQ domain5.3.2…

Java源码程序设计-房屋出租管理系统设计与实现

摘 要系统设计系统实现开发环境摘 要 随着我国市场经济的快速发展和人们生活水平的不断提高&#xff0c;简单的房屋出租服务已经不能满足人们的需求。如何利用先进的管理手段&#xff0c;提高房屋出租的管理水平&#xff0c;是当今社会所面临的一个重要课题。 本文采用结构化…

Win10系统电脑开机后总是蓝屏无法使用怎么办?

Win10系统电脑开机后总是蓝屏无法使用怎么办&#xff1f;电脑开机的时候出现了蓝屏问题&#xff0c;这个情况是我们的电脑系统不兼容导致的。遇到这个问题一般是需要去进行系统的重装来解决&#xff0c;安装一个更兼容的系统就可以解决问题了。一起来看看详细的解决方法分享吧。…