微机原理实验报告——字符串排序

合集下载

微机报告字符串匹配

微机报告字符串匹配

微机实验报告实验三循环程序的设计一、实验目的1、掌握提示信息的使用方法和键盘输入信息的用法;2、掌握循环程序的设计方法。

二、实验内容编写程序,从键盘分别输入两个字符串,进行比较,若相同,则显示‘MATCH’,否则,显示‘NO MATCH’。

三、实验原理强迫CPU重复执行一指令序列的程序结构是循环程序。

循环程序结构分成四部分:1、初始化部分2、循环处理部分3、循环控制部分4、结束部分四、程序流程图五、程序代码CRLF MACROMOV AH, 02HMOV DL, 0DHINT 21HMOV AH, 02HMOV DL, 0AHINT 21HENDMDATA SEGMENTMESS1 DB'INPUT STRING1:',0DH,0AH,'$'MESS2 DB'INPUT STRING2:',0DH,0AH,'$'MESS3 DB'NO MATCH',0DH,0AH,'$'MESS4 DB'MATCH',0DH,0AH,'$'MAXLEN1 DB 81ACTLEN1 DB ?STRING1 DB 81 DUP(?)MAXLEN2 DB 81ACTLEN2 DB ?STRING2 DB 81 DUP(?)DATA ENDSSTACK SEGMENT PARA STACK 'STACK'STA DB 50 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS: CODE, DS: DATA, ES:DATA, SS:STACK START:MOV AX,DATAMOV DS,AXMOV ES, AXMOV AX,STACKMOV SS,AXMOV SP,TOPMOV AH,09HMOV DX,OFFSET MESS1INT 21HMOV AH, 0AHMOV DX,OFFSET MAXLEN1INT 21HCRLFMOV AH,09HMOV DX,OFFSET MESS2INT 21HMOV AH, 0AHMOV DX,OFFSET MAXLEN2INT 21HCRLFMOV SI,OFFSET ACTLEN1MOV BX,OFFSET ACTLEN2 ;字符串2长度单元首地址送BX MOV AL,[SI] ;字符串1长度送ALCMP AL,[BX] ;比较实际长度JNZ NOMA ;不等就跳转MOV CL,[BX] ;实际长度作为比较次数COM: INC SIINC BX ;SI,BX每循环依次加1MOV AL,[SI]CMP AL,[BX]JNZ NOMADEC CL ;CL每循环依次减1CMP CL,0JNZ COMMOV AH,09HMOV DX,OFFSET MESS4INT 21HJMP DENDNOMA:MOV AH,09HMOV DX,OFFSET MESS3INT 21HDEND:MOV AX, 4C00HINT 21HCODE ENDSEND START六、程序调试调试思路:1、生成exe文件;2、观察初始化是否正常;3、观察字符串是否输入;4、观察比较字符串长度处是否跳转(相同不跳,反之,不同就跳,不匹配);5、循环体中看是否比较了字符串长度次数,是否有不匹配跳出循环体;6、显示结果是否正常。

微机原理实验2程序字符串匹配实验

微机原理实验2程序字符串匹配实验

8086汇编语言程序实验:实验二、字符串匹配实验题目:1、(必做题)编程实现:从键盘分别输入两个字符串(不必等长),然后进行比较,若两个字符串有相同的字符,则显示“MATCH”,若字符都不相同则显示“NO MATCH”。

2、(选做题)编程实现:从键盘分别输入两个字符串,然后进行比较,若两个字符串的长度和对应字符都完全相同,则显示“MATCH”,否则显示“NO MATCH”。

对应程序如下所示:;第1题;====================================HUICHE MACRO ;定义一个具有回车、换行功能的宏,为程序多次回车换行所调用。

MOV DL,0DH ;用2号功能“显示”回车。

MOV AH,02HINT 21HMOV DL,0AH ;用2号功能“显示”换行。

MOV AH,02HINT 21HENDMDA TA SEGMENTMESSAGE1 DB 'MATCH','$' ;定义“MATCH”提示信息,“$”作为调用9号功能的结束符。

MESSAGE2 DB 'NO MATCH','$' ;定义“NO MA TCH”提示信息。

TISHI1 DB 'Please input the first string:','$' ;提示输入第1个字符串的提示信息。

TISHI2 DB 'Please input the second string:','$' ;提示输入第1个字符串的提示信息。

STRING1 DB 100 ; 100为存第一个字符串的最大可用空间的字节数。

DB ? ;预留字节,存储将要输入的第1个字符串的实际长度。

DB 100 DUP(?) ;预留100个字节空间,用于存放第1个字符串。

STRING2 DB 100DB ?DB 100 DUP(?)DA TA ENDSSTACK SEGMENT ;定义一个50字节大小的堆栈段空间。

微机原理字符串匹配

微机原理字符串匹配

大学学生实验报告(2010 —2011 学年第二学期)课程名称:微型计算机原理与接口技术开课实验室:205 2011年 5 月 30 日年级、专业、班电信091 学号姓名成绩实验项目名称字符匹配程序指导教师教师评语教师签名:年月日一、实验目的、要求1.掌握提示信息的使用方法及键盘输入信息的用法。

二、实验原理及基本技术路线图或实验内容1.编写程序,实现两个字符串比较。

如果两个字符串中有一个字符相同,显示“MATCH”,否则,显示“NO MATCH”。

2.程序框图段寄存器及堆栈初始化显示“请输入字符串1”使用INT 21H的0A号子功能,接收键入的字符串显示“请输入字符串2”指针SI指向串1的首字符SI指向的字符串和串2中所有字符作比较Y相等?NSI+1,指向串1中下一字符N串1中的字符已取完?Y显示“NO MATCH”显示“MATCH”返回DOS三、所用仪器、材料和软件软件名称为:MASM FOR Windows 集成实验环境2009.7四、实验方法、步骤根据实验的目的在该环境中编写出源代码,在进行调试、运行后,看能否得出结果。

五、源码程序编制及分析注释程序清单及注释CRLF MACRO ;宏定义MOV AH,02H ;AH=02HMOV DL,0DH ;DL=0DHINT 21H ;系统功能调用来输出个回车字符MOV AH,02H ;AH=02HMOV DL,0AH ;DL=0AHINT 21H ;系统功能调用来输出一个换行符ENDM ;宏定义结束DATA SEGMENT ;数据段定义MESS1 DB 'MATCH',0DH,0AH,'$' ;定义8个存储单元的数据MESS2 DB 'NO MATCH',0DH,0AH,'$' ;定义11个存储单元的数据MESS3 DB 'INPUT STRING1:',0DH,0AH,'$' ;定义17个存储单元的数据MESS4 DB 'INPUT STRING2:',0DH,0AH,'$' ;定义17个存储单元的数据MAXLEN1 DB 81 ;字符串1的缓冲区最大字符数ACTLEN1 DB ? ;字符串1的实际输入字符的个数STRING1 DB 81 DUP (?) ;用来存储字符串1的81个单元MAXLEN2 DB 81 ;字符串2的缓冲区最大字符数ACTLEN2 DB ? ;用来存放字符串2的实际字符个数STRING2 DB 81 DUP (?) ;用来存储字符串2的81个单元DATA ENDS ;数据段定义结束STACK SEGMENT STACK ;堆栈段定义STA DB 50 DUP (?) ;在堆栈段定义50个空字符TOP EQU LENGTH STA ;TOP=50STACK ENDS ;堆栈段定义结束CODE SEGMENT ;代码段定义ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK ;段分配START: MOV AX,DATA ;MOV DS,AX ;将数据段的段地址赋给DSMOV ES,AX ;将数据段的段地址赋给ESMOV AX,STACK ;MOV SS,AX ;将堆栈段的段地址赋给SSMOV SP,TOP ;SP=50MOV AH,09H ;AH=09HMOV DX,OFFSET MESS3 ;INT 21H ;输出'INPUT STRING1:MOV AH,0AHMOV DX,OFFSET MAXLEN1INT 21H ;(DS:DX)=最大字符数,(DS:DX+1)=实际的字符数CRLFMOV AH,09HMOV DX,OFFSET MESS4INT 21H ;输出INPUT STRING2:MOV AH,0AHMOV DX,OFFSET MAXLEN2INT 21H ;(DS:DX)=最大字符数,(DS:DX+1)=实际的字符数CRLF ;宏调用CLD ;DF=0,则串操作有低地址向高地址方向进行MOV SI,OFFSET STRING1 ;将字符串1的偏移地址赋给SIMOV CL,[SI-1] ;将字符串1的字符实际个数赋给CLMOV CH,00H ;CH=00HKKK: MOV DI,OFFSET STRING2 ;将字符串2的偏移地址赋给DI PUSH CX ;将CX中的值即为字符串1的字符个数压入堆栈MOV CL,[DI-1] ;将字符串2的字符个数赋给CLMOV CH,00H ;CH=00HMOV AL,[SI] ;取出字符串1的第一个字符给ALMOV DX,DI ;将字符串2的第一个字符赋给DXREPNZ SCASB ;CX!=0(没有查完)和ZF=0(不相等)时重复JZ GGG ;ZF=1,表示已经搜到了相等的字符,则转出INC SI ;SI=SI+1POP CX ;弹出原先字符串1中剩下未被进行比较的字符个数LOOP KKK ;CX-1!=0则继续返回到子过程KKKMOV AH,09HMOV DX,OFFSET MESS2INT 21H ;否则CX=0时的系统功能调用将显示NO MATCHJMP PPP ;将跳转到PPPGGG: MOV AH,09HMOV DX,OFFSET MESS1INT 21H ;系统功能调用将显示MATCHPPP: MOV AX,4C00HINT 21H ;系统功能调用显示控制台的操作界面CODE ENDS ;代码段结束END START ;伪指令结束六、实验结果、分析和结论和体会1、实验结果如图所示2、实验分析:注意相关指令的运用与子啊存储空间中分段的运用3、体会:对一些指令进一步熟悉,对指令的执行过程有很好的了解。

