目录

目的与要求

内容与方法

步骤与过程

程序总体设计

核心数据结构——冒泡排序

调试过程

成绩数据文件data编写和程序数据初始

成绩复制

冒泡排序

A B计数保存

核心代码

结论或体会


目的与要求

分析和理解实验指定的问题

利用LC-3的汇编代码设计实现相关程序

熟练掌握循环、分支程序设计方法

内容与方法

  • 背景

    • 16名学生成绩排序,及统计分析
    • 成绩分类规则
      • A:全班排名前25%,且成绩在85分及以上
      • B:非A成绩,全班排名前50%,且成绩在75分及以上
      • C:非A、B成绩
      • 要求
    • 使用LC-3汇编语言,编写程序实现以上功能
  • 输入
    • 16名学生成绩,存储于x3200至x320F
    • 每个成绩为0至100之间,由16比特无符号整数表示
  • 输出
    • 成绩降序排序,并存储于x4000至x400F内存位置,x4000位置成绩为最高成绩
    • 得A、B成绩的学生总人数,分别存储于x4100,及x4101位置

步骤与过程

程序总体设计

  • 根据题目,首先要实现的是成绩的存储。首先我用标号SCORE存储成绩首地址x3200,用data文件记录16个成绩于起始位置:.ORIG x3200。
  • 其他重要地址和常量用标号表示如下:
SCORE    .FILL   x3200       ;成绩存放起始地址
RES     .FILL   x4000       ;成绩降序结果存放起始地址
Anum    .FILL   x4100       ;存放A地址
Bnum    .FILL   x4101
nAscore .FILL   -85         ;A分数相反数
nBscore .FILL   -75
StuNUM  .FILL   16          ;学生人数
ONE     .FILL   1           ;1
  • 算法流程——具体实现步骤如下:

    • 将成绩复制到结果区:COPY循环
    • 冒泡排序:2层嵌套循环
    • 计算A B人数:各2个循环(CountA  CountB)
    • 结果保存:STORE

核心数据结构——冒泡排序

C++代码如下:

for(int i=1;i<n;i++){For(int j=0;j<n-I;j++){If(score[j]<score[j+1]){Swap(score[j],score[j+1])}}
}

调试过程

因为程序步骤较多,我进行分模块编写和调试,逐步完成。

