【8086汇编】排序实验

实验内容

使用DEBUG命令,从首址为1000H的内存区开始存放50个数,要求设计程序将这些数由小到大排序,排序后的数,仍放在该区域中。

程序流程图

在这里插入图片描述

实验程序

DATAS SEGMENT						;数据段代码
    SORTNUM EQU 50 
    DISPLAY DB 'After Change','$'
    CRLF DB 0AH,0DH,'$'
DATAS ENDS

EDATA SEGMENT						;ES段代码,可以不要,本程序没用到
 MES DB 50 DUP(?) 
EDATA ENDS

STACKS SEGMENT						;堆栈段代码
    
STACKS ENDS

CODES SEGMENT						;代码段代码
    ASSUME CS:CODES,DS:DATAS,SS:STACKS,ES:EDATA
START:
    MOV AX,DATAS
    MOV DS,AX
    
    MOV AX,EDATA							;ES段初始化
    MOV ES,AX
    MOV AX,1000H
    MOV ES,AX
    
    XOR BX,BX						;初始化
    MOV CX,SORTNUM-1
    MOV SI,1000H
    
L1: MOV AL,[SI+BX]					;AL:存最小数,AH:存最小数标号
    MOV AH,BL						;取第一个数设为最小数
    PUSH CX
    MOV DX,BX
    PUSH BX    						;BX在L2里面当寄存器,这里入栈

L2: INC DX						;DX指向下一个角标,取数给AL
    MOV BX,DX
    CMP AL,[SI+BX]					;比较
    JNG L3
    MOV AL,[SI+BX]
    MOV AH,DL

L3: LOOP L2
    POP BX 
    MOV CH,BL     
    MOV CL,[SI+BX]					;CX这里没有用到,后面会出栈,这里当寄存器使用
    MOV [SI+BX],AL    					;CH存外循环开始数角标,CL保存外循环数
    MOV BL,AH
    MOV [SI+BX],CL
    MOV BL,CH
    INC BX
    POP CX
    LOOP L1
    
    MOV AH,9
    LEA DX,DISPLAY
    INT 21H
    MOV AH,9
    LEA DX,CRLF
    INT 21H
    
    MOV AH,4CH
    INT 21H
    
CODES ENDS
    END START

介绍几个要用到的DEBUG命令

T	单步执行
T N	单步执行N次
G	执行所有程序,内存单元内容保留
D 1000 1010	显示1000H单元和1010H单元之间的内容
E DS:1000	从1000H单元开始,给地址单元送数
R	看寄存器内容
R CX	会显示CX单元内容,同时会回车换行弹出冒号:
0066	输入0066,这样CX单元内容就变成0066了

运行结果

在这里插入图片描述

在这里插入图片描述

实验分析

注意到开始用了两个单步执行命令T,这是因为,头两条语句操作系统会清空单元内容。倘若在这之前给单元送数的话,内容会被清空。

还有我感觉这个实验程序用的是选择排序法,并不是冒泡排序法,如果是冒泡排序法,内循环比较中会有数字交换,但是这个程序是内循环比较完毕后,把最小数单元内容和起始单元内容交换。

数字排序只能从0-7F进行比较排序,大于7F的话,可以比较,但不会排序。我设的50个存数的地址单元为字节,理应说,可以进行排序的数应为0~FFH,但实际可以排序的数范围在0至7FH。

我一开始想过用XCHG指令来进行交换,但发现XCHG 指令不能用作地址单元与地址单元间的交换。后来改变想法,程序如下:

MOV DX,0
MOV DL,AH					;AH存放了最小数的角标
MOV DI,DX
MOV AH,1000H[DI]
XCHG 1000H[BX],AH			;BX存放了外循环开始的地址

仔细思考发现,这条语句有问题。这条指令执行完,外循环起始地址单元内容赋了最小数,但是最小数单元没有赋起始地址单元内容。刚刚突然想到可以在上句最末加上一条语句。XCHG 1000H[DI],AH可以解决这个问题。