微机原理课程设计报告-字符串分类统计

微机原理课程设计报告-字符串分类统计

安徽新华学院《微机原理与接口技术》课程设计字符串分类统计组长:成员:指导教师:班级:2008年12月4日目录一、摘要 (3)二、系统设计 (4)1、内容 (4)2、思路 (4)3、程序设计 (6)4、调试结果 (12)三、系统总结 (13)四、人员分工 (14)五、参考文献 (15)一、摘要本程序主要用于,把输入的一串字符分类统计,分别统计出数字、大写字符、小写字符和其他字符的个数。

本程序采用汇编语言编程,定义了宏、比较判断、循环调用、统计等等,非常人性化的把统计的结果显示出来。

比如你输入一串数字“12345”,它会显示出你输入的这串数字,并显示数字的个数为5,同时显示其他相应类字符为空。

二、系统设计1、内容从键盘输入任意一个字符串,以回车作为结束符并显示,分别统计并显示出其中数字字符、大写字符、小写字符以及其它字符的个数。

2、思路(1).首先定义两个宏,一个用于输出统计各字符的个数,另一个用于输出字符串。

(2).在数据段中定义各种字符提示信息以便程序清晰明白。

(3).定义数据缓冲区用于存放输入的字符串,定义NUM区用于存放统计的大写字符、小写字符、数字以及其它字符的个数。

定义OTHERCHAR、BIGCHAR、SMALLCHAR以及堆栈用于存放统计的相应字符保存,以便后来输出。

(4).首先调用DOS 10号功能用DX指定BUF区,将输入的字符串保存到BUF区中。

(5).将BUF+1的内容取出来,判断是否为0,如果为0表示没有输入任何字符,则程序跳到NEXTLAP(输出提示信息You do not input any string!),然后显示字符串(Do you want to input a string again(Y/N)?)然后调用DOS 1号功能获取您从键盘输入的数,判断是否为Y或y如果是则将程序跳到刚开始处重新执行,如果不是这两个字符则程序结束。

(6).如果输入了字符串,则调用DOS 2号功能将BUF里的内容输出来(2号功能可以输出$符号而9号功能遇到$符号就终止)。

汇编实验之字符串的排序

汇编实验之字符串的排序

汇编实验之字符串的排序计算机原理实验室实验报告课程名称:计算机语言与汇编原理姓名学号班级成绩设备名称及软件环境实验名称汇编语言实现字符串排序(冒泡排序)实验日期一.实验内容利用汇编语言实现字符串排序,输出,查找等功能二.理论分析或算法分析在汇编语言中,需要调用外部模块(子程来/函数)来完成部分功能,调用printf函数将字符串显示在屏幕上。

printf函数属于C语言的库函数。

它的执行代码放在一个动态链接库(dynamic load library,DLL)中,这个动态库的名字叫msvcrt.dll。

一个DLL文件对应一个导入库,如msvcrt.dll的导入库是msvcrt.lib;kernel32.dll的导入库是kernel32.lib;user32.dll的导入库是user32.lib等。

导入库文件在Visual C++的库文件目录中,在链接生成可执行文件时使用。

可执行文件执行时,只需要DLL文件,不需要导入库。

printf PROTO C :dword,:vararg在汇编语言中,可以调用printf 函数。

在程序中要指明printf的调用规则以及它的参数类型:Printf PROTO: dword,:varargprintf使用C调用规则(参数自右至左入栈,由主程序平衡堆栈)。

第1个参数是一个双字(:dword),即字符串的地址。

vararg表示后面的其他参数个数可变,可以一个没有,也可以跟多个参数三.实现方法(含实现思路、程序流程图、实验电路图和源程序列表等)做一个缓冲区,串口接收数据往缓冲区里写!在串口接收完(可以是判断字符串长度,或者判断结束标识,如0D 0A就可以用来做判断)后,置标志,主程序查询标志,如果有效,从缓冲区头开始,与指定字符串进行比较,直到找到相应字符串,然后进行个字大小的排序,并最终输出排列的顺序表。

四.实验结果分析(含执行结果验证、输出显示信息、图形、调试过程中所遇的问题及处理方法等)Start: push cspop dspush cspop es ;使数据段、附加段与代码段同段Input_Str: Output Prompt_Str ;提示输入字符串lea dx,Buffer ;字符串缓冲区地址mov ah,0ahint 21hlea si,Buffer[1] ;实际输入的字符数地址cldlodsbtest al,0ffhjz Input_Str ;若直接回车,没有输入任何字符,则请重新输入mov cl,alxor ch,chxor bx,bx ;计数器清零,bh=元音字母计数器,bl=辅音字母计数器Vowel_conso:lodsbor al,20h ;转换成小写cmp al,'a'jb Next_One ;小于'a',不是字母,不计数cmp al,'z'ja Next_One ;大于'z',不是字母,不计数push cxlea di,Vowel ;元音字符串地址mov cx,5 ;元音字母个数repnz scasb ;扫描当前字母是否是元音字母jcxz $+6inc bh ;元音字母计数jmp short $+4inc bl ;辅音字母计数pop cxNext_One: loop Vowel_consoOutput Vowel_Prom ;提示显示元音字母个数mov al,bhxor ah,ahcall Dec_ASCII ;显示元音字母个数Output Conso_Prom ;提示显示辅音字母个数mov al,blxor ah,ahcall Dec_ASCII ;显示辅音字母个数mov ah,7 ;不带回显的键盘输入,即等待按键(暂停),结束程序int 21hExit_Proc: mov ah,4ch ;结束程序int 21hBuffer db 255,0 ;字符串缓冲区Code ENDSEND Start实验输出图形调试过程中出现的问题及其解决方法1.出现不能识别的字符串输出2.不能对现现有字符串进行排序3.原始字符串的书写输出出现混乱解决方法1.对原有需要比较的字符串检查其输入的完整性,和正确性。

C语言实验报告-字符串排序

