### 微机程序8086排序分析 #### 核心功能:数据排序与分数统计 根据提供的微机程序代码,我们可以看到一个基于8086微处理器的汇编语言程序,该程序主要实现了两个核心功能:一是对一组数据进行从大到小的排序;二是统计其中分数低于60分的数据个数。下面将详细分析这两个功能的具体实现方法。 #### 数据准备与初始化 在程序开始部分,我们首先看到了数据段(DATASEGMENT)的定义。在这个数据段中,定义了一个名为SCORE的数组,包含了多组学生成绩数据。另外还定义了几个用于显示结果的字符串缓冲区(BUF1、BUF2、BUF3),以及一个用于存储排序后数据的数组SCORE2。 #### 排序算法实现 接下来是排序算法的实现。排序算法采用的是简单的冒泡排序算法,该算法通过重复地遍历待排序的列表,比较每对相邻项,如果它们的顺序错误就把它们交换过来。遍历列表的工作是重复进行的,直到没有再需要交换,也就是说该列表已经排序完成。 具体实现步骤如下: 1. **数据复制**:程序首先将原始数据复制到另一个数组SCORE2中,这样做的目的是为了不破坏原始数据。 ```assembly MOV SI, OFFSET SCORE MOV DI, OFFSET SCORE2 XOR CX, CX MOV CL, 50 S0: MOV AL, [SI] MOV [DI], AL INC SI INC DI LOOP S0 ``` 2. **冒泡排序**:接着程序利用冒泡排序算法对数组进行排序,从大到小排列。 ```assembly L0: ORDH, DH JZ L3 MOV DH, 0 MOV CX, 49 SUB CX, BX MOV SI, OFFSET SCORE2 L1: MOV AL, [SI] INC SI CMP AL, [SI] JNB EL2 XCHG AL, [SI] MOV [SI - 1], AL MOVDH, 1 L2: LOOP L1 INC BX DEC DL JNZ L0 ``` 3. **循环终止条件**:当所有数据都已正确排序后,排序过程结束。 #### 分数统计 完成排序之后,程序接着统计分数小于60分的学生数量。这里采用了简单的遍历方法: 1. **初始化计数器**:首先初始化一个计数器AX为0,用于记录小于60分的成绩数量。 2. **遍历数组**:从第一个元素开始遍历数组,每次取出一个元素,并与60进行比较。 3. **条件判断**:如果当前元素小于60,则计数器加1,表示找到一个小于60分的成绩。 4. **计数完成**:当所有元素都被检查过之后,计数完成。 具体实现代码如下: ```assembly MOVDI, OFFSET SCORE2 XOR AX, AX XORDX, DX MOVAL, 51 S2: INCDI DECAL MOVCL, [DI - 1] CMPCL, 60 JBS3 JNBS2 S3: CALL Q1 CALL P2 ``` #### 结果输出 程序输出排序后的数据、小于60分的数据个数以及平均成绩等信息。这些输出通过一系列系统调用完成,其中包括将数值转换为字符串显示等功能。 ### 总结 这段微机程序通过简单的冒泡排序算法完成了对学生成绩数据的排序,并且能够准确地统计出小于60分的成绩数量,同时还能输出排序后的成绩列表和统计数据。整个程序逻辑清晰,结构紧凑,是理解8086汇编语言编程的一个良好示例。
SCORE DB 78,74,56,77,69,79,86,44,75,77,81,89,76,86,62,34,85
DB 45,96,86,97,76,86,67,88,46,80,67,50,49,52,99,65,65
DB 89,66,46,97,82,66,58,78,90,69,88,67,73,56,95,77
SCORE2 DB 50 DUP(?)
BUF1 DB 'AVERAGE SCORE:$'
BUF2 DB 'THERE ARE $'
BUF3 DB 'STUDENTS WHOSE SCORES ARE LESS THAN 60!$'
DATA ENDS
STAC SEGMENT STACK
DB 200 DUP(?)
STAC ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STAC
MAIN PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET SCORE ;把SI寄存器指向SCORE首个地址
MOV DI,OFFSET SCORE2 ;把DI寄存器指向SCORE2首个地址
XOR CX,CX
MOV CL,50
S0: MOV AL,[SI]
INC SI
INC DI
LOOP S0 ;将SCORE的值一一赋给SCORE2
MOV DL,49
MOV DH,1 ;比较标志位
XOR BX,BX ;BX清零
L0: OR DH,DH
JZ L3
MOV DH,0
MOV CX,49 ;第一个数字比较至多49次
SUB CX,BX ;BX为内循环
MOV SI,OFFSET SCORE2 ;指向第一个数
L1: MOV AL,[SI]
INC SI
CMP AL,[SI]
JNBE L2 ;比较第一个数与下一个数,如果小则与再下一个比较
XCHG AL,[SI]
MOV [SI-1],AL ;大数沉底,小数放在表头位置
MOV DH,1
L2: LOOP L1
INC BX
DEC DL
JNZ L0
L3: MOV DI,OFFSET SCORE2 ;指向调整后的第一个数
剩余5页未读,继续阅读
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助