成绩数据文件data编写和程序数据初始

  • 代码编写编译(图1

R1存成绩存放初始地址SCORE(x3200),R7存结果降序成绩初始地址RES(x4000)。标号编写。

Figure 1 data编写和程序数据初始

  • 运行结果无误(图2

Figure 2 数据获得和初始成功

成绩复制

先将成绩直接复制到结果区,在结果区排序。

  • 编写编译运行(图3

Figure 3 成绩复制代码编译运行

  • 结果正确,x3200x4000存放的数据一样(图4

 

Figure 4 成绩复制成功

冒泡排序

  • 编译通过(图5

Figure 5 冒泡成功编译运行

  • 答案错误,代码有误,经过单步调试发现是每轮冒泡循环没有把成绩指针指向首位。(图6

 

Figure 6 调试过程

  • 修改代码(图7

每次循环都初始成绩指针指向第一个成绩。修改后答案正确

Figure 7 修改冒泡排序

A B计数保存

2个循环CountA和CountB遍历前4和前8个数,获得A B人数,并保存。(图8

Figure 8 程序结果正确

核心代码

     .ORIG   x3000       ;程序开始LD     R1,SCORE    ;R1为存放成绩初始地址LD      R7,RES      ;R7存放成绩降序结果地址LD     R2,StuNUM   ;R2装入学生人数
;
; 成绩复制至结果区(loop)
;
COPY    LDR R3,R1,0     ;R3存成绩STR   R3,R7,0     ;成绩存结果ADD   R1,R1,1     ;下一个成绩ADD   R7,R7,1     ;结果成绩指针移向下一个ADD R2,R2,-1    ;计数减1BRp    COPY        ;继续循环直至全部复制; 冒泡排序
;LD R2,ONE      ;R2初始1,外层循环i,轮次
;
; 外层循环LOOP1(R2 0<i<n)
LOOP1   ; 内层循环(R3 0<=j<n-i);LD      R7,RES       ;R7存放成绩降序结果首地址AND     R3,R3,0       ;R3清零, 里层循环j,下标ADD     R1,R2,-16 ;R1=-(n-i)LOOP2    LDR R4,R7,0     ;R4存SCORE[j]LDR R5,R7,1     ;R5存SCORE[j+1]NOT  R6,R4   ADD R6,R6,1 ADD R6,R6,R5    ;R6=SCORE[j+1]-SCORE[j]BRnz   FLAG        ;如果SCORE[j+1]<=SCORE[j],不用交换直接跳过;; 交换SCORE[j+1] SCORE[j];STR      R5,R7,0 STR     R4,R7,1;FLAGADD R7,R7,1     ;指向下一成绩ADD  R3,R3,1     ;j++ADD   R6,R3,R1    ;R6=j-(n-i)BRn LOOP2       ;如果j<n-i,继续内层循环;; 内层循环结束ADD  R2,R2,1 ADD R6,R2,-16;R6=i-nBRn    LOOP1       ;如果i<n,继续外层循环
;
; 外层循环结束,冒泡排序完成; 计数A B人数
;LD R2,nAscore  ;R2=-85LD  R3,nBscoreAND   R1,R1,0     ;R1清零,计数AND  R5,R5,0     ;R5清零存A人数AND    R6,R6,0     ;B人数LD  R7,RES      ;R7存放成绩降序结果首地址
;
; 获得的A人数
;
CountA  LDR R4,R7,0 ADD R4,R4,R2    ;R4=score-85BRn    CountB      ;如果score<85,开始计数BADD  R5,R5,1     ;人数增加ADD    R7,R7,1     ;移向下一分数ADD  R1,R1,1     ;计数加1ADD    R0,R1,-4    ;R0=计数-4BRn    CountA      ;计数小于4,还在前25%继续判断A人数
;
; 获得B的人数
;
CountB  LDR R4,R7,0 ADD R4,R4,R3    ;R4=score-75BRn    STORE       ;如果score<75,跳出B计数,进行保存ADD  R6,R6,1     ;人数增加ADD    R7,R7,1     ;移向下一分数ADD  R1,R1,1     ;计数加1ADD    R0,R1,-8    ;R0=计数-8BRn    CountB      ;计数小于8,还在前50%继续判断B人数
;
; 将A B人数保存
;
STORE   STI R5,AnumSTI  R6,BnumHALT         ;程序运行结束
;
SCORE   .FILL   x3200       ;成绩存放起始地址
RES .FILL   x4000       ;成绩降序结果存放起始地址
Anum    .FILL   x4100       ;存放A地址
Bnum    .FILL   x4101
nAscore .FILL   -85     ;A分数相反数
nBscore .FILL   -75
StuNUM  .FILL   16      ;学生人数
ONE .FILL   1       ;1
;       .END            ;代码结束

结论或体会

在本次实验中,我首次尝试了在LC3利用汇编代码实现一个小程序,熟悉了了相关语法和良好的代码分割。认识到了适用标号的诸多好处,如利用LD直接加载数据常量,将地址偏移的计算交给机器负责从而增加代码的可读性;同时也熟悉了关于标号的各种操作。通过规定文件起始位置(.ORIG)实现多文件连接的可能。

另外我熟悉了利用汇编代码编写循环和分支结构的过程,第一次尝试用汇编代码实现冒泡排序。尝试了将一个实际问题通过问题分析,找到相应的算法实现流程及数据结构,进而通过逐步编写调试完成对问题的解决。

在本次实验中我也纠正了一些自己的模糊认知。比如标号地址是一个常量,不能做指针移动。其他数据标号也同样是常量,需要将其赋值给寄存器才能进行变量操作。另外lc3仅有8个寄存器。需要合理循环利用寄存器。

【计算机系统1】3 LC-3汇编语言求成绩等级相关推荐

  1. C语言:从键盘输入10个学生的成绩存储在数组中,求成绩最高者的序号和成绩

    /*从键盘输入10个学生的成绩存储在数组中,求成绩最高者的序号和成绩*/ #include <stdio.h> int main(){int i,n=1;float max,grade[1 ...

  2. 26 利用switch语句解决问题 【项目1:投票表决器】【项目2:成绩等级】【项目3:分段函数求值switch语句版】【项目4:本月有几天?】【项目5:个人所得税计算器switch语句版】

    /*项目1:投票表决器] 设计一个投票表决器,其功能是: 输入Y.y,打印agree 输入N.n,打印disagree 输入其他,打印lose */#include <stdio.h>in ...

  3. 计算机计算合格不合格的公式,excel给成绩等级划分_如何使用Excel计算优秀、良好、合格、不合格的比例?...

    在excel怎样算优秀,良好,及格,不及格 利用IF函数就可以做到了. 具体的步骤如下所示: 1.打开EXCEL,一个要进行运算的单元格.(下图仅为演示数据,假设60以下为不及格,60-70为及格,7 ...

  4. 再php用if语句实现成绩,php中if语句怎么编写学生成绩等级

    php中if语句怎么编写学生成绩等级 php中if语句怎么编写学生成绩等级? 代码如下:php语言 var $score;//分数变量 if($score<60){ echo "不及格 ...

  5. php中表单输出成绩等级,php中if语句怎么编写学生成绩等级_后端开发

    c++如何比较两个字符串?_后端开发 c++两个字符串比较的方法:首先定义整型变量j及两个字符串变量:然后输入两个字符串保存在变量s1和s2中并比较大小:最后根据判断结果j的值,输出两个字符串的比较结 ...

  6. 判断学生成绩等级 php,php中if语句怎么编写学生成绩等级_后端开发

    c++如何比较两个字符串?_后端开发 c++两个字符串比较的方法:首先定义整型变量j及两个字符串变量:然后输入两个字符串保存在变量s1和s2中并比较大小:最后根据判断结果j的值,输出两个字符串的比较结 ...

  7. php写一个成绩等级,php中if语句怎么编写学生成绩等级

    php中if语句怎么编写学生成绩等级? 代码如下:php语言 var $score;//分数变量 if($score<60){ echo "不及格"; }elseif($sc ...

  8. 潍坊中考计算机成绩,2017年潍坊中考考试科目及成绩等级划分

    2017年潍坊中考考试科目及成绩等级划分 2017-3-17 8:55:00 | 点击13602次 考试科目及形式 1.初中学业水平考试的科目及成绩等级划分 初中学业水平考试分考试科目和考查科目两类. ...

  9. ACMNO.5给出一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。 90分以上为A 80-89分为B 70-79分为C 60-69分为D 60分以下为E

    题目描述 给出一百分制成绩,要求输出成绩等级'A'.'B'.'C'.'D'.'E'. 90分以上为A 80-89分为B 70-79分为C 60-69分为D 60分以下为E 输入 一个整数0-100以内 ...

最新文章

  1. Windows7 64位下vs2008配置OpenCV2.3.1
  2. textarea样式
  3. sql 分组后按时间降序排列再取出每组的第一条记录
  4. C# DataTable的詳細用法
  5. 使用HDFS客户端java api读取hadoop集群上的信息
  6. Java 8 时间日期库的20个使用演示样例
  7. 汇编语言实模式到保护模式的思考
  8. 他说,编程的黄金时代已到
  9. atitit.木马病毒webshell的原理and设计 java c# .net php.
  10. 《计算机组网试验-DNS服务器安装配置 》杭州电子科技大学
  11. 客户分析表格怎么做 财务合并报表培训 5分钟看懂财务报表
  12. bat批处理,变量不生效
  13. Android下载图片并添加图片水印
  14. InputStream转byte[]
  15. VUE时间范围选择的组件
  16. PHP:安装fileinfo扩展
  17. (HDU)1718 -- Rank (段位)
  18. oracle 修改 dbid,Oracle 在使用NID更改DBID时ORA-01122 ORA-01110 ORA-01206
  19. 计算机描述不可用步骤,Win10 1909系统中提示打印机描述不可用解决方法
  20. TMMi02:SG和SP读书笔记

热门文章

  1. 金融过程的模拟(一):CIR 过程的模拟
  2. JAVAEE千锋教育第一天学习总结(2022年7月11日)
  3. 妻子照顾高位截瘫丈夫16年:和你一直到老挺知足
  4. Spring Boot进阶(17):如何在Swagger2中配置header请求头等参数?若不会,我便手把手教你 | 超级详细,建议收藏
  5. 常用HANA函数解释
  6. 安装window10时没选XPS,现在怎么安装
  7. Android 增量更新实现
  8. 形状相似的物品_找身边与图形相似的事物
  9. 火焰焰心matlab,[转载]酒精灯火焰的温度真的是外焰最高吗?
  10. 水塘抽样算法(Reservoir Sampling Algorithm)