C语言实验报告-字符串排序
if(isdigit(output[i])!=0)
{output[i]=a[m];
m++;
}
}
}
void main()
{
char input[50];
char output[50];
scanf("%s",input);
my_sort(input,output);
printf("input:%s\n",input);
}
后来发现这实在是太麻烦了,就使用了字符函数isdigit代替switch语句,使程序代码缩短(能运行但无法得出想要结果的错误程序):
#include<stdio.h>
#include<string.h>
#include<ctype.h>
void my_sort(char input[],char output[])
{
char input[50];
char output[50];
scanf("%s",input);
my_sort(input,output);
printf("%s\n",input);
printf("%s\n",output);
}
但是,虽然这个程序可以运行,却得不到我想要的结果。于是,经过查找我发现了问题所在为n的数值,所以我将之改成(最终成功的程序):、
#include<string.h>
#include<ctype.h>
void my_sort(char input[],char output[])
{
int i,n,m,k,j;

微机排序实验实验报告

微机排序实验实验报告

一、实验目的1. 熟悉排序算法的基本原理和实现方法。

2. 掌握各种排序算法的性能特点。

3. 通过编程实现常见的排序算法,并进行性能测试和分析。

二、实验内容1. 实现以下排序算法:(1)冒泡排序(2)选择排序(3)插入排序(4)快速排序(5)归并排序2. 对生成的随机数据进行排序,并统计每种排序算法的运行时间。

3. 分析并比较各种排序算法的性能。

三、实验步骤1. 编写排序算法的代码。

(1)冒泡排序:通过比较相邻元素的大小,如果顺序错误则交换,重复这个过程,直到没有需要交换的元素。

(2)选择排序:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

以此类推,直到所有元素均排序完毕。

(3)插入排序:将未排序的数据元素插入到已排序的有序序列中,从而得到一个新的、有序的序列。

(4)快速排序:通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

(5)归并排序:将两个或两个以上的有序表合并成一个新的有序表。

2. 生成随机数据,并进行排序。

3. 使用计时器统计每种排序算法的运行时间。

4. 分析并比较各种排序算法的性能。

四、实验结果与分析1. 实验数据生成1000个随机数,范围在1到10000之间。

2. 实验结果(1)冒泡排序:运行时间约为0.002秒。

(2)选择排序:运行时间约为0.003秒。

(3)插入排序:运行时间约为0.004秒。

(4)快速排序:运行时间约为0.0005秒。

(5)归并排序:运行时间约为0.001秒。

3. 性能分析(1)冒泡排序、选择排序和插入排序属于O(n^2)复杂度的排序算法,其运行时间随着数据量的增加而迅速增加。

(2)快速排序和归并排序属于O(nlogn)复杂度的排序算法,其运行时间随着数据量的增加而逐渐增加,但增长速度较慢。

汇编语言实现字符串逆序输出

汇编语言实现字符串逆序输出

北京邮电大学微机原理与接口技术实验报告学院:电子工程学院班级:2012211203学号:2012210876姓名:邱启哲字符串的逆序存储实验一、题目要求实现将STRING1起始存取单元中的字符串’ABCDEFGHIJKLM’逆序存放到STRING2的存储单元中,并在屏幕上显示结果。

二、设计思路在数据段定义时,将字符串’ABCDEFGHIJKLM’存入STRING1中,并定义一个空字符串数组STRING2用于存放字符。

将指针[STRING1+BP]指向字符串数组STRING1的最后一个字符,指针[STRING2+BX]指向STRING2的起始字符对其进行赋值,每次赋值后STRING1的指针减一,STRING2的指针加一,循环赋值13次。

赋值完成后用系统调用实现STRING2中内容的循环输出。

三、程序代码DATA SEGMENTSTRING1 DB 'ABCDEFGHIJKLM'STRING2 DB 13DUP(0)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DA TAMOV DS,AXMOV CX,13MOV BX,0MOV BP,12LOOP1:;此循环用于实现对STRING2的赋值功能MOV AL,[STRING1+BP] ;通过AL实现STRING1对STIRNG2的赋值MOV [STRING2+BX],ALINC BXDEC BPLOOP LOOP1MOV CX,13 ;将CX值复员以便进入下一个循环MOV BX,OFFSET STRING2;使BX指向STRING2的起始字符LOOP2:MOV AH,2 ;调用2号系统调用,输出STRING2MOV DL,[BX] ;用STRING2中的字符为DL赋值INT 21HINC BX ;BX加一,向后移一位LOOP LOOP2MOV AH,4CH ;程序结束INT 21HCODE ENDSEND START四、程序运行截图1、汇编和连接过程2、生成相应程序文件3、程序运行结果由结果可见,实现了字符串的逆序存储。

微机原理实验报告冒泡法对数据排序

微机原理实验报告冒泡法对数据排序

实验内容:用“冒泡“法对一组数300,250,280,240,260,按从小到大的顺序排列。

实验要求:1.编制程序,对这组数进行排序,并输出原数据及排序后数据;2.利用DEBUG调试工具,用D0命令,查看排序前后,内存数据的变化;3. 去掉最大和最小的两个值,求出其余值的平均值,并输出最大值,最小值和平均值;4. 用学过的压栈PUSH和出栈POP指令,将平均值按位逐个输出(即输出263);5.将平均值263转化为二进制串,并将这组二进制串输出。

6.所有数据输出前要用字符串的输出指令,进行输出提示(如:zui da zhi shi : 300等),所有数据结果能清晰地显示在屏幕上。

程序代码:DATA SEGMENT ;定义数据段DT1 DW 300,250,280,240,260DT2 DB 'what five data input is',0DH,0AH,'$'DT3 DB 'what after rank is',0DH,0AH,'$'DT4 DB 'The max is',0DH,0AH,'$'DT5 DB 'The min is',0DH,0AH,'$'DT6 DB 'The average is',0DH,0AH,'$'DT7 DB 'show you the average one by one',0DH,0AH,'$'DT8 DB 'show you the average in binary form',0DH,0AH,'$'DT9 DB 0DH,0AH,'$'DT0 DB 'B',0DH,0AH,'$'N EQU 5DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA ;说明代码段、数据段STAT: MOV AX,DATAMOV DS,AXLEA DX,DT2 ;输出字符串MOV AH,09HINT 21HCALL ZIXU ;调用数据输出过程对数据进行排序:MOV CX,N-1 ;设置N-1轮比较次数MOV DX,1 ;比较轮次技术JM4:PUSH CXMOV CX,NSUB CX,DXLEA SI,DT1JM3:MOV AX,[SI]CMP AX,[SI+2]JLE JM2XCHG AX,[SI+2]XCHG AX,[SI]JM2:ADD SI,2LOOP JM3POP CXINC DXLOOP JM4输出排序后的顺序:LEA DX,DT3MOV AH,09HINT 21HCALL ZIXU输出最大值:LEA DX,DT4MOV AH,09HINT 21HLEA SI,DT1+8 ;排序后最后一个数就是最大值MOV AX,[SI]CALL ZIXU1输出最小值:LEA DX,DT5MOV AH,09HINT 21HLEA SI,DT1 ;排序后第一个数就是最小值MOV AX,[SI]CALL ZIXU1输出平均值:LEA DX,DT6MOV AH,09HINT 21HLEA SI,DT1+2 ;去掉最大最小后的数求和MOV AX,[SI]ADD AX,[SI+2]ADD AX,[SI+4]MOV BX,3MOV DX,0DIV BX ;求其平均值MOV CX,AXCALL ZIXU1 ;调用输出程序输出把平均值分三位输出:LEA DX,DT7MOV AH,09HINT 21HMOV AX,CXMOV BX,100MOV DX,0DIV BXPUSH DXADD AL,30HMOV DL,AL ;输出平均值的第一位MOV AH,2INT 21HLEA DX,DT9 ;换行MOV AH,09HINT 21HPOP DXMOV AX,DXMOV BX,10MOV DX,0DIV BXADD AL,30HMOV DL,AL ;输出平均值的第二位MOV AH,2INT 21HLEA DX,DT9 ;换行MOV AH,09HINT 21HPOP DXADD DX,30HMOV AH,2 ;输出平均值的第三位I NT 21HLEA DX,DT9MOV AH,09HINT 21H;以二进制位输出平均值LEA DX,DT8MOV AH,09HINT 21HMOV BX,CXMOV CX,16JM5:MOV DX,0SAL BX,1RCL DX,1ADD DX,30HMOV AH,02HINT 21H DEC CXJNZ JM5LEA DX,DT0MOV AH,09HINT 21HMOV AH,4CH ;返回DOSINT 21H;数据序列的输出写成一个过程:MOV CX,5LEA SI,DT1JM1:MOV AX,[SI]MOV BX,100MOV DX,0DIV BXPUSH DXADD AL,30HMOV DL,ALMOV AH,2INT 21HPOP DXMOV AX,DXMOV BX,10MOV DX,0DIV BXPUSH DXADD AL,30HMOV DL,ALMOV AH,2INT 21HPOP DXADD DX,30HMOV AH,2INT 21HLEA DX,DT9MOV AH,09HINT 21HADD SI,2LOOP JM1RETZIXU ENDP;当个数据输出过程:ZIXU1 PROC ;将数据的输出写成一个过程MOV BX,100MOV DX,0DIV BXPUSH DXADD AL,30HMOV DL,ALMOV AH,2INT 21HPOP DXMOV AX,DXMOV BX,10MOV DX,0DIV BXPUSH DXADD AL,30HMOV DL,ALMOV AH,2INT 21HPOP DXADD DX,30HMOV AH,2INT 21HLEA DX,DT9MOV AH,09HINT 21HRETZIXU1 ENDPCODE ENDSEND STAT调试中出现的一些问题:1.输入时不慎将字母O当数字0输入,结果导致了下面第5行提示的错误。

微机原理课程设计报告_学生成绩排序名次

微机原理课程设计报告_学生成绩排序名次

姓名:***班级: 电科0901学号: **********课程设计微机原理2012 年 6 月 29 日微机原理课程设计目的:结合微型计算机原理课程的学习,进一步巩固已学的知识,同时针对计算机原理知识的具体应用,学会对系统中DOS和BIOS的使用。

学会使用屏幕编辑程序——EDIT,弄懂汇编程序的上级过程以及如何运用DEBUG软件进行汇编程序的调试。

内容与要求:1.字符串匹配设计为掌握提示信息的设置方法及读取键入信息的方法,编写程序实现两个字符串比较,如相同则显示“MATCH”,否则显示“NO MATCH”。

2.从键盘输入数据并显示的设计为掌握键盘接受数据的方法,并了解将键盘数据显示时必须转换为ASCII码的原理,编写程序,将键盘接受到的四位十六进制数据转换为等值的二进制数显示。

3.响铃设计为掌握响铃的使用方法,编写程序,从键盘接受输入字符,如是数字N则响铃N此,如不是数字则不响。

4.将键盘输入的小写字母转换成大写字母的设计为了解小写字母和大写字母在计算机内的表示方法,并学习如何进行转换,编写程序,接受键盘字符,并将其中的小写字母转变为大写字母,然后显示在屏幕上。

5.学生成绩名次表设计为进一步熟悉排序方法,编写程序,将100以内的30个成绩存入首址为1000H的存储区中。

1000H+i表示学号为i的学生成绩。

编写程序使得在2000H开始的区域排出名次表,2000H+i为学号i的学生的名次。

流程图程序代码微机原理课程设计1.字符串匹配设计下面着重介绍程序5——学生成绩名次表设计:流程图:微机原理课程设计主程序流程图SCAN子函数程序流程图程序代码及注释:CRLF MACRO ;宏定义,回车换行MOV AH,02HMOV DL,0DH微机原理课程设计INT 21HMOV AH,02HMOV DL,0AHINT 21HENDMDATA SEGMENTSTUNUM EQU 30 ;学生数MESS1 DB 'Please input 30 score',0DH,0AH,'$' ;提示信息ERROR DB 'Input error,try again',0DH,0AH,'$' ;报错信息MESS2 DB 'The order is:',0DH,0AH,'$'EMARK DB ? ;报错标志ORG 1000H ;存放成绩地址SCORE DB 30 DUP(?) ;成绩表ORG 2000H ;存放名次地址SEQU DB 30 DUP(?) ;名次表DATA ENDSSTACK SEGMENTSTA DW 32 DUP(?)TOP DW ?STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV ES,AXMOV SP,TOPMOV AH,09H ;显示提示信息MOV DX,OFFSET MESS1INT 21HMOV SI,OFFSET SCORE ;成绩表首址MOV CX,STUNUMMOV EMARK,0 ;报错标志清0UUU: CALL GETNUM ;调用子函数读取成绩CMP EMARK,01H ;判断是否出错JE START ;出错则重新开始MOV [SI],DL ;没出错则存入成绩INC SI ;指向下一个成绩单元地址LOOP UUU ;判断30个成绩是否读取完MOV CX,STUNUMMOV DI,OFFSET SEQU ;名次表首址VVV: CALL SCAN ;调用扫描子程序微机原理课程设计MOV AL,STUNUM ;学生总数SUB AL,CL ;计算名次INC ALMOV BX,DX ;学号PUSH AX ;将名次转换成压缩BCD码方便显示PUSH BXPUSH CXXOR AH,AHMOV BH,0AHDIV BHMOV CL,4SHL AL,CLADD AL,AHMOV DH,ALPOP CXPOP BXPOP AXMOV [DI+BX],DH ;存入名次LOOP VVV ;判断是否存完MOV AH,09H ;显示名次提示信息LEA DX,MESS2INT 21HMOV CX,STUNUMMOV SI,OFFSET SEQUWWW: MOV AL,[SI]CALL DISPI ;调用子函数显示名次PUSH DXPUSH AXMOV AH,02 ;显示空格MOV DL,20HINT 21HPOP AXPOP DXINC SI ;指向名次表的下一个地址LOOP WWW ;判断是否输出所有名次MOV AH,4CH ;返回DOSINT 21HSCAN PROC NEAR ;扫面子函数,没调用一遍,找出成绩表;中最高成绩,记录其学号,并将此成绩;清0微机原理课程设计PUSH CXMOV CX,STUNUMMOV AL,00HMOV BX,OFFSET SCOREMOV SI,BXCCC: CMP AL,[SI]JAE JJJMOV AL,[SI]MOV DX,SISUB DX,BXJJJ: INC SILOOP CCCADD BX,DXMOV BYTE PTR [BX],00HPOP CXRETSCAN ENDPDISPI PROC NEAR ;显示子程序PUSH CXMOV BL,AL ;显示高4位MOV DL,BLMOV CL,04ROL DL,CLAND DL,0FHCALL DISPLMOV DL,BL ;显示低4位AND DL,0FHCALL DISPLPOP CXRETDISPI ENDPDISPL PROC NEAR ;将名次转换成对应的ASCII码值并显示ADD DL,30HMOV AH,02HINT 21HRETDISPL ENDPGETNUM PROC NEAR ;读取成绩子函数PUSH CXXOR DX,DX ;清0,用于存放成绩GGG: MOV AH,01H微机原理课程设计INT 21H ;键盘字符输入CMP AL,0DHJZ RRR ;如果是回车则结束SUB AL,30HJB ERR ;小于0则报错CMP AL,09HJBE GETS ;如果在0—9之间则存成绩至DXJMP ERR ;否则报错GETS: MOV CL,04SHL DX,CL ;将DX中已有数值左移四位XOR AH,AHADD DX,AX ;紧接着将数据存在DX中低四位JMP GGG ;跳转继续读取数据ERR: MOV AH,09H ;显示报错信息MOV DX,OFFSET ERRORINT 21HMOV EMARK,01H ;报错标志置1RRR: PUSH DXCRLF ;回车换行POP DXPOP CXRETGETNUM ENDPCODE ENDSEND START心得体会:微机原理课程设计在为期一周的微机原理课程设计中,通过查阅书籍,上网收集资料以及向老师和同学请教,我完成了老师定下的任务。

微机原理__字符匹配程序实验报告

微机原理__字符匹配程序实验报告

太原理工大学现代科技学院课程实验报告专业班级学号姓名指导教师一、实验目的掌握提示信息的使用方法及键盘输入信息的用法。

二、实验内容1、编写程序,实现两个字符串比较。

如果两个字符串中有一个字符相同,显示“MATCH”,否则,显示“NO MATCH”。

2、程序框图三、所用仪器与软件仪器:电脑一台软件:Masm for Windows 集成实验环境 2009、7四、实验方法、步骤1、编写程序代码2、运行程序,修改错误代码3、再次运行代码直至运行出正确结果五、源码程序编制及分析注释CRLF MACRO 宏定义MOV AH,02H AH=02HMOV DL,0DH DL=0DHINT 21H 系统功能调用,输出回车字符MOV AH,02H AH=02HMOV DL,0AH DL=0AINT 21H 系统功能调用,输出换行符ENDM 宏定义结束DATA SEGMENT 定义数据段MESS1 DB 'MATCH',0DH,0AH,'$' 定义8个数据储存单元MESS2 DB 'NO MATCH',0DH,0AH,'$' 定义11个数据储存单元MESS3 DB 'INPUT STRING1:',0DH,0AH,'$' 定义17个数据储存单元MESS4 DB 'INPUT STRING2:',0DH,0AH,'$' 定义17个数据储存单元MAXLEN1 DB 81 定义最大长度为81个字节ACTLEN1 DB ?STRING1 DB 81 DUP (?) 定义STRING1长度为81 MAXLEN2 DB 81 定义最大长度为81ACTLEN2 DB ?STRING2 DB 81 DUP (?) 定义STRING2长度为81DATA ENDS 数据段结束STACK SEGMENT STACK 定义堆栈段STA DB 50 DUP (?) 定义50个数据储存单元TOP EQU LENGTH STA 给TOP赋值50STACK ENDS 堆栈段结束CODE SEGMENT 定义代码段ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK 定义段基址START: MOV AX,DATAMOV DS,AX 把DATA的首地址赋给DSMOV ES,AX 把DATA的首地址赋给ESMOV AX,STACKMOV SS,AX 把STACK的首地址赋给SSMOV SP,TOP 给SP赋值50MOV AH,09H AH=09HMOV DX,OFFSET MESS3 把MESS3的偏移地址赋给DXINT 21H 系统功能调用MOV AH,0AH AH=0AHMOV DX,OFFSET MAXLEN1 把MAXLEN1的偏移地址赋给DXINT 21H 系统功能调用CRLFMOV AH,09H AH=09HMOV DX,OFFSET MESS4 把MESS4的偏移地址赋给DXINT 21H 系统功能调用MOV AH,0AH AH=0AHMOV DX,OFFSET MAXLEN2 把MAXLEN2的偏移地址赋给DXINT 21H 系统功能调用CRLFCLDMOV SI,OFFSET STRING1 把STRING1的偏移地址赋给SIMOV CL,[SI-1] 把SI-1内的内容赋给CLMOV CH,00H CH=00HKKK: MOV DI,OFFSET STRING2 把STRING2的偏移地址赋给DI PUSH CX 将CX压入堆栈MOV CL,[DI-1] 将DI-1内的的内容赋给CLMOV CH,00H CH=00HMOV AL,[SI] 将SI内的内容赋给ALMOV DX,DI 将DI赋给DXREPNZ SCASB 寻找第一个相同字符JZ GGG ZF=0执行GGG否则顺序执行INC SI SI自加1POP CX 弹出CXLOOP KKK 跳转到KKK循环MOV AH,09HMOV DX,OFFSET MESS2INT 21H 系统功能调用JMP PPP 跳转到PPPGGG: MOV AH,09HMOV DX,OFFSET MESS1INT 21H 输出MESS1PPP: MOV AX,4C00HINT 21H 带返回码结束CODE ENDS 代码段结束END START 整个程序结束六、实验结果与分析实验结果如下:(1)两个字符串中没有字符相同:(2)两个字符串中有两个字符相同:。

《微机原理实验五循环结构的程序设计:排序程序设计实验》

《微机原理实验五循环结构的程序设计:排序程序设计实验》

实验五循环结构的程序设计:排序程序设计实验1、实验目的(1)掌握接收键盘数据的方法。

(2)掌握循环结构的程序设计和排序程序设计的方法。

(3)进一步熟练在PC上建立、汇编、链接、调试和运行汇编语言程序的过程。

2、实验内容用汇编语言编写学生成绩统计程序:键盘输入学生成绩到SCORE中(0<=分数<=100,设有10个学生成绩分别是56,69,84,82,73,88,99,63,100,80)。

编程将它们由大到小排序,存回到原来的SCORE变量中;并统计低于60分、60~69、70~79、80~89、90~99及100分的人数,分别存放在S5、S6、S7、S8、S9、S10单元中。

3、实验及报告要求:(1)要求画出完整的程序流程图。

(2)根据流程图,编写完整的汇编代码源文件,要求写出所有伪指令和指令的注释;(3)编译、连接生成可执行文件,调试该可执行文件。

(4)写出完整的实验报告,特别是“实验结果”与“实验总结体会”部分,是评分的主要依据。

(5)实验总结中要求结合实验中的经验、教训或体会对汇编语言格式、调试方法、汇编指令及汇编语言编程方法、微机原理学习方法作出总结。

4、思考题:如何从屏幕输出结果?YN输入DATAS SEGMENTBUFFER DB 80,81 DUP(0),'$' SCORE1 DB 10 DUP(0);此处输入数据段代码 DATAS ENDSSTACKS SEGMENTSTA DB 64 DUP(0)SP_TOP DB 0STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXMOV AX,STACKSMOV SS,AXLEA SP,SP_TOPLEA DX,BUFFERLEA DI,SCORE1MOV AH,0AHINT 21HLEA SI,BUFFERADD SI,2MOV DL,0MOV CX,10JU: MOV AL,[SI]JE EXITPUSH CXCMP AL,2CHJE CH1POP CXINC SIINC DLLOOP JUJMP EXITCH1:CMP DL,2JNE CH2MOV AL,[SI-2]SUB AL,30HMOV CL,10MUL CLMOV AH,0MOV BL,[SI-1]SUB BL,30HMOV [DI],ALPOP CXINC DIINC SIMOV DL,0LOOP JUCH2:MOV [DI],100POP CXINC DIINC SIMOV DL,0LOOP JUEXIT: MOV AH,4CHINT 21HCODES ENDSEND START记人数DATA SEGMENTSCORE DB 67S5 db 0S6 db 0S7 db 0S8 db 0S9 db 0S10 db 0TABLE DW NP,NP,NP,NP,NP,NP,S60,S70,S80,S90,S100 DATA ENDSCODE SEGMENT 'CODE'ASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AX MOV AH,0LEA SI,SCORESP: MOV AL,[SI]MOV BL,10DIV BLSAL AL,1MOV BL,ALMOV BH,0JMP TABLE[BX]S100: INC S10 JMP NEXTS90: INC S9 JMP NEXTS80: INC S8JMP NEXTS70: INC S7JMP NEXTS60: INC S6JMP NEXTNP: INC S5 NEXT:INC SILOOP SP FINISH: MOV AH,4CH INT 21HCODE ENDSEND START排序DATAS SEGMENTSTR DB 'PLS INPUT SCORE (0-100):',0DH,0AH,'$' SCORE DB 20DB 81 DUP(0)DB '$';此处输入数据段代码SC DB 10 DUP(0)DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX;此处输入代码段代码LEA DX,STR ;调显示字符串的首地址MOV AH,9INT 21H ;字符串显示LEA DX,SCORE ;调字符串存放单元的首地址MOV AH,0AHINT 21H ;字符串输入 LEA DI,SCLEA SI,SCOREADD SI,2COMP: MOV AL,[SI]CMP AL,0DHJZ EXITCMP AL,2CHJZ NEXT1INC SILOOP COMPNEXT1:MOV AL,[SI]MOV AL,[SI-1]SUB AL,30HADD BL,ALMOV [DI],BLINC DIINC SIJMP COMPEXIT:MOV AH,4CHINT 21H ;返回操作系统CODES ENDSEND START。

《字符串排序》微课设计与开发

《字符串排序》微课设计与开发

《字符串排序》微课设计与开发当前,微课已经成为高校信息化资源建设的重点和热点。

如何提高微课的设计与开发水平却是亟需解决的问题。

从教学内容的选择、教学目标的设定、教学活动的设计、突出教学特色等方面对高校微课教学进行了探讨。

微课课程整合微课设计微课开发微课是以阐释某一知识点为目标,以短小精悍的在线视频为表现形式,以学习或教学应用为目的的在线教学视频。

笔者从微课《字符串排序》的亲身实践出发,对高校教学中的微课教学做了一些有益的探讨。

一、选择教学内容C语言程序设计是泰山医学院信息管理与信息系统四年制本科专业的一门重要的基础课程,主要面向一年级新生而开设。

字符串排序是该课程学习过程中的重点和难点。

而微课《字符串排序》正是针对学生在该知识点学习过程中经常遇到的三个代表性问题:字符串的存放、排序以及指针数组在字符串排序中的应用而设计的一节课。

微课学习结束之前,应该给学生呈现学前必备知识,微课学习结束之后,再给学生呈现拓展知识点,以促进学习的可持续化。

二、设定教学目标本次微课通过创设“图书书名排序管理”的问题情境,借助相关教学工具软件,对字符串排序这一知识点进行了深入的剖析,旨在使学生达到如下目标:1.掌握多个字符串的存储方法;2.掌握选择排序算法;3.重点掌握指针数组在字符串排序问题中的灵活应用;4.深入理解结构化程序设计的基本思想。

三、教学活动设计本次微课采用启发式教学法及任务驱动教学法,将大的问题分解为几个小的问题,使学生带着真实的任务在探索中学习。

首先,设置问题情境:“史密斯是某高校图书馆的馆员,面对大量的图书信息,他想用C语言编写程序对图书书名按照字典顺序(由小到大)进行排序,他应该怎么做呢?”进一步启发学生对该问题进行思考,将具体问题抽象成“对多个字符串组成的集合进行排序”。

紧接着从多个字符串的存放(数据结构)和如何对多个字符串进行排序(算法)两个角度展开教学活动。

针对字符串的存放,采取了对比分析方法。

微机原理实验报告冒泡法对数据排序

微机原理实验报告冒泡法对数据排序

实验内容:用“冒泡“法对一组数300,250,280,240,260,按从小到大的顺序排列。

实验要求:1、编制程序,对这组数进行排序,并输出原数据及排序后数据;2、利用DEBUG调试工具,用D0命令,查瞧排序前后,内存数据的变化;3、去掉最大与最小的两个值,求出其余值的平均值,并输出最大值,最小值与平均值;4、用学过的压栈PUSH与出栈POP指令,将平均值按位逐个输出(即输出263);5.将平均值263转化为二进制串,并将这组二进制串输出。

6、所有数据输出前要用字符串的输出指令,进行输出提示(如:zui da zhi shi : 300等),所有数据结果能清晰地显示在屏幕上。

程序代码:DATA SEGMENT ;定义数据段DT1 DW 300,250,280,240,260DT2 DB 'what five data input is',0DH,0AH,'$'DT3 DB 'what after rank is',0DH,0AH,'$'DT4 DB 'The max is',0DH,0AH,'$'DT5 DB 'The min is',0DH,0AH,'$'DT6 DB 'The average is',0DH,0AH,'$'DT7 DB 'show you the average one by one',0DH,0AH,'$'DT8 DB 'show you the average in binary form',0DH,0AH,'$'DT9 DB 0DH,0AH,'$'DT0 DB 'B',0DH,0AH,'$'N EQU 5DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA ;说明代码段、数据段STAT: MOV AX,DATAMOV DS,AXLEA DX,DT2 ;输出字符串MOV AH,09HINT 21HCALL ZIXU ;调用数据输出过程对数据进行排序:MOV CX,N-1 ;设置N-1轮比较次数MOV DX,1 ;比较轮次技术JM4:PUSH CXMOV CX,NSUB CX,DXLEA SI,DT1JM3:MOV AX,[SI]CMP AX,[SI+2]JLE JM2XCHG AX,[SI+2]XCHG AX,[SI]JM2:ADD SI,2LOOP JM3POP CXINC DXLOOP JM4输出排序后的顺序:LEA DX,DT3MOV AH,09HINT 21HCALL ZIXU输出最大值:LEA DX,DT4MOV AH,09HINT 21HLEA SI,DT1+8 ;排序后最后一个数就就是最大值MOV AX,[SI]CALL ZIXU1输出最小值:LEA DX,DT5MOV AH,09HINT 21HLEA SI,DT1 ;排序后第一个数就就是最小值MOV AX,[SI]CALL ZIXU1输出平均值:LEA DX,DT6MOV AH,09HLEA SI,DT1+2 ;去掉最大最小后的数求与MOV AX,[SI]ADD AX,[SI+2]ADD AX,[SI+4]MOV BX,3MOV DX,0DIV BX ;求其平均值MOV CX,AXCALL ZIXU1 ;调用输出程序输出把平均值分三位输出:LEA DX,DT7MOV AH,09HINT 21HMOV AX,CXMOV BX,100MOV DX,0DIV BXPUSH DXADD AL,30HMOV DL,AL ;输出平均值的第一位MOV AH,2INT 21HLEA DX,DT9 ;换行MOV AH,09HINT 21HPOP DXMOV AX,DXMOV BX,10MOV DX,0DIV BXPUSH DXADD AL,30HMOV DL,AL ;输出平均值的第二位MOV AH,2INT 21HLEA DX,DT9 ;换行MOV AH,09HPOP DXADD DX,30HMOV AH,2 ;输出平均值的第三位I NT 21HLEA DX,DT9MOV AH,09HINT 21H;以二进制位输出平均值LEA DX,DT8MOV AH,09HINT 21HMOV BX,CXMOV CX,16JM5:MOV DX,0SAL BX,1RCL DX,1ADD DX,30HMOV AH,02HINT 21H DEC CXJNZ JM5LEA DX,DT0MOV AH,09HINT 21HMOV AH,4CH ;返回DOSINT 21H;数据序列的输出写成一个过程:ZIXU PROCMOV CX,5LEA SI,DT1JM1:MOV AX,[SI]MOV BX,100MOV DX,0DIV BXPUSH DXADD AL,30HMOV DL,ALINT 21HPOP DXMOV AX,DXMOV BX,10MOV DX,0DIV BXPUSH DXADD AL,30HMOV DL,ALMOV AH,2INT 21HPOP DXADD DX,30HMOV AH,2INT 21HLEA DX,DT9MOV AH,09HINT 21HADD SI,2LOOP JM1RETZIXU ENDP;当个数据输出过程:ZIXU1 PROC ;将数据的输出写成一个过程MOV BX,100MOV DX,0DIV BXPUSH DXADD AL,30HMOV DL,ALMOV AH,2INT 21HPOP DXMOV AX,DXMOV BX,10MOV DX,0DIV BXADD AL,30HMOV DL,ALMOV AH,2INT 21HPOP DXADD DX,30HMOV AH,2INT 21HLEA DX,DT9MOV AH,09HINT 21HRETZIXU1 ENDPCODE ENDSEND STAT调试中出现的一些问题:1.输入时不慎将字母O当数字0输入,结果导致了下面第5行提示的错误。

第四次上机实验内容字符串排序.ppt

第四次上机实验内容字符串排序.ppt

条件: 从字符串中间一分为二, 左边部分按字符的ASCII值降序排 序,右边部分按字符的ASCII值升序排序。如果原字符串长度为奇数, 则最中间的字符不参加排序, 字符仍放在原位置上。
例如: 位置
012345678
498765
则处理后字符串 d c b a e f g h
len=strlen(xx[i])
for(j = 0 ; j < len-1 ; j++) for(k = j +1; k < len; k++) if(xx[i][j] > xx[i][k]) { ch = xx[i][k] ; xx[i][k] = xx[i][j] ; xx[i][j] = ch ; }
外循环j下标从1开始,步长为2 内循环k从j+2开始,步长为2
} }
字符串左右排序
函数readDat()是从文件in.dat中读取20行数据存放到字符串数组xx中 (每行字符串长度均小于80)。请编制函数jsSort(),其函数的功能是: 以行为单位对字符串按下面给定的条件进行排序,排序后的结果仍按 行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出 到文件out.dat中。
序排序。(交换方法)
ch = xx[i][k] ;
xx[i][k] = xx[i][j] ;
xx[i][j] = ch ;
}
如果字符串xx[i]的长度是否是奇数,则half++指向下一
if(len % 2) half++ ;
字符,如果是偶数,则half值不变。
} }
for(j = half ; j < (len-1) ; j++)

字符串算法—字符串排序(下篇)

字符串算法—字符串排序(下篇)

字符串算法—字符串排序(下篇) 本⽂将介绍3区基数快速排序、后缀排序法。

1. 前⽂回顾 在中,我们介绍了键索引计数法、LSD基数排序、MSD基数排序。

但LSD基数排序要求需排序字符串的长度⼀致;MSD基数排序虽然对字符串的长度没要求,但其递归循环⾥的每次循环都需要进⾏很多操作,且需要额外的空间。

本⽂将介绍⼀种更⾼效的字符串排序⽅法:结合MSD基数排序和。

如果对这两种算法不熟悉的,建议先去了解⼀下。

2. 3区基数快速排序(3-way radix quicksort) 从例⼦⼊⼿:与MSD基数排序⼀样,我们设定每个字符串的最后⼀位字符的下⼀个位置的空字符的键索为-1。

a[]是拥有⼀堆字符串的字符串数组。

与MSD基数排序⼀样,每个字符配⼀个正数键索,⽤于⽐较字符间的⼤⼩。

⾸先,对a[0](she)的第⼀个字符(s)进⾏3区快速排序: 3区快速排序会把整个数组分为3个区: 第⼀个区⾥的所有字符串的第⼀个字符都⽐(she)的第⼀个字符(s)⼩,它含有a[0]、a[1]; 第⼆个区⾥的所有字符串的第⼀个字符都与(she)的第⼀个字符(s)相同,它含有a[2]~a[11]; 第三个区⾥的所有字符串的第⼀个字符都⽐(she)的第⼀个字符(s)⼤,它含有a[12]、a[13]。

然后从上往下的,先看第⼀个区,此区含有多个字符串,对此区的第⼀个字符串(by)的第⼀个字符(b)进⾏3区快速排序:(为了⽅便观察,待排序的字符串⽤⿊⾊表⽰) 3区快速排序会把整个区分为3个区: 第⼀个区⾥的所有字符串的第⼀个字符都⽐(by)的第⼀个字符(b)⼩,它含有a[0]; 第⼆个区⾥的所有字符串的第⼀个字符都与(by)的第⼀个字符(b)相同,它含有a[1]; 第三个区⾥的所有字符串的第⼀个字符都⽐(by)的第⼀个字符(b)⼤,它没有元素; 看第⼆个区,它只有⼀个字符串,此区排序完毕; 看第三个区,它没有字符串,此区排序完毕; (为了⽅便观察,已排序完毕的字符串⽤绿⾊表⽰) 然后看下⼀个区,此区含有多个字符串,对此区的第⼀个字符串(seashells)的第⼆个字符(e)进⾏3区快速排序: 3区快速排序会把整个区分为3个区: 第⼀个区⾥的所有字符串的第⼆个字符都⽐(seashells)的第⼆个字符(e)⼩,它没有元素; 第⼆个区⾥的所有字符串的第⼆个字符都与(seashells)的第⼆个字符(e)相同,它含有a[2]~a[6]; 第三个区⾥的所有字符串的第⼆个字符都⽐(seashells)的第⼆个字符(e)⼤,它含有a[7]~a[11]; 看第⼆个区,它有多个字符串,对此区的第⼀个字符串(seashells)的第三个字符(a)进⾏3区快速排序: 3区快速排序会把整个区分为3个区: 第⼀个区⾥的所有字符串的第三个字符都⽐(seashells)的第三个字符(a)⼩,它没有元素; 第⼆个区⾥的所有字符串的第三个字符都与(seashells)的第三个字符(a)相同,它含有a[2]~a[4]; 第三个区⾥的所有字符串的第三个字符都⽐(seashells)的第三个字符(a)⼤,它含有a[5]~a[6]; 然后从上往下的,先看第⼀个区,它没有字符串,此区排序完毕; 看第⼆个区,它有多个字符串,对此区的第⼀个字符串(seashells)的第四个字符(s)进⾏3区快速排序: 3区快速排序会把整个区分为3个区: 第⼀个区⾥的所有字符串的第四个字符都⽐(seashells)的第四个字符(s)⼩,它含有a[2]; 第⼆个区⾥的所有字符串的第四个字符都与(seashells)的第四个字符(s)相同,它含有a[3]~a[4]; 第三个区⾥的所有字符串的第四个字符都⽐(seashells)的第四个字符(s)⼤,它没有元素; 然后从上往下的,先看第⼀个区,它只有⼀个字符串,此区排序完毕; 看第⼆个区,它有多个字符串,对此区的第⼀个字符串(seashells)的第五个字符(h)进⾏3区快速排序: 3区快速排序会把整个区分为3个区: 第⼀个区⾥的所有字符串的第五个字符都⽐(seashells)的第五个字符(h)⼩,它没有元素; 第⼆个区⾥的所有字符串的第五个字符都与(seashells)的第五个字符(h)相同,它含有a[3]~a[4]; 第三个区⾥的所有字符串的第五个字符都⽐(seashells)的第五个字符(h)⼤,它没有元素; 然后从上往下的,先看第⼀个区,它没有字符串,此区排序完毕; 看第⼆个区,它有多个字符串,对此区的第⼀个字符串(seashells)的第六、七、⼋、九、⼗个字符(h)进⾏3区快速排序:(由于这两个字符串是⼀样的,排序结果不变,这⾥省略中间过程,直接到第⼗个字符的排序) 3区快速排序会把整个区分为3个区: 第⼀个区⾥的所有字符串的第五个字符都⽐(seashells)的第五个字符(h)⼩,它没有元素; 第⼆个区⾥的所有字符串的第五个字符都与(seashells)的第五个字符(h)相同,它含有a[3]~a[4]; 第三个区⾥的所有字符串的第五个字符都⽐(seashells)的第五个字符(h)⼤,它没有元素; 然后从上往下的,先看第⼀个区,它没有字符串,此区排序完毕; 看第⼆个区,它有多个字符串,但此区的第⼀个字符串(seashells)没有第⼗⼀个字符,故此区排序结束; 看第三个区,它没有字符串,此区排序完毕; 看下⼀个区,它有多个字符串,对此区的第⼀个字符串(sells)的第四个字符(l)进⾏3区快速排序: 3区快速排序会把整个区分为3个区: 第⼀个区⾥的所有字符串的第四个字符都⽐(sells)的第四个字符(l)⼩,它没有元素; 第⼆个区⾥的所有字符串的第四个字符都与(sells)的第四个字符(hl)相同,它含有a[5]~a[6]; 第三个区⾥的所有字符串的第四个字符都⽐(sells)的第四个字符(l)⼤,它没有元素; 然后从上往下的,先看第⼀个区,它没有字符串,此区排序完毕; 看第⼆个区,它有多个字符串,对此区的第⼀个字符串(sells)的第五、六个字符(h)进⾏3区快速排序:(由于这两个字符串是⼀样的,排序结果不变,这⾥省略中间过程,直接到第六个字符的排序) 3区快速排序会把整个区分为3个区: 第⼀个区⾥的所有字符串的第六个字符都⽐(sells)的第六个字符⼩,它没有元素; 第⼆个区⾥的所有字符串的第六个字符都与(sells)的第六个字符相同,它含有a[5]~a[6]; 第三个区⾥的所有字符串的第六个字符都⽐(sells)的第六个字符⼤,它没有元素; 然后从上往下的,先看第⼀个区,它没有字符串,此区排序完毕; 看第⼆个区,它有多个字符串,但此区的第⼀个字符串(sells)没有第七个字符,故此区排序结束; 看第三个区,它没有字符串,此区排序完毕; 看下⼀个区,它有多个字符串,对此区的第⼀个字符串(shells)的第三个字符(e)进⾏3区快速排序: 如此类推,直到所有区排序完毕。

微机原理实验报告(排序,计算)

微机原理实验报告(排序,计算)

《微机原理与接口技术实验报告》汇编语言循环结构程序设计一、实验目的1. 理解各种指令的功能。

2. 进一步学习程序的调试。

二、实验内容:1.编制程序,对这组数进行排序,并输出原数据及排序后数据; 2.利用DEBUG 调试工具,用D0命令,查看排序前后,内存数据的变化; 3.去掉最大和最小的两个值,求出其余值的平均值,并输出最大值,最小值和平均值; 4.用学过的压栈PUSH 和出栈POP 指令,将平均值按位逐个输出; 5.将平均值转化为二进制串,并将这组二进制串输出。

6. 所有数据输出前要用字符串的输出指令,进行输出提示(如:zui da zhi shi : 300等),所有数据结果能清晰地显示在屏幕上。

三、程序流程图四、程序清单DATA SEGMENTSR DB 100,?,50 DUP (?)VAR DW 5 DUP (0)AVG DW ?TEN DW 10P DW3D DW 2X DW?Y DW?MESG1 DB 13,10,'PLEASE INPUT:$'XS1 DB 13,10,'ORIGIN:$'XS2 DB 13,10,'NOW:$'XS3 DB 13,10,'MAX:$'XS4 DB 13,10,'MIN:$'XS5 DB 13,10,'AVG:$'XS6 DB 13,10,'AVG2:$'DATA ENDSSTACK SEGMENTDW 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA START: MOV AX,DATAMOV DS,AXMOV ES,AXMOV DX,OFFSET MESG1MOV AH,09HINT 21HLEA DX,SRCLDMOV CX,5LEA SI,SRADD SI,2LEA DI,VARIN_LOOP:MOV x, 0MOV Y,0_INX:MOV AH, 01HINT 21H;-------------------------------- CMP AL, '0'JB OKKCMP AL, 3AHJB SUB_30H;-------------------------------- JMP OKK;-------------------------------- SUB_30H:SUB AL, '0'MOV AH, 0MOV Y, AXMOV AX, xMUL TENADD AX, YMOV x, AXJMP _INX;-------------------------------- OKK:MOV AX,xSTOSWINC SILOOP IN_LOOP;-------------------------ORIGIN--- MOV DX,OFFSET XS1MOV AH,09HINT 21HMOV CX,5LEA SI,VARLOOPXS1:CALL XSLOOP LOOPXS1;-------------------------------CLDMOV CX,4MOV DX,1LOOPPX: CALL PXINC DXLOOP LOOPPX;----------------------------NOW-- MOV DX,OFFSET XS2MOV AH,09HINT 21HMOV CX,5LEA SI,VARLOOPXS2:CALL XSLOOP LOOPXS2;----------------------------MAX--- MOV DX,OFFSET XS3MOV AH,09HINT 21HLEA SI,VARADD SI,8CALL XS;-----------------------------MIN--- MOV DX,OFFSET XS4MOV AH,09HINT 21HLEA SI,VARCALL XS;-----------------------AVG------ MOV DX,OFFSET XS5MOV AH,09HINT 21HMOV AX,[SI]MOV BX,[SI+2]ADD AX,BXMOV BX,[SI+4]ADD AX,BXCWDIDIV PLEA SI,AVGMOV [SI],AXCALL XS;----------------------AVG2---------- MOV DX,OFFSET XS6MOV AH,09HINT 21HMOV CX,16LEA SI,AVGMOV AX,[SI]LPAVG: CWDSHR AX,1 ;to CFJB ONEMOV DX,0JMP PPONE: MOV DX,1PP: PUSH DXLOOP LPAVGMOV CX,16AVG2XS:POP DXADD DL,30HMOV AH,02HINT 21HLOOP AVG2XSEXIT: MOV AH,4CHINT 21HXS PROCLODSWMOV BX,1ZL1: CWDIDIV TENPUSH DXCMP AX,0JZ ZL2INC BXJMP ZL1ZL2: POP DXADD DL,30HDEC BXMOV AH,2INT 21HJNZ ZL2MOV DL,20HMOV AH,02HINT 21HRETXS ENDPPX PROCPUSH CXMOV CX,5SUB CX,DXMOV SI,0RECMP: MOV AX,VAR[SI]CMP AX,VAR[SI+2]JLE NOCHXCHG AX,VAR[SI+2]XCHG AX,VAR[SI]NOCH: ADD SI,2LOOP RECMPPOP CXRETPX ENDPCODE ENDSEND START五、运行结果按照实验要求,我们输入了“300,250,280,240,260,”。

字符及字符串输入输出与顺序程序设计实验微机

字符及字符串输入输出与顺序程序设计实验微机
字源自及字符串输入输出与顺序程序设计实验
一、实验预习
实验序号 3 实验题目 字符及字符串输入输出与顺 序程序设计实验 预习日期 2014/5/10
要求:1.实验目的;2.实验设备;3.实验内容及步骤;4.思考与练习
实验目的:1、学习和掌握字符及字符串的输入、输出方法。 2、掌握顺序程序的设计方法。 3、进一步掌握调试工具的使用方法。 实验设备:微型计算机 一台 实验预习要求:1、复习DOS功能调用中用于字符输入(功能号01H) 、字符输出(功能号为02H) 、字符串输(功 能号为0AH)以及字符串输出(功能号为09H)的调用方法。 2、复习BCD码运算调整指令AAA。 3、根据“实验内容及步骤 2”中给出的源程序框架,编写完整的源程序,以便实验时调试。 4、从“实验习题”中任选一道题目,编写源程序,以便上机调试。 实验内容及步骤: 从键盘输入两个1位十进制数,计算这两个数之和,并将结果在屏幕上显示出来。 ①.从键盘输入一个1位十进制数的方法。 通过功能号为1的DOS功能调用实现从键盘输入一个字符,格式如下: MOV AH,01H INT 21H ;此时程序等待用户键入,键入字符的ASCII码值存在AL中。
②.提示信息字符串的显示。 通过功能号为9的DOS功能调用实现字符串的显示,注意字符串的最后一个字符必需为‘$’。指令格式如下: MOV DX,OFFSET INFOR1 MOV AH,09H INT 21H ;INFOR1为在数据段中定义的要显示的字符串名。
③.非压缩型BCD码加法调整指令的使用。 设从键盘输入的数值已存放在寄存器AL,BL中,可用下列程序完成数据相加和调整操作: XOR ADD AAA AH,AH AL,BL ;执行该指令后,AH中为和的十位数,AL中为和的个位数

微机原理实验报告——字符串排序

微机原理实验报告——字符串排序

一、实验名称:字符串排序二、实验目的:⑴学习利用系统功能调用的“INT 21H”进行字符的输入、字符串的显示方法,熟悉排序相关指令及方法。

⑵掌握汇编语言的编写、编译、连接及运行方法。

三、实验内容:①利用INT 21H的1号功能,从键盘输入任意长度的字符串,以回车符结束。

②将输入的字符串存放在数据段中。

③对输入的字符串按ASCⅡ码从小到大排序(ASCⅡ码小者占低地址存放)。

④将排好序的字符串利用INT 21H的9号功能显示在微机屏幕上。

四、程序流程图:定义堆栈段、数据段分配各段调用输入程序,输入并存储一个字符NO输入是否为回车键YES冒泡法对存储单元中的内容排序使用INT 21H的9号功能,将排好序的字符串输出返回DOS五、结论:程序运行时,从键盘上输入包含数字、大、小写字母的字符串,回车后,屏幕上显示字符ASCⅡ码从小到大排列的结果。

六、实验心得:通过实验,首先,我进一步理解学习了冒泡法排序的具体过程:冒泡法的外层循环次数等于其排序总数减一,每层内循环次数等于外循环总数减去已执行的次数。

第二,在编写程序时,如若程序太长,最好将一段反复使用的程序段编成子程序,在主程序中反复调用即可。

第三,在使用INT 21H的各种功能时,要注意将功能号值付给AH,并需正确使用入口、出口参数。

最后,堆栈段、数据段使用时要特别注意,堆栈段必须重新定义,程序中使用数据段时也要对数据段进行重新定义,否则程序将产生错误。

附:程序清单STACK SEGMENT STACKDB 100 DUP(?)STACK ENDSDA TA SEGMENTX DB 100 DUP(?)DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TA,SS:STACKMAIN PROCMOV AX,DATAMOV DS,AXMOV SI,OFFSET XCALL INPUTSUB SI,2MOV BX,SINEXT3:MOV CX,BXMOV SI,OFFSET XNEXT2:MOV AL,[SI]CMP AL,[SI+1]JBE NEXT1XCHG AL,[SI+1]MOV [SI],ALNEXT1:INC SILOOP NEXT2DEC BXJNZ NEXT3MOV DX,OFFSET XMOV AH,9INT 21HMOV AH,4CHINT 21HMAIN ENDPINPUT PROCSTART:MOV AH,1INT 21HMOV [SI],ALINC SICMP AL,0DHJNZ STARTMOV BYTE PTR [SI-1],'$'RETINPUT ENDPCODE ENDSEND MAIN。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、实验名称:字符串排序
二、实验目的:
⑴学习利用系统功能调用的“INT 21H”进行字符的输入、字符串的显示方法,熟悉排
序相关指令及方法。

⑵掌握汇编语言的编写、编译、连接及运行方法。

三、实验内容:
①利用INT 21H的1号功能,从键盘输入任意长度的字符串,以回车符结束。

②将输入的字符串存放在数据段中。

③对输入的字符串按ASCⅡ码从小到大排序(ASCⅡ码小者占低地址存放)。

④将排好序的字符串利用INT 21H的9号功能显示在微机屏幕上。

四、程序流程图:
定义堆栈段、数据段
分配各段
调用输入程序,输入
并存储一个字符
NO
输入是否
为回车键
YES
冒泡法对存储单元中
的内容排序
使用INT 21H的9号功能,
将排好序的字符串输出
返回DOS
五、结论:
程序运行时,从键盘上输入包含数字、大、小写字母的字符串,回车后,屏幕上显示字符ASCⅡ码从小到大排列的结果。

六、实验心得:
通过实验,首先,我进一步理解学习了冒泡法排序的具体过程:冒泡法的外层循环次数等于其排序总数减一,每层内循环次数等于外循环总数减去已执行的次数。

第二,在编写程序时,如若程序太长,最好将一段反复使用的程序段编成子程序,在主程序中反复调用即可。

第三,在使用INT 21H的各种功能时,要注意将功能号值付给AH,并需正确使用入口、出口参数。

最后,堆栈段、数据段使用时要特别注意,堆栈段必须重新定义,程序中使用数据段时也要对数据段进行重新定义,否则程序将产生错误。

附:程序清单
STACK SEGMENT STACK
DB 100 DUP(?)
STACK ENDS
DA TA SEGMENT
X DB 100 DUP(?)
DA TA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DA TA,SS:STACK
MAIN PROC
MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET X
CALL INPUT
SUB SI,2
MOV BX,SI
NEXT3:MOV CX,BX
MOV SI,OFFSET X
NEXT2:MOV AL,[SI]
CMP AL,[SI+1]
JBE NEXT1
XCHG AL,[SI+1]
MOV [SI],AL
NEXT1:INC SI
LOOP NEXT2
DEC BX
JNZ NEXT3
MOV DX,OFFSET X
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
MAIN ENDP
INPUT PROC
START:MOV AH,1
INT 21H
MOV [SI],AL
INC SI
CMP AL,0DH
JNZ START
MOV BYTE PTR [SI-1],'$'
RET
INPUT ENDP
CODE ENDS
END MAIN。

相关文档
最新文档