masm软件:
链接:https://pan.baidu.com/s/1BYMLoqk1ytman3P4DffMeA
提取码:hmf2

  • 11
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
综合实验报告 ( 2010 -- 2011 年度第 一 学期) 名 称: 《汇编语言程序设计》综合实验 班 级: 学 号: 学生姓名: 指导教师: 设计周数: 一周 成 绩: 日期: 2011 年 1 月 3 日 《汇编语言程序设计》综合实验 任 务 书 一、 目的与要求 通过本门课程的学习与实践,加深对汇编语言程序设计课程的理解与掌握,提高 学生的汇编语言程序设计能力,同时可以加深对计算机工作原理的理解,有助于促进 后续课程的学习。 本课程要求学生针对课本所学知识从调试程序、循环程序设计、分支程序设计、 子程序设计、显示器IO程序设计、键盘输入程序设计和中断练习程序等七个实验进行 学习和实践,使学生对汇编语言有更深入、细致和全面的了解,并能用所学知识解决 实际问题。 要求有实验说明,画出程序流程图,然后根据流程图编写程序,并上机调试写出运 行结果。 二、 主要内容 1. 比较字符串sample(学习)、用表格形式显示字符 比较字符串sample:比较两个字符串string1和string2所含的字符数是否相同。 若相同则显示'match',否则显示'no match';要求编写程序,并汇编,连接,运行,然后使用Debug调试该程序。 用表格形式显示字符:按15行*16列的表格形式显示ASCII码为10H- 100H的所有字符,即以行为主的顺序及ASCII码递增的次序依次显示对应的字符。每 16个字符为一行,每行中的相邻两个字符之间用空白符(ASCII为20H)隔开。 2. 查找匹配字符串 程序接受用户键入的一个关键字以及一个句子。如果句子中不含关键字则显示'n o match';如果句子中包含关键字则显示'match',且把该字在句子中的位置用十六进制 数显示出来。 3. 分类统计字符的个数 程序接收用户键入的一行字符(用回车符结束),并按字母,数字及其他字符分 类计数,然后将结果存入以letter,digit和other为名的存储单元中。 4. 查找电话号码 要求程序建立一个可存50项的电话号码表,每项包括人名及电话号码两部分;程 序可接受输入人名及相应的电话号码,并将其保存至电话号码表中;当有新的输入后 ,程序应按人名对电话号码表重新排序;程序可接受键盘输入人名并查找电话号码, 再在屏幕上显示出来。 5. 屏幕窗口程序 在屏幕上开出三个窗口,它们的行列坐标如下页图所示,光标首先定位在右窗口最 下面一行的行首(15, 50),如果从键盘输入字符,则显示在右窗口,同时也显示在下窗口的最下面一行。若 需要将字符显示于左窗口,则先按下左键,接着再从键盘输入字符,字符就会从左窗口 的最下行开始显示,同时下窗口也显示左窗口的内容。当一行字符显示满后,窗口自动 向上卷动一行,输入字符继续显示于最低一行,窗口最高一行向上卷动后消失。 6. 扩充键盘处理功能(选做) 在完成键盘处理基本功能的基础上,增加left_shift 和 right_shift键的功能。要求实现左右SHIFT任何一个键处于按下状态时输入字符为键 盘的上档字符或大写字母,否则输出数字或小写字母。 三、 进度计划 "序号 "设计内容 "完成时间 "备注 " "1 "比较字符串sample(学习) "2010.12.27 " " " "用表格形式显示字符 " " " "2 "查找匹配字符串 "2010.12.28 " " "3 "分类统计字符的个数 "2010.12.29 " " "4 "查找电话号码 "2010.12.30 " " "5 "屏幕窗口程序 "2010.12.31 " " "6 "扩充键盘处理功能(选做) "2010.12.31 " " 注:其中第1- 5个实验根据进度在12月31日之前验收即可;学有余力的同学可选做第6题。 四、设计成果要求 1. 以上实验要求首先画出程序流程图,然后根据流程图编写程序并上机调试,教师将 验收实验结果。 2. 课程设计报告:完成上机题目后,应认真撰写上机课程设计报告,报告内容包括: 上机题目及要求; 实验说明:完成的功能、整体设计思想及使用的算法; 设计的程序流程框图和主要数据结构; 上机题目完成的情况,输入的典型代码、数据和运行结果; 存在的问题及解决方法; 上机实验的心得体会。 五、 考核方式 依据进度计划,完成综合实验内容,并向老师讲解所完成任务的功能、思想、使用算 法及主要程序流程,老师提出问题,提交综合实验报告。成绩评定方法:现场验收+综合 实验报告。 1. 实验题目:实验2.1用表格形式显示字符 2. 实验目的和要求:详见任务书 3. 实验说明: 1) 显示每个字符可使用功能号为 02 的显示输出功能调用,使用方法如下: MOV AH,02H MOV DL,输出字符的 ASCII 码 INT 21H 2) 显示空

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值