汇编语言#编写两个子程序,分别实现:1)使用选择法排序,按成绩从高到低的进行排序;2)分别统计学生某门课程成绩中各分数段的成绩的人数,并输出

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
  另一种解释就是,直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来,顺序放入新数组,直到全部拿完。再简单点,对着一群数组说:你们谁最小出列,站到最前边;然后继续对剩余的无序数组说:你们谁最小出列,站到刚才那位的后边;再继续刚才的操作,一直到最后一个。现在数组有序了,从小到大。
2、 选择排序思路
一趟遍历记录最小的数,放到第一个位置;
  再一趟遍历记录剩余列表中最小的数,继续放置;
假如,有一个无须序列A=[6,3,1,9,2,5,8,7,4],选择排序的过程应该如下:
  第一趟:选择最小的元素,然后将其放置在数组的第一个位置A[0],将A[0]=6和A[2]=1进行交换,此时A=[1,3,6,9,2,5,8,7,4];
  第二趟:由于A[0]位置上已经是最小的元素了,所以这次从A[1]开始,在剩下的序列里再选择一个最小的元素将其与A[1]进行交换。即这趟选择过程找到了最小元素A[4]=2,然后与A[1]=3进行交换,此时A=[1,2,6,9,3,5,8,7,4];
  第三趟:由于A[0]、A[1]已经有序,所以在A[2]~A[8]里再选择一个最小元素与A[2]进行交换,然后将这个过程一直循环下去直到A里所有的元素都排好序为止。这就是选择排序的精髓。因此,我们很容易写出选择排序的核心代码部分,即选择的过程,就是不断的比较、交换的过程。
  整个选择的过程如下图所示:

实验步骤:

1、使用记事本等编辑软件编写程序源代码,并保存为asm文件。
以下为程序源代码:

DATA SEGMENT
SCORE DB 73,81,86,34,80,93,65,77
COUNT EQU $-SCORE
STU DB 5 DUP(0)
STRING1 DB 'SCORE 0~59:$'
STRING2 DB '---SCORE 60~69:$'
STRING3 DB '---SCORE 70~79:$'
STRING4 DB '---SCORE 80~89:$'
STRING5 DB '---SCORE 90~100:$'
DATA ENDS
STAK SEGMENT STACK 'STACK'
STK DB 200 DUP(0)
STAK ENDSCODE2 SEGMENT
ASSUME CS:CODE2,DS:DATA,SS:STAK
JISHU PROC FARPUSH CXPUSH SI
LOOP3:  CMP SCORE[SI],59JA JI1INC STU[0]JMP JIEND
JI1:    CMP SCORE[SI],69JA JI2INC STU[1]JMP JIEND
JI2:    CMP SCORE[SI],79JA JI3INC STU[2]JMP JIEND
JI3:    CMP SCORE[SI],89JA JI4INC STU[3]JMP JIEND
JI4:    INC STU[4]
JIEND:  INC SILOOP LOOP3POP SIPOP CXRET
JISHU ENDP
CODE2 ENDSCODE1 SEGMENT
ASSUME CS:CODE1,DS:DATA,SS:STAK
MAIN PROC FAR
START:MOV AX,DATAMOV DS,AXMOV CX,COUNTMOV SI,0MOV DI,0
LOOP0:     MOV AX,0CALL LOOP1INC SIINC DILOOP LOOP0MOV SI,0MOV CX,COUNTCALL  FAR PTR JISHUMOV SI,0MOV DX,OFFSET STRING1MOV AH,9INT 21HCALL OUTPUTMOV DX,OFFSET STRING2MOV AH,9INT 21HCALL OUTPUTMOV DX,OFFSET STRING3MOV AH,9INT 21HCALL OUTPUTMOV DX,OFFSET STRING4MOV AH,9INT 21HCALL OUTPUTMOV DX,OFFSET STRING5MOV AH,9INT 21HCALL OUTPUT
MOV AH,4CH
INT 21H LOOP1 PROC NEARPUSH AXPUSH CXPUSH SIPUSH DI
LOOP2:     MOV AL,SCORE[DI]CMP AL,SCORE[SI]JNB NEXCHMOV AH,ALMOV AL,SCORE[SI]MOV SCORE[DI],ALMOV SCORE[SI],AH
NEXCH:  INC SILOOP LOOP2POP DIPOP SIPOP CXPOP AXRET
LOOP1 ENDPOUTPUT PROC NEARMOV DL,30H        MOV AH,02HADD DL,STU[SI]INT 21HINC SIRET
OUTPUT ENDP
MAIN ENDP
CODE1 ENDS
END START

2、使用DOSBOX软件搭建汇编环境,调用masm和link程序,将源代码编译链接成可执行程序(stusvice.exe)。
3、运行stusvice.exe,查看程序运行情况及结果检验
在DOS环境中运行debug stusvice.exe,运用debug的u,g,d,r,t调用功能,即可查看检验程序运行状况。
首先调用反汇编指令u查看每条代码的代码段偏移地址

找到已初始化完成语句MOV CX,COUNT,该语句对应的偏移地址为0005,
再调用运行命令g,执行g5,并调用显示内存单元内容的命令D (d0)查看内存单元内容

蓝框中为待处理8名同学的分数73,81,86,34,80,93,65,77对应的16进制存储单元,每2位16进制对应一个分数,共8个存储单元。橙框中为表示各分数段的变量STU[ ]的存储单元,预设值分别为0。
再次调用反汇编指令u查看后续代码的代码段偏移地址,找到主程序已运行完毕的语句MOV AH,4CH,该语句对应的偏移地址为0058

再调用运行命令g,执行g0058,并调用显示内存单元内容的命令D (d0)查看内存单元内容

变量STU[ ]中刚好为各分数段人数1,1,2,3,1(是十六进制数,与十进制数数值大小相同)。输出显示结果如下图:

实验过程原始记录及计算结果

1、首先编译调试选择法排序程序(以数组3,4,1,5,2为例进行实验,其十六进制与十进制数数值大小相同,较直观),以便于检验选择法排序程序和整体框架的正确性

编写运行后进行调试发现如下错误结果

经检查发现错误在循环LOOP0内:

重复给CX自减:因为LOOP LOOP0等效于下列语句:DEC CX ; JNZ LOOP0。
经修改,去掉语句 DEC CX,得到正确运行结果:

2、编译运行统计各分数段人数的程序时,出现子程序调用错误:

经检查,错误原因为子程序JISHU定义错误,未注明子程序FAR属性。
修改
3、最棘手的错误是出现死循环如下:

当调用g1e语句时,DOS虚拟环境陷入死循环,崩溃,只对关闭窗口响应。
思考了各种逻辑错以及结构错误,都未有效发现错误原因,于是运用DOS调用功能追踪命令T(trace)

发现某步一直重复跳转至同一个跳转标志 JA 0079。经检查发现是程序编写错误,将跳转标志JI4错写成JI3,导致陷入死循环。修改如下:

修改后,程序运行结果如下:

不再发生死循环,程序主程序运行良好。
4、输出显示错误:

错误原因,串STRING的内容最后都未加终止符$,修改如下:
修改
修改后,程序运行结果如下:

汇编语言#编写两个子程序,分别实现:1)使用选择法排序,按成绩从高到低的进行排序;2)分别统计学生某门课程成绩中各分数段的成绩的人数,并输出相关推荐

  1. 成绩排序_给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。

    描述 给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前. 格式 输入格式 第一行为n (n大于0不超过20),表示班里的学生数目: 接下来的n行,每行为 ...

  2. 成绩排序 给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。

    题目描述 给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前. 输入格式 第一行为 n (0 < n < 20),表示班里的学生数目: 接下来 ...

  3. c语言中调用平均成绩,C语言、用调用函数、输入3个学生5门课程的成绩分别用函数求每个学生平均分每门课的平均分...

    满意答案 wzbowei 2013.11.23 采纳率:45%    等级:12 已帮助:6317人 #include float sum1(float p[][5],float reault1[], ...

  4. 汇编语言编写方法及程序分析

    汇编语言编写方法及程序分析   1.             汇编语言程序的编写方法 (1)       汇编语言源程序以.asm为其扩展名. (2)       汇编语言源程序的每一行都可以由4个部 ...

  5. 微型计算机原理计算机钢琴,用汇编语言编写计算机钢琴程序.PDF

    用汇编语言编写计算机钢琴程序.PDF 2009年lO月 电 脑 学 习 第5期 用汇编语言编写计算机钢琴程序 汪本慧 摘 要:汇编语言是学习计算机尤其是潋型计算机原理.以及进行披型计算机开发应用不可缺 ...

  6. 假设有一个字类型的数值arry1,试编写程序统计arry1数值及其后若干数值,在字单元中存储时每个数据中含“1”数据位的个数,并将统计结果保存在res1数组中。数据段的代码定义如下: data seg

    假设有一个字类型的数值arry1,试编写程序统计arry1数值及其后若干数值,在字单元中存储时每个数据中含"1"数据位的个数,并将统计结果保存在res1数组中.数据段的代码定义如下 ...

  7. 对某班学生成绩排序。从键盘依次输入某班学生的姓名和成绩(一个班级人数最多不超过50人)并保存,然后分别按学生成绩由高到低顺序输出学生姓名和成绩,成绩相同时,则按输入次序排序。

    [问题描述] 对某班学生成绩排序.从键盘依次输入某班学生的姓名和成绩(一个班级人数最多不超过50人)并保存,然后分别按学生成绩由高到低顺序输出学生姓名和成绩,成绩相同时,则按输入次序排序. [输入形式 ...

  8. 微型计算机计算机钢琴,用汇编语言编写计算机钢琴程序

    用汇编语言编写计算机钢琴程序 汇编语言是学习计算机尤其是微型计算机原理,以及进行微型计算机开发应用不可缺少的 (本文共3页) 阅读全文>> 汇编语言是微型计算机开发应用不可或缺的重要部分, ...

  9. 有一个班4个学生,5门课程①求第1门课程的平均分;②找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均成绩;③找出平均成绩在90分以上或全部课程成绩在85分以上的学生分别编3个函数实

    有一个班4个学生,5门课程. ①求第1门课程的平均分; ②找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均成绩; ③找出平均成绩在90分以上或全部课程成绩在85分以上的学生. 分别编 ...

最新文章

  1. 每日一皮:鼓励师招到了,原来是这样的...
  2. 基于OpenCV完成离散傅里叶变换
  3. 12-CoreData操作大量数据时的注意细节
  4. 从零开始学ios开发(十):Multiview Applications(多个xib之前的切换)
  5. 四种最令人讨厌的编程语言:Java、Javascript、C++和Perl
  6. 私有云存储 linux,搭建nextcloud私有云存储网盘
  7. 鱼眼镜头的distortion校正【matlab】
  8. jdk1.6的项目可以用1.8吗_摩托车链条的保养项目有哪些?可以用高压水枪清洗吗?...
  9. 导入 SQL 时出现 Invalid default value for ‘create_time‘ 报错解决方法
  10. zookeeper原理及搭建
  11. 关于Select option默认选中及查询后选项值保留的问题
  12. 启用IIS7配置ASP运行环境的详细方法
  13. 分布式事务处理框架之LCN
  14. Python学习 - 冯诺伊曼体系结构建模与模拟 之TOY模型机
  15. 【C语言】剖析函数递归(2)
  16. idea常用护眼色的RGB值调整
  17. 【编译原理】确定有限自动机与非确定有限自动机
  18. Map集合及遍历 debug用法 以及集合的斗地主应用练习 D190326
  19. PTrade数据交互设置——从零到实盘18
  20. 经典游戏-贪食蛇(二维数组坐标)

热门文章

  1. treecard 最易申请的境外银行卡申请教程
  2. 童言无忌,孩子们的爆笑语录~~~
  3. cesium如何设置Primitive旋转
  4. 用python抓取中北大学贴吧信息看热点
  5. 网易回应养猪欠债风波:猪场勘探费极不合理
  6. Java 注解操作大全。2019最牛操作!!!
  7. 苹果手机恢复出厂设置在哪里?恢复出厂设置方法介绍
  8. CSDN视频功能测试
  9. 关于想转行,为什么我当时要选择软件测试?
  10. 微信小程序在县城、乡镇的机遇正当时?