汇编课程设计排序
汇编冒泡法排序

汇编实验报告实验题目:从键盘输入任意5个2位有符号十进制数,采用“冒泡法”进行升序排序,输出排序后的结果,并输出排序次数。
实验设计:实验要求用16位机的汇编语言完成,键盘上输入的的数据最终都会以ASCII码形式接受,输出也要求用ASCII码,因而我决定设计专门负责输入和输出的两个子程序。
但是由于要求输入的是有符号的而且是长度不一定不确定的十进制数,用一个子程序直接在输入时转换成二进制会比较麻烦,因而决定可以先以字符串的形式接受来自用户的数据,这样可以以最自由的形式接受数据,不仅数据长度问题可以解决,带不带‘+’‘-’符号也可以识别,而且方便查错。
排序的主要部分是比较简单的,学C的时候已经了解,况且数据结构课又重复了一遍,因而本次实验主要需要解决的还是输入输出、以及数据的转化问题。
我的程序结构比较简单,主要包含几个子程序:GET : 调用10号模块接收一串字符,放进缓存dataEXDTB:解析缓存中的符号数据,转化为二进制并存入数组ansEXBTD:对从BX传过来的二进制数解析,并在屏幕上输出相应的十进制数,无运算结果程序:DATAS SEGMENTDATA DB 21 DUP('$')ANS DW 10 DUP(0)TES DB 'RUN HRER','$'LEN DW 0TMP DW 0SIG DW 00HSTA DW 00H ;STA ANS[STA] IS DIGENT DB 0DH,0AH,'$'RNM DB 'READ 5 DIGITALS',0AH,0DH,'$'PRIT DB 'PAIXU:',0AH,0DH,'$'FINSH DB 'NEW ORDER:','$'EORR DB 'INPUT ERROR!',0AH,0DH,'$'CISHU DB 'EXCHANGE TIME:',0DH,0AH,'$'CIS DW 0EXIT DB 'ENTER A NUMBER TO EXIT',0AH,0DH,'$'DATAS ENDSSTACK SEGMENTTOPE DW 300H DUP(0)STACK ENDSCODES SEGMENTASSUME CS:CODES, DS:DATAS,SS:STACKSTART: ;先跳过写在开头的子程序MOV AX,DATASMOV DS,AXMOV AX,STACKMOV SS,AXMOV SP,00HJMP SART ;AH=09 OUPUT AH=10 INPUT,前面注意有两个字节没用从ds:dx+2开始才是 ;第一个是输入及字符数ENTE PROC ;ENTE DISPLAY '/N' ON THE SCREENPUSH AXPUSH DXMOV AX,OFFSET ENTMOV DX,AXMOV AH,09HINT 21HPOP DXPOP AXRETENTE ENDPGET PROC ;PROC GET READ A TWO BIT DIGITAL FROM USCERPUSH AX ;;DX HAS ADDRESSPUSH DXMOV DX,OFFSET DATAMOV AH,0AH ;GET A LINE OF NUMBERINT 21H;CALL ENTEPOP DXPOP AXRETGET ENDPEXDTB PROC ;PROC EXCHANGE SIGNED DIGITAL TO BINARYPUSH AXPUSH BXPUSH CXPUSH DX ;USE DX TO STORE ANS;ANS[STA] HAS RESULT XOR DX,DXXOR CX,CXMOV BX,OFFSET DATAINC BX ;DS:DX+1 IS THE NUMBER OF INPUTED CHAR MOV CL,[BX] ;cl HAS LENGTHXOR CH,CHINC BX ;NOW BX COME TO FIRST CHAR INPUTEDMOV AL,[BX]CMP AL,'-' ;TO CHECK IF IT IS SIGNJNZ POST ;WITHOUT '-',THAT WILL BE POSTIVEMOV WORD PTR[SIG], 0001H ;SET SIG 0001H IF NEGETIVE JMP SIGNEDPOST:MOV SIG,WORD PTR 0000H ;SET POSTIVECMP AL,'+' ;IF IT HAS '+',IGNORE ITJNE PASSSIGNED:INC BXSUB CX,01HJMP STLOP ;PASS THE SIGN + -PASS: ;DIRECTLY TO NUMBERSCMP AL,'0' ;IF IT IS NUMBERJL NOTHINGCMP AL,'9'JG NOTHINGMOV DL,ALSUB DL,'0'CMP CL,1JE POSTYSUB CX,01HSTLOP:MAINLOOP:MOV AL,[BX]SUB AL,'0'JS NOTHING ;JUMP IF AL-'0'< 0 , ILLEAGLE INPUT CMP AL,09H ;JUMP IF AL-'9'> 0 ,JG NOTHINGMOV DH,DL ;SHIFT DL TO TIMES 10SHL DH,01H ;SHIFT 2 TIMES 4SHL DH,01H ;DL=DL*4+DL=5*DLADD DL,DHSHL DL,01H ;DL=5*DL*2=10*DLADD DL,ALINC BXLOOP MAINLOOPTEST SIG,0001HJZ POSTY ;JUMP TO AVOID -DXNEG DLPOSTY:MOV BX,OFFSET ANSADD BX,STAMOV AL,DLCBWMOV [BX],AXJMP DONENOTHING: ;IF NOT NUMBER , RETURN 0MOV DX,OFFSET EORRMOV AH,09HINT 21HMOV BX,OFFSET ANSADD BX,STAMOV [BX],WORD PTR 0001HDONE:CALL ENTEPOP CXPOP BXPOP AXRETEXDTB ENDPEXBTD PROC ;PROC EXCHANGE BINARY NUMBER IN BX TO DIGITAL PUSH AXPUSH BXPUSH CXPUSH DXCALL ENTE ;DISPLAY '/N'TEST BX,8000HJZ POSTVMOV DL,'-'MOV AH,02HINT 21HNEG BX ;EXCHANGE TO POSTIVEPOSTV:MOV CX,1111HPUSH CXMOV AX,BXCWDMOV BX,10MLOOP:DIV BX ;DIV 10PUSH DX ;PUSH BX MOD 10CWDADD AX,00HJNZ MLOOPDSLOOP: ;DISPLAY NUMPOP DXCMP DX,1111HJE FINISHADD DL,'0'MOV AH,02HINT 21HJMP DSLOOPFINISH:;CALL ENTEPOP DXPOP CXPOP BXPOP AXRETEXBTD ENDPSART:MOV DX,OFFSET PRITMOV AH,09HINT 21HMOV DX,OFFSET RNMMOV AH,09INT 21HMOV CX,05HMOV WORD PTR[STA],0000HGETLOOP:CALL GET ;读入符号数CALL EXDTB ;转为二进制ADD WORD PTR[STA],0002H;存入数组ans LOOP GETLOOPMOV WORD PTR[CIS],00HARRAGE: ;排序MOV CX,05HSUB CX,0001HMOV BX,OFFSET ANSADD BX,CXADD BX,CXLOOP1:MOV TMP,CXPUSH BXLOOP2:MOV AX,WORD PTR[BX]SUB BX,0002HMOV DX,WORD PTR[BX]CMP AX,DXJNS BIGGERINC WORD PTR[CIS]MOV WORD PTR[BX],AXMOV 02H[BX],DXBIGGER:SUB WORD PTR[TMP],0001H JNZ LOOP2POP BXLOOP LOOP1WRITE: ;输出排好序的数MOV DX,OFFSET FINSHMOV AH,09HINT 21HMOV CX,05MOV WORD PTR[STA],0000HMOV BX,OFFSET ANSLOOPWR:PUSH BXADD BX,STAMOV DX,[BX]MOV BX,DXCALL EXBTDPOP BXADD WORD PTR[STA],0002HLOOP LOOPWRCALL ENTEMOV DX,OFFSET CISHUMOV AH,09HINT 21HMOV BX,[CIS]CALL EXBTDCALL ENTEMOV DX,OFFSET EXITMOV AH,09HINT 21HCALL GETMOV AX,4C00HINT 21HCODES ENDSEND START问题及调试:主要问题是数据的转化,当我们用C写程序时,直接可以用%开头的格式命令进行特定类型的数据输入输出,但是用汇编时就没有那么好办了,输入的时候要识别数据,输出也要转化数据。
汇编实验之字符串的排序

汇编实验之字符串的排序计算机原理实验室实验报告课程名称:计算机语言与汇编原理姓名学号班级成绩设备名称及软件环境实验名称汇编语言实现字符串排序(冒泡排序)实验日期一.实验内容利用汇编语言实现字符串排序,输出,查找等功能二.理论分析或算法分析在汇编语言中,需要调用外部模块(子程来/函数)来完成部分功能,调用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.对原有需要比较的字符串检查其输入的完整性,和正确性。
汇编第8章排序及其算法

第8章排序及其算法由上一章的讨论可知,无论是有序顺序检索表还是二叉检索树,记录在检索表中按关键字有序(递增或递减)排列,从而可以采用效率较高的检索算法。
排序的目的是将一组无序的记录整理成按关键字的大小有序的序列。
8.1排序的基本概念假设有n个记录的序列{R1,R2,…Rn},其相应的键值序列为{K1,K2,…Kn}。
将这些记录重新排列为{Rj1,Rj2,…Rjn},使得相应的键值满足Kj1≤Kj2≤…≤Kjn(升序),或满足Kj1≥Kj2≥…≥Kjn(降序),这种运算过程称为排序。
若待排序的记录序列中存在多个记录具有相同的键值,经排序后这些记录的相对次序仍然保持不变,则称这种排序是稳定的;否则,称这种排序是不稳定的。
按照排序过程中是记录存储的设备不同,分为内部排序(全部记录存放于内存)和外部排序(数据的主要部分存放于外存)。
本章仅限于讲述内部排序。
在没有特别说明时,本章讲述的各种排序方法,均以升序排序为例,且以顺序表作为存储结构。
记录结点的数据类型为:typedefstruct node{ keytp key;elemtp data;}listnode;排序算法的时间效率(时间复杂度)取决于两种基本操作的重复次数:记录关键字的比较记录的交换8.2插人排序基本思想:将一个记录插入到有序表中,从而得到表长度增1的有序表。
经过n-1趟这种方式的插入后完成排序。
寻找插入位置方法的不同决定算法的效率。
8.2.1直接插人排序void sort_direct_instert(listnode *L, int n){ int i,j;listnode temp;for (i=1;i<n;i++) // n-1趟插入{ temp=L[i]; // 暂存待排记录j=i-1;while((j>=0)&&(temp.key<L[j].key)) // 顺序查找插入点,记录后移{ L[j+1]=L[j];j--;}L[j+1]=temp; // 插入待排记录}}直接插人排序算法的时间复杂度:O(n2)。
汇编语言中的排序方法

冒泡排序基本算法:①予置数组指针和比较次数;②比较相邻二元素,若前者低于或等于后者,则不交换,否则交换;③修改数组指针,若未比较完,则转向②继续比较;④修改扫描次数,若尚未排好,则转向①进行下一次扫描。
冒泡程序过程示例:源程序:ARRAY DB80,60,100,50,90,70 N EQU 6SORT:MOV DX,N-1PASS: MOV BX,OFFSET ARRAYMOV CX,DXXOR AH,AHCOMP:MOV AL,[BX]CMP AL,[BX+1]JBE NOEXCHXCHG AL,[BX+1]MOV [BX],ALINC AHNOEXCH:INC BXLOOP COMPCMP AH,0JE DONEDEC DXCMP DX,0JNE PASSDONE:…选择排序基本算法:①在排序范围内,找出最小值,与范围内的第一个元素交换;②修改排序范围,若排序范围大于1,则转到①继续排序过程,否则排序结束。
源程序为:ARRAY DB80,60,100,50,90,70 N EQU 6SORT:MOV SI,0INIT:MOV BX,SIMOV AL,ARRAY[BX]MOV DI,SISELECT:INC DICMP AL,ARRAY[DI]JBE NOUPDAMOV BX,DIMOV AL,ARRAY[BX] NOUPDA:CMP DI,N-1JB SELECTCMP BX,SIJE NOEXCHXCHG AL,ARRAY[SI]MOV ARRAY[BX],AL NOEXCH:INC SICMP SI,N-1JB INITDONE:……。
设计各种排序课程设计

设计各种排序课程设计一、课程目标知识目标:1. 让学生掌握基本的排序算法原理,包括冒泡排序、选择排序和插入排序。
2. 能够理解各种排序算法的时间复杂度和空间复杂度,并分析其优缺点。
3. 学会运用排序算法解决实际问题,如对数据列表进行排序。
技能目标:1. 培养学生运用计算机编程实现排序算法的能力。
2. 培养学生通过分析问题,选择合适的排序算法解决问题的能力。
3. 提高学生的逻辑思维能力和解决问题的能力。
情感态度价值观目标:1. 培养学生对算法学习的兴趣,激发学生主动探索的精神。
2. 培养学生合作学习、分享成果的团队意识。
3. 增强学生面对问题时的自信心,养成勇于克服困难、积极进取的良好品质。
分析课程性质、学生特点和教学要求,将课程目标具体分解如下:1. 学生能熟练描述冒泡排序、选择排序和插入排序的原理及实现过程。
2. 学生能通过实际操作,编写代码实现这三种排序算法,并对算法性能进行简单分析。
3. 学生能够结合实际问题,选择合适的排序算法进行解决。
4. 学生在课程学习过程中,表现出积极的合作态度和良好的沟通能力。
5. 学生通过课程学习,增强对计算机科学的兴趣和热情,培养正确的价值观。
本章节教学内容围绕课程目标,结合教材相关章节,具体安排如下:1. 排序算法原理:- 冒泡排序:介绍冒泡排序的基本原理,通过实际案例进行分析。
- 选择排序:阐述选择排序的核心思想,结合实例进行讲解。
- 插入排序:讲解插入排序的基本步骤,以及如何实现。
2. 排序算法性能分析:- 时间复杂度:介绍时间复杂度的概念,分析三种排序算法的时间复杂度。
- 空间复杂度:解释空间复杂度的含义,对比三种排序算法的空间复杂度。
3. 编程实践:- 编写代码:指导学生利用编程工具,实现冒泡排序、选择排序和插入排序。
- 性能测试:通过设计测试用例,分析排序算法的性能。
4. 实际应用:- 问题分析:针对实际问题,指导学生如何选择合适的排序算法。
- 解决方案:讨论并实现解决问题的方案。
新版汇编语言程序设计 顺序程序设计

成功学院信工系
张莉
.model语句必须位于所有段定义语句之前, 堆栈段伪指令.STACK[大小]创建一个堆栈段, 用于定义存储模式,通常使用small模式,但 默认所占存储空间为1KB。 对于.com程序,则应采用tiny模式。 .STARTUP .model small TINY 数据段伪指令.data创建一个数据段。 按照CPU类型、存储模式、操作系统和堆栈类 .stack SMALL 型,产生程序开始执行的代码;同时还指定程序 代码段伪指令.code [段名]创建一个代码段。 .data 开始执行的起始点 COMPACT . EXIT [返回参数] 在DOS下,还将设置DS值,调整SS和SP值 … 产生终止程序执行返回操作系统的指令代码。 MEDIUM 它的可选参数是一个返回的数码,通常用0表 .code 示没有错误。 LARGE
成功学院信工系
张莉
1 DOS的程序结构 com程序
COM程序是一种将代码、数据和堆栈段合一的结构紧凑 的程序,所有代码、数据都在一个逻辑段内,不超过64KB 在程序开发时,需要满足一定要求并采用相应参数才能 正确生成COM结构的程序 COM文件存储在磁盘上是主存的完全影象,不包含重新 定位的加载信息,与EXE文件相比其加载速度更快,占用的 磁盘空间也少 尽管DOS也为COM程序建立程序段前缀PSP,但由于两种 文件结构不同,所以加载到主存后各段设置并不完全一样
第3讲 顺序程序设计
掌握简化段定义格式,了解完整段定义格式。 熟悉汇编语言程序的开发流程。
成功学院信工系
张莉
第3讲 顺序程序设计
1
DOS的程序结构
2 简化段定义格式
3 完整段定义格式
4 顺序程序设计
成功学院信工系
用汇编对学生-学号-成绩排序

用汇编对学生-学号-成绩排序华北科技学院综合性实验报告课程名称汇编语言实验学期 XXXX 至 XXXX 学年第 X 学期学生所在系部计算机学院网络工程系年级 XXX 专业班级网络XXX班学生姓名 XXXX 学号 XXXXXXXXXXXXXXX 任课教师李冬艳实验成绩计算机学院制《汇编语言》课程综合性实验报告开课实验室:基础实验室二日期:XXXXXXXX2、程序的设计: 流程图提示所有数据录入必须有合法性判断。
键盘输入录入数据,根据录入数据满足以下要求,一是,必须是数字,二是,不能为0,小于9,这里是当一个数字为一个来处理的。
宏定义:宏定义主要用于将字符串进栈这一重复的过程中。
子程序键盘=0? 跳转到显示<=9跳转到跳转到跳转到显示ERROR 结束程序否否是 是子程序键盘进栈显示输入字排序:子程序NEXT 键盘输CX,BX,COUNT BUFF 地址传送COUNT 赋值给DI 自加2 Count 是 转到BX=COUNT 的COUNT 逻辑左AX= [BUFF+BX-4] [BUFF+BX]=AXAX=[BUFF+BX-2][BUFF+BX+2]=AXBH=[DI 转到BIG转到SAMLL DI 自加2 CX 自减1 转到P2CX 进栈 DI 自加1BH=[转到BIG2高低于等三、实验心得体会:本学期开设了汇编语言这门课程。
在课程的最后,我们迎来了汇编大实验。
在本学期的学习和做综合实验的过程中。
这学期通过学习汇编程序设计,是我认识到它是计算机语言里的第一个语言。
它有优点也有缺点,优点是它实际上是你计算机处理器实际运行的指令的命令形式表示法。
这意味着你将与处理器的底层打交道,比如寄存器和堆栈,能编写出比任何其他语言能实现的快得多的程序。
缺点是难学、语法晦涩、坚持效率,造成大量额外代码,移植性:接近零。
因为这门语言是为一种单独的处理器设计的,根本没移植性可言。
通过对这程序的制作,使我对汇编语言的基本知识的使用更加熟练,同时也增加了我对汇编语言的一些认识,在作业完成过程中通过和同学的交流,也增加了合作的技巧。
计算机组成原理与汇编原理课程设计(名字排序)

课程设计报告课程名称:计算机组成原理与汇编语言报告题目:汇编语言名字排序学生姓名:所在学院:信息科学与工程学院专业班级:指导教师:2013 年6月26 日摘要汇编语言是直接面向处理器(Processor)的程序设计语言,处理器是在指令的控制下工作的,处理器可以识别的每一条指令称为机器指令。
每一种处理器都有自己可以识别的一整套指令,称为指令集。
处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己内部的工作状态,也能控制其它外围电路的工作状态。
汇编语言的排序,方法有许多,最常见的冒有泡排序、快速排序等等,冒泡排序的方法在软件开发中运用的十分广泛,其运行的效率很高,是排序问题的首选,这项目的排序我也采用冒泡排序,根据字母的先后顺序排列,然后显示出来。
关键词:处理器;指令;排序目录一、课题分析 (1)二、需求分析 (2)1.功能描述 (2)2. 功能模块分析………………………………………………………三、设计方案 (3)1.系统流程图 (3)2.子程序模块设计 (3)3. 详细设计 (3)4.程序调试结果及分析 (4)四、结论与心得 (6)五、参考文献 (6)一、课题分析用汇编语言进行人名排序其核心就是按照人名的字母的顺序进行排序,在此我用的是冒泡排序法。
整个设计思路就是:首先是输入所有的名字,然后把所有的名字放到Nametab表中,然后就是在表中对所有的名字运用冒泡排序法进行排序,先比较相邻的元素。
如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,在这一点,最后的元素应该会是最大的数,针对所有的元素重复以上的步骤,除了最后一个,持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字或字符串需要比较。
最后就是通过k10dispz子程序把排好序的名字输出。
二、需求分析1.功能描述1.从键盘输入人的名字并且显示出来。
2. 建立一个表用来存放所有名字。
用汇编语言编写的排序程序

用汇编语言编写的排序程序一实验目的 (3)二题目 (3)三算法分析 (3)四流程图及算法 (5)五源程序附录a、参考文献一实验目的:1、进一步熟悉汇编语言的代码;2、学会分析算法并构造流程图;3、能够完成简单的子程序设计;4、学会查找程序的算法。
二题目将以地址DATA开始的10个无符号字数据按从大到小的顺序重新排列三算法分析排序算法采用冒泡法,假定待排序数组中有X1,X2,X3,…X10共十个无符号数据,冒泡排序法的具体做法是:最多有九次外循环。
每次外循环均从底部开始进行两两比较,若后者大于前者,两者位置交换,反之不变。
然后两两比较向前推移,直到本次外循环应完成的两两比较次数(成为内循环次数达到为止)。
此时,本次外循环结束,最大的数冒到本次外循环的顶部。
第一次外循环,第一次外循环,两两比较的次数为n-1次,最大数据冒到X1的位置;第二次外循环,两两比较次数为n-2次,剩余最大数据冒到X2位置;以此类推,第n-1次外循环,两两比较次数为1次,剩余最大数据项冒到X n-1的位置。
若再一次外循环结束后,经判断本次外循环一次位置交换也未发生过或仅在底部发生过一次交换,则本次外循环结束,数的顺序已排妥,余下的外循环不用进行了。
流程图如上所示。
根据流程图编写程序:如下:;程序模板SSEG SEGMENT PARA STACK 'stack'dw 100h dup(0) ;初始化堆栈大小为100SSEG ENDSDSEG SEGMENTDATA DW 150,12,54,89,73,152,45,68,98,65COUNT EQU $-DATABUFO DB 6 DUP (?),'$'DSEG ENDSESEG SEGMENT;附加段:在此处添加程序所需的数据ESEG ENDSCSEG SEGMENTassume cs:CSEG, ds:DSEG, es:ESEG, ss:SSEGDISP PROC ;显示DI所指ASCII字符串的子程序PUSH DXPUSH AXMOV DX,DIMOV AH,09HINT 21HMOV DL,','MOV AH,2INT 21HPOP AXPOP DXRETDISP ENDPDATCH PROC FAR ;转换数值成为ASCII串的子程序PUSH DX ;入口参数在AX中,要转换的数在DI中 PUSH CX ;出口参数在DI中,是结果缓冲区指针 PUSH BXMOV CX,10MOV BX,AXDLOP1:DEC DIXOR DX,DXDIV CXOR DL,30HMOV [DI], DLCMP AX,0JNZ DLOP1POP BXPOP CXPOP DXRETDATCH ENDPMAIN PROC FAR ;主程序入口mov ax, dsegmov ds, axmov ax,esegmov es, axSTART:XOR AX,AXMOV DX,AX ;主程序MOV CX,AXMOV DX,COUNT/2 ;DX,被排序数据个数LOP1: DEC DX ;DX,大循环变量(大循环次数)MOV CX,DX ;CX,小循环变量(两两比较次数) MOV BX,DX ;设置交换标志LEA SI,BUFOSUB SI,2LOP2: MOV AX,[SI]CMP AX,[SI-2]JBE PASSXCHG [SI-2],AXMOV [SI],AXMOV BX,CXPASS: SUB SI,2LOOP LOP2CMP BX,DXJE DLAST ;数的顺序已排妥,转DLASTJMP LOP1DLAST:MOV CX,COUNT/2 ;显示的数据个数LEA SI,DATA ;数据的缓存区首地址LOP3: MOV AX,[SI]MOV DI,OFFSET BUFOADD DI,LENGTH BUFOCALL DATCHCALL DISPADD SI,2LOOP LOP3mov ah,1int 21hmov ax, 4c00h ;程序结束,返回到操作系统系统int 21hMAIN ENDPCSEG ENDSEND MAIN结果:。
汇编实验2顺序程序设计

汇编实验2顺序程序设计汇编实验⼆顺序结构程序设计实验⽬的:(1)掌握汇编语⾔程序上机过程。
(2)掌握顺序结构程序调试的⽅法。
实验内容:调试查表程序内存中⾃TABLE开始的七个单元中连续存放着⾃然数0~6的⽴⽅值(⽴⽅值表),任⼀个数X(0≤X≤6)在FIRST单元中,要求查表找出X的⽴⽅值,存SECOND单元。
准备⼯作:1.进⼊D:2.建⽴⼀个⽂件夹hb, 即d:\hb3.将MASM和LINK复制到该⽂件夹中4.单击“开始”-“程序”-“附件”-“命令提⽰符”5.输⼊“d:\”6.输⼊“cd hb”操作步骤:1.输⼊源程序: EDIT d:\hb\cb.asm在EDIT编辑环境File菜单下选择Save存盘,选择Exit退出编辑环境2.汇编源程序A>MASM CB↙Microsoft (R) Macro Assembler Version 5.10Copyright (C) Microsoft Copr 1981,1988 All rights reserved.Object filename [CB.OBJ]:_↙Source listing [NUL.LST]:↙Cross-reference [NUL.CRF]:↙51394+389950 Bytes symbol space free0 Warning Errors0 Severe ErrorsA>3.连接⽬标程序A>LINKMicrosoft (R) Overlay Linker Version 3.64Copyright (C) Microsoft Corp 1983-1988. All rights reserved.Object Modules [.OBJ]:CB↙Run File [NUL.MAP]:↙Libraries [.LIB]: ↙显⽰0个错误才能进⾏下⼀步LINK操作4.执⾏程序A>B没有任何结果输出,原因是程序中没有安排显⽰输出,结果保存在内存单元中。
汇编排序

实验11 排序实验一、实习目的掌握用汇编语言编写程序的思路和方法。
二、实习内容从首地址为1000H开始存放10个数,要求设计程序将这些数由小到大排序,排序后的数仍放在原地址处。
DA TA SEGMENTORG 1000HA DB 100,30,10,23,28,56,80,55,34,72STR1 DB 'The array A is:$'STR2 DB 'After sort is:$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DA TAMOV DS,AXMOV DX,OFFSET STR1CALL PRINTSTRCALL CLFCALL LOOKCALL SORTMOV DX,OFFSET STR2CALL PRINTSTRCALL CLFCALL LOOKJMP STOPLOOK:MOV DH,0ahMOV BX,0MOV CL,4LOOP1: ;显示一个数字的ASCII码MOV AL,A[BX]MOV AH,0ROL AL,CLAND AL,0FHADD AL,30HCMP AL,3AHJL TO1ADD AL,7HTO1:CALL PRINTMOV AL,A[BX]AND AL,0FHADD AL,30HCMP AL,3AHJL TO2ADD AL,7HTO2:CALL PRINTCALL CLFINC BXDEC DHJNZ LOOP1RETSORT:MOV CX ,10DEC CXLOOP3:MOV DI ,CXMOV BX,0LOOP2: MOV AL,A[BX]CMP AL,A[BX+1]JL COTINUEXCHG AL,A[BX+1]MOV A[BX],AL COTINUE: ADD BX,1LOOP LOOP2MOV CX,DILOOP LOOP3RETPRINT: MOV DL,ALMOV AH,02HINT 21HRETPRINTSTR:MOV AH,09HINT 21HRETSTOP: MOV AH,4CHINT 21HCLF: MOV AH,02HMOV DL,0DHINT 21HMOV DL,0AHINT 21HRETCODE ENDSEND STARTDA TA SEGMENTDATA1 DB ?DATA2 DB "PLEASE INPUT NUMBER:$"DATA3 DB "THE REASURT IS:$"DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART:MOV AX,DATAMOV DS,AXMOV DX,OFFSET DA TA2MOV AH,09H ;屏幕显示data2中的字符串INT 21HMOV AH,01HINT 21H ;键盘输入并显示MOV DATA1,ALMOV DL,0DH ;回车换行MOV AH,02H ;屏幕显示一个字符INT 21HMOV DL,0AH ;字符串输入功能调用MOV AH,02HINT 21HMOV AL,DATA1 ;键盘上输入的字符存入ALCMP AL,65 ;AJB CEND ;无符号小于则跳CMP AL,90 ;ZJBE PRINT ;无符号小于等于则跳CMP AL,97 ;aJB CENDCMP AL,122 ;zJBE CHANGEJMP CENDCHANGE: SUB AL,20HMOV DATA1,ALPRINT: MOV DX,OFFSET DA TA3 ;屏幕显示data3中的字符串MOV AH,09HINT 21HMOV AL,DATA1 ;键盘上输入的字符存入ALMOV DL,ALMOV AH,02HINT 21HCEND:MOV AX,4C00HINT 21HCODE ENDSEND START。
各种排序问题课程设计

各种排序问题课程设计一、教学目标本节课的教学目标是让学生掌握各种排序算法的原理和实现,能够根据实际情况选择合适的排序算法,提高编程解决问题的能力。
具体来说,知识目标包括了解排序的基本概念、掌握冒泡排序、选择排序、插入排序等基本排序算法,以及了解快速排序、归并排序等高级排序算法的原理和实现。
技能目标包括能够编写程序实现各种排序算法,能够分析程序的的时间复杂度,提高代码优化能力。
情感态度价值观目标包括培养学生的团队协作意识,增强学生对计算机科学事业的热爱,提高学生解决实际问题的能力。
二、教学内容本节课的教学内容主要包括排序的基本概念、各种排序算法的原理和实现、排序算法的应用等。
具体来说,首先介绍排序的基本概念,包括排序的定义、排序的分类等;然后介绍冒泡排序、选择排序、插入排序等基本排序算法,包括它们的原理、实现和时间复杂度分析;接着介绍快速排序、归并排序等高级排序算法,包括它们的原理、实现和时间复杂度分析;最后介绍排序算法在实际中的应用,如数据排序、搜索等。
三、教学方法为了达到本节课的教学目标,我们将采用多种教学方法,包括讲授法、案例分析法、实验法等。
首先,通过讲授法向学生传授排序的基本概念、算法原理和实现方法;然后,通过案例分析法分析实际问题,让学生学会如何选择合适的排序算法解决问题;接着,通过实验法让学生动手编写程序,加深对排序算法的理解和掌握;最后,通过小组讨论法让学生互相交流学习,提高团队协作能力和解决问题的能力。
四、教学资源为了支持本节课的教学内容和方法,我们将准备多种教学资源,包括教材、参考书、多媒体资料、实验设备等。
首先,教材和参考书将作为主要的学习材料,为学生提供系统的排序算法知识;其次,多媒体资料如PPT、视频等将用于辅助讲解和展示,增强学生的学习兴趣;最后,实验设备如计算机、网络等将用于实践操作,让学生动手实践,提高编程能力。
五、教学评估本节课的教学评估将采用多元化的评估方式,以全面、客观、公正地评价学生的学习成果。
汇编课程设计报告字符排序

汇编课程设计报告字符排序一、课程目标知识目标:1. 让学生掌握字符排序的基本概念,理解其在汇编语言编程中的应用;2. 使学生学会使用汇编语言编写简单的字符排序程序;3. 引导学生了解字符排序算法的优化方法。
技能目标:1. 培养学生运用汇编语言进行字符排序编程的能力;2. 培养学生分析、解决字符排序问题的逻辑思维能力;3. 提高学生运用所学知识解决实际问题的能力。
情感态度价值观目标:1. 培养学生对汇编语言的兴趣,激发学生学习编程的热情;2. 培养学生团队合作精神,学会共同探讨、分析问题;3. 增强学生的自信心,让学生体会到编程带来的成就感。
课程性质:本课程为信息技术学科,针对有一定汇编语言基础的学生,以实践操作为主,理论讲解为辅。
学生特点:学生具备一定的汇编语言知识,对编程有一定兴趣,但可能缺乏实际编程经验。
教学要求:结合学生特点,注重实践操作,引导学生通过动手实践掌握字符排序编程方法,并在实践中提高编程能力。
同时,关注学生的情感态度,激发学生的学习兴趣,培养团队合作精神。
在教学过程中,将课程目标分解为具体的学习成果,以便进行有效的教学设计和评估。
二、教学内容1. 理论知识:- 汇编语言字符排序的基本概念;- 字符排序算法的原理和分类;- 汇编语言中的字符串处理指令。
2. 实践操作:- 编写简单的字符排序程序;- 分析字符排序算法的性能和优化;- 实际案例:对一串字符进行排序并输出结果。
3. 教学大纲:- 第一阶段:汇编语言字符排序基本概念和算法原理学习;- 第二阶段:字符串处理指令的掌握及简单排序程序的编写;- 第三阶段:分析优化字符排序算法,提高程序性能;- 第四阶段:综合运用所学知识,完成实际案例。
4. 教学内容安排与进度:- 理论知识:共计4课时,每课时讲解一个知识点;- 实践操作:共计4课时,每课时完成一个阶段的实践任务;- 案例分析与讨论:共计2课时,对案例进行讨论、分析、优化。
5. 教材章节关联:- 本教学内容与教材中关于汇编语言字符串处理和排序算法的章节相关;- 教材中的相关案例和练习题可用于辅助教学,巩固所学知识。
汇编排序程序

用汇编语言编写一个程序,要求输入数据,并按照从小到大的顺序排序显示出来。
data segmentnum dw 20 dup(?);存输入数列i dw 0 ;数列个数char db 0dh,'xiao--->da:',0ah,0dh,'$'rec db 5 dup(?) ;输出缓存data endscode segmentmain proc farassume cs:code,ds:datastart:push dsmov ax,datamov ds,axmov si,0mov bx,0call inputzcall orderzcall outputzmain endpinputz procinput:mov ah,01hint 21hcmp al,20h;遇到空格写数据jz write1cmp al,0dh;遇到回车写最后一个数据jz write2sub al,30hmov cl,almov ch,00hmov ax,bxmov bx,0ahmul bxmov bx,axadd bx,cxjmp inputwrite1: ;write the numbers before Spaceadd si,2inc imov bx,0jmp inputwrite2:mov [num+si],bxadd si,2inc imov dl,0ahmov ah,02hint 21hretinputz endporderz procbeforeorder:mov cx,idec cxloop1:mov di,cxmov bx,0loop2:mov ax,num[bx]cmp ax,num[bx+2]jbe continuexchg ax,num[bx+2]mov num[bx],ax continue:add bx,2loop loop2mov cx,diloop loop1retorderz endp;outputz procinitnum: ;changenum初始化lea dx,charmov ah,09hint 21hmov cx,imov di,0 loopnum:add di,2mov bx,10mov si,4changenum: ;二进制->BCDmov dx,0div bxmov [rec+si],dldec sicmp ax,0ja changenumoutputnum: ;输出(从initnum开始,做预备工作)inc simov dl,[rec+si]add dl,30hmov ah,02hint 21hcmp si,4jb outputnummov dl,20hmov ah,02hint 21hloop loopnummov ah,4chint 21hretoutputz endpcode endsend start。
排序汇编语言程序设计

第8章 数组 第3单元 问题求解与算法设计基础-3第13讲 冒泡排序怎么样帮我们按身材的高低顺序进行排队的61 83 88 84 8783 61 88 84 87 83 88 61 84 87 83 88 87 84 61第1遍84 83 87 61 88第2遍84 83 87 61 88 84 83 88 61 87第3遍83 84 87 61 8883 84 87 61 88第4遍83 84 87 61 8883 88 87 84 6184 88 87 83 61 84 88 87 83 61 84 87 88 83 61第1遍84 87 61 83 88第2遍84 87 61 83 88 84 87 61 83 88第3遍84 61 87 83 8884 61 87 83 88第4遍61 84 87 83 88比较相邻的两个数据 若顺序不对,则将其位置交换第8章 数组 第3单元 问题求解与算法设计基础-3第14讲 交换、选择排序哈尔滨工业大学叶麟683 88 87 84 6184 88 87 83 61 84 88 87 83 61 84 88 87 6183 第1遍84 88 87 61 83第2遍84 88 87 61 8388 87 84 61 83第3遍88 87 83 61 8487 88 83 61 84第4遍84 88 83 61 87第一个数分别与后面所有的数进行比较,若后面的数较小,则交换后面这个数和第一个数的位置第二个数分别与后面所有的数进行比较,若后面的数较小,则交换后面这个数和第二个数的位置……………………………………………………………………………83 88 87 84 6161 83 88 87 8461 83 87 88 8461 83 84 87 88第1遍第2遍 第3遍 第4遍 在每一遍比较中,在剩余的待比较的数中选择一个最小的数与这个剩余序列的第1个数交换位置n⏹ 选择排序是一种有效的排序算法吗?n⏹ 所需步骤Þ 找到最小的元素需要 n 步Þ 找到剩余的最小元素需要 n-1 步Þ ……n(n+1)/2或者(n2+n)/2 n⏹ 总运行时间Þ n + (n – 1) + … + 2 + 1n (n2+n)/2 10 5520 210 40 820100 5050 200 20100 400 80200 1000 500500 2000 2001000 4000 8002000 10000 50005000序列长度翻一番 排序算法的运行时间要翻两番n⏹ 随着n的增大,n和算法性能之间的关系称为算法的计算复杂度(Computational Complexity)n⏹ 时间复杂度(Time Complexity)和空间复杂度(SpaceComplexity)n⏹ 算法的时间复杂度是算法的时间量度,是指执行算法所需要的计算工作量n⏹ 一个算法花费的时间与算法中语句的执行次数是成正比的,n⏹ 算法的基本操作被重复执行的次数是问题规模n的某个函数f(n),因此,算法的时间复杂度记为:T(n)=O(f(n))大O符号 大O记法(Big O notation) n⏹ O(n2)表示算法性能随问题规模n 的平方而变化n n2/2n/2(n2+n)/2 1050555100 5 00050 5 0501 000500 000500500 500 10 00050 000 000 5 00050 005 000 100 0005000 000 00050 0005000 050 000n⏹ 常用的简化方式如下:Þ 删除随n值增大而对总估值不再重要的项,只保留在公式中占主导地位的项,即最高阶项Þ 删除所有的常数因子。
用汇编对学生,学号,成绩排序

华北科技学院综合性
实验报告
课程名称汇编语言
实验学期 XXXX 至 XXXX 学年第 X 学期
学生所在系部计算机学院网络工程系
年级 XXX 专业班级网络XXX班
学生姓名 XXXX 学号 XXXXXXXXXXXXXXX 任课教师李冬艳
实验成绩
计算机学院制
《汇编语言》课程综合性实验报告
宏定义:
宏定义主要用于将字符串进栈这一重复的过程中。
子程序IFERROR
键盘输入
=0? 跳转到ERROR
显示ERROR
<=9?
跳转到NO_ERROR
跳转到NO_ERROR 跳转到ERROR
显示ERROR
结束程序
否
否
是
是
子程序IFERROR
键盘输入 进栈 跳转到NO_ERROR 显示输入字符 结束程序
排序:
子程序NEXT 键盘输入 CX,BX,COUNT 进栈
BUFF 地址传送给DI
COUNT 赋值给CX
DI 自加2
Count=0?
是
转到DONE
BX=COUNT 的值,CL=02H
COUNT 逻辑左移02H AX= [BUFF+BX-4]
[BUFF+BX]=AX AX=[BUFF+BX-2]
[BUFF+BX+2]=AX
CX 出栈 人数总和自减一 LOOP BIG; DI 自减2
BH=[DI]?
转到BIG
转到SAMLL
DI 自加2
CX 自减1
转到P2
CX 进栈
DI 自加1 BH=[DI]?
转到BIG2
DI 自加1
DI 自加1 转到P2
高于 低于
等于。
汇编有序表的插入删除排序

华北科技学院课程设计说明书课程名称:汇编语言班级: 计算机B08-2 姓名:___王胤_ _学号:__ 200807024214 __设计题目:___ 有序表的插入、删除、查询_设计时间:2010-12-13至2010-12-24指导教师:______ 陈振国_ ___________ 评语:_________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ 评阅成绩:____评阅教师:_____一、课程设计目的进行程序设计方法和技能的基本训练,巩固在课堂上学到的有关程序设计的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。
二、课程设计要求1.要求编写并调试通过一个小型软件,实现对软件或硬件的操作。
2.遵循模块化、结构化的程序设计方法。
3. 要求程序必须正确。
4. 程序简明易懂,多运用输入输出提示,出错信息及必要的注释。
5. 要求程序结构合理,语句使用得当。
6. 适当追求编程技巧和程序运行效率。
三、课程设计题目:有序表的插入、删除、查询四、课题分析有序表的插入、删除、查询可使之提供以下功能:1、数据输入实现对数组长度和数组元素的初始化。
2、排序实现对数组元素从小到大排序。
3、查询实现对指定数的查询,若查找到则输出该数位置;若没查找到则给出该数不存在的提示。
4、插入实现对指定数的插入,插入同时序列长度加1。
5、删除实现对指定数的删除,若查找到则删除,且序列长度减1;若没找到则给出该数不存在的提示。
冒泡排序(正向+逆向) 汇编语言课程设计

20 0
7
6 9 7 4 3 8 10 6 9 7 4 3 8 10
如此下去最终排序为:20,10,9,8,7,6,4,3,2,0
2
20 0
交换
20
20
不交换
冒泡正向排序:
data segment
num
dw 50 dup(?)
count
dw 10
flag1
db 0
;符号标志
flag2
db 0
;首位0标志
;回车换行
exit3: ret
input endp
bubblesort proc
;将num[]中存储的数进行冒泡排序
mov cx,count
;初始化计数器CX
dec cx
lg1: mov di,cx
;保存CX的值
mov si,0
lg2: mov ax,num[si]
;相邻的两数进行比较大小
cmp ax,num[si+2]
ah,4ch
21h
;输入原始数据
dx,mess1
ah,09
21h
;9号调用,显示字符串,请求输入数据
crlf
;回车,换行
si,0
cx,count
decibin
cx
dl,','
;进行分隔符判断,以逗号为分隔符
store
dl,13
;进行换行判断
exit2
error
num[si],bx ;将BX中的二进制数存储到num中
data ends code segment
assume cs:code,ds:data start:mov ax,data
课程设计排序

课程设计排序一、教学目标本课程的教学目标是使学生掌握排序的基本概念和算法,能够运用排序方法解决实际问题。
具体目标如下:1.了解排序的定义和作用;2.掌握常见的排序算法,如冒泡排序、选择排序、插入排序等;3.理解排序算法的的时间复杂度和空间复杂度。
4.能够运用排序算法对给定的数据进行排序;5.能够分析问题,选择合适的排序算法解决问题;6.能够编写程序实现排序算法。
情感态度价值观目标:1.培养学生的逻辑思维能力和问题解决能力;2.培养学生对计算机科学的兴趣和热情;3.培养学生的团队合作意识和交流沟通能力。
二、教学内容本课程的教学内容主要包括排序的基本概念、常见排序算法和排序算法的应用。
具体安排如下:1.排序的定义和作用:介绍排序的概念和作用,理解排序的基本要求;2.冒泡排序:学习冒泡排序的原理和实现,通过实例理解冒泡排序的过程;3.选择排序:学习选择排序的原理和实现,通过实例理解选择排序的过程;4.插入排序:学习插入排序的原理和实现,通过实例理解插入排序的过程;5.其他排序算法:学习快速排序、希尔排序等排序算法,了解其原理和实现;6.排序算法的应用:学习排序算法在实际问题中的应用,如最大值最小值问题、 Top K 问题等。
三、教学方法本课程采用讲授法、讨论法和案例分析法相结合的教学方法。
具体安排如下:1.讲授法:通过讲解排序的基本概念、排序算法的原理和实现,使学生掌握排序的基本知识;2.讨论法:通过小组讨论,让学生深入理解排序算法的思想和过程,提高学生的思考和表达能力;3.案例分析法:通过分析实际问题,让学生学会运用排序算法解决问题,培养学生的问题解决能力。
四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备。
具体安排如下:1.教材:选用《数据结构与算法》等相关教材,为学生提供系统性的学习资料;2.参考书:推荐学生阅读《算法导论》、《编程之美》等参考书,丰富学生的知识体系;3.多媒体资料:制作PPT、教学视频等多媒体资料,帮助学生更好地理解和掌握知识;4.实验设备:提供计算机实验室,让学生能够亲自动手实践,提高学生的实际操作能力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编语言实验报告学院名称:计算机科学与技术学院题目:汇编语言实现数组排序专业班级:信息安全111姓名:王丹学号:1108060090指导老师:王晓鹏一、课程设计的性质和目的:通过课程设计,进行程设计方法和技能的基本训练,巩固在课堂上学到的有关软件程序设计的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。
二、课程设计的要求:1、遵循模块化、结构化的程序设计方法。
2、要求程序必须正确。
3、程序简明易懂,多运用输入输出提示,有出错信息及必要的注释。
4、要求程序结构合理,语句使用得当。
5、适当追求编程技巧和程序运行效率。
三、主要仪器设备及软件:PC机、MASM汇编软件。
四、课程设计题目及要求:题目:汇编数组排序(选用冒泡排序算法)五、课题分析及设计思路:冒泡排序:依次比较相邻的两个数,将小数放在前面,大数放在后面。
即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。
然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。
至此第一趟结束,将最大的数放到了最后。
在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。
如此下去,重复以上过程,直至最终完成排序。
冒泡排序可分为正向和逆向两种排序.通过主程序对子程序的调用来完成输入输出,排序,循环,转化等功能。
六、程序主要流程图:冒泡排序法实现整数排序一、实验目的掌握用汇编语言实现排序,选用冒泡排序算法。
二、实验内容输入20个以内的不超过0-99的整数,进行排序后输出结果。
三、源程序DATA SEGMENTNOTE1 DB 0DH,0AH,'==================================================================',0D H,0AHDB 'Please input 20 (or less) numbers (0~99):',0DH,0AH,'$'NOTE2 DB 0DH,0AH,'==================================================================',0D H,0AHDB 0DH,0AH,'The inputed numbers: ','$'NOTE3 DB 0DH,0AH,'==================================================================',0D H,0AHDB 0DH,0AH,'How many decimal integers? $'NOTE4 DB 0DH,0AH,'The sorted result: ',0DH,0AH,'$'ERR_STR DB 0DH,0AH,'******************************************************************',0DH,0AHDB 'Input error!',0DH,0AHCON_STR DB 0DH,0AH,'******************************************************************',0DH,0AHDB 0DH,0AH,'Continue? Y or N?','$'DEC_STR DB 200 ;用来存放输入的原始数据DB ?DB 150 DUP('$')TOTAL DB 3 DUP('$') ;用来记录输入的数字个数DEC_NUM DW 30 DUP(?) ;用来存放将输入的ASCII 码转换成2进制数以便比较的结果OUT_STR DB 150 DUP('$') ;存放待输出的字符组信息DATA ENDSSTACK SEGMENT STACKSTT DB 100 DUP(?) ;堆栈STACK ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DA TA,SS:STACKSTART: MOV AX,STACKMOV SS,AXMOV AX,DA TAMOV DS,AX;---------------------------------- 输出提示信息DISP0: LEA DX,NOTE1MOV AH,09HINT 21HLEA DX,DEC_STR ;将原始数据存入该空间MOV AH,0AHINT 21HMOV AL,BYTE PTR[DEC_STR+2] ;输入合法性的标志:开头是数字或者符号CMP AL,'0'JAE CMP1CMP AL,'+'JE DISP2CMP AL,'-'JE DISP2JMP DISP1CMP1: CMP AL,'9'JBE DISP2DISP1: LEA DX,ERR_STRMOV AH,09HINT 21HCON_YN: MOV AH,01H ;程序结束处询问是否需要继续INT 21HCMP AL,'Y'JE DISP0CMP AL,'y'JE DISP0CMP AL,'N'JE OVER0CMP AL,'n'JE OVER0OVER0: JMP OVER ;用以结束程序DISP2: LEA DX,NOTE2 ;将输入的数据输出以便用户对照其正确性MOV AH,09HINT 21HLEA DX,[DEC_STR+2]MOV AH,09HINT 21H;==================================COUNT HOW MANY DECIMAL INTEGERS LEA SI,DEC_STRMOV CL,BYTE PTR[SI+1] ;CL中存放输入的总字符数MOV CH,0PUSH CXMOV AL,0 ;AL用来计数数字个数LP1: MOV DL,BYTE PTR[SI+2] ;如果输入数字,符号则继续读下一位,如果输入其他字符则AL加一,这也是开头第一个字母不能为其他字符的原因CMP DL,'+'JE MOV_PTRCMP DL,'-'JE MOV_PTRCMP DL,'0'JL mov_incCMP DL,'9'Jle mov_ptrMOV_INC:INC ALMOV_PTR:INC SILOOP LP1INC ALCBW ;将AL拓展到AX中MOV DEC_NUM,AX ;将2进制形式的计数结果放入该单元MOV CL,10 ;除以10后,AL中放的是十位数,AH中放的是个位数DIV CLADD AX,3030H ;加3030H后将十位数和个位数分别转换成ASCII码LEA DI,TOTALMOV BYTE PTR[DI],ALMOV BYTE PTR[DI+1],AHMOV BYTE PTR[DI+2],'$' ;将ASCII形式的计数结果放入单元以便输出LEA DX,NOTE3 ;输出计数结果MOV AH,9INT 21hLEA DX,TOTAL ;小小的处理使得第一位是0时自动缺省CMP0: MOV BX,DXCMP BYTE PTR [BX],'0'JNE DISPLAYINC DXDISPLAY:MOV AH,9INT 21H;==================================ASCII to DECIMALLEA DX,[dec_str+2] ;从DX指向的单元读入MOV cx,DEC_NUMLEA BX,DEC_NUM ;写进BX指向的单元ADD BX,2T1: CALL ASC2DEC ;调用ASCII码转换MOV [BX],AX ;将处理后的数放入储存单元ADD BX,2ADD DX,SI ;DX指向新位置LOOP T1;==================================Sort binary gigitsCALL COMP ;冒泡排序,算法很经典,就不过多标注了;==================================NOTE4 ;输出结果提示LEA DX,NOTE4MOV AH,09HINT 21H;==================================DECIMAL TO ASCII ;将排序后的2进制数用ASCII码表示并打印出来LEA BX,DEC_NUMmov cx,DEC_NUMADD BX,2D2A: MOV AX,[BX] ;读出二进制数放在AX中CALL DEC2ASC ;调用转化和打印过程MOV DL,' ' ;输出空格MOV AH,2INT 21HADD BX,2 ;后移LOOP D2ALEA DX,CON_STRMOV AH,09HINT 21H ;询问是否继续JMP CON_YNOVER: MOV AH,4CHINT 21HMAIN ENDP;-----------------------------------ASCII TO DECIMAL NUMBERASC2DEC PROC NEARPUSH BX ;入栈保护PUSH CXPUSH DXMOV AX,0 ;AX初始为0,采用乘10相加的方式转换MOV SI,DXPUSH SIMOV DL,[SI]CMP DL,'-' ;如果读入的是负数则置CL为1最后处理JNE L0MOV CL,1INC SIMOV DL,[SI]JMP L4L0: CMP Dl,'+'JNE L1INC SIMOV DL,[SI]L1: MOV CL,0 ;正数置CL为0L4: AND DL,0FHMOV DH,0ADD AX,DXINC SIMOV DL,[SI]CMP DL,'0'JL L2CMP DL,'9'JG L2CALL TIMBY10 ;调用乘10进程JMP L4L2: CMP CL,1 ;如果是负数,对其求反JNE L3NEG AXL3: POP DI ;DI出栈SUB SI,DI ;SI减去初始位置,计算相对位移量INC SIPOP DXPOP CXPOP BXRETASC2DEC ENDP;==================================AX TIME BY 10TIMBY10 PROC NEARMOV BX,AXSHL AX,1 ;乘2SHL AX,1 ;再乘2ADD AX,BX ;加一倍,现在相当于乘了5SHL AX,1 ;乘2,总共是乘了10RETTIMBY10 ENDP;==================================SORT DECIMAL NUMBERSCOMP PROC NEAR ;保护PUSH AXPUSH BXPUSH CXPUSH DIMOV AX,DA TAMOV DS,AXLEA DI,DEC_NUMMOV CX,word ptr[DI] ;计数DEC CXC1: MOV DX,CXMOV BH,0C2: ADD DI,2MOV AX,[DI]CMP AX,[DI+2]JLE CONT1XCHG AX,[DI+2]MOV [DI],AXMOV BH,1CONT1: LOOP C2CMP BH,0JE STOPMOV CX,DXLEA DI,DEC_NUMLOOP C1STOP: LEA BX,DEC_NUMMOV AX,[BX+8]POP DIPOP CXPOP BXPOP AXRETCOMP ENDP;==================================DECIMAL NUMBER TO ASCII DEC2ASC PROCPUSH BX ;保护PUSH CXLEA DI,OUT_STR ;将处理后的放入DIMOV DX,DICMP AX,0JNE NON_0ZERO: MOV BYTE PTR[DI],'0' ;如果是0MOV BYTE PTR[DI+1],'$'JMP OUT_ASCNON_0: TEST AX,8000H ;不是0JZ PTIVE ;判断符号,是正号跳转NTIVE: NEG AX ;取反MOV BYTE PTR[DI],'-' ;置负号JMP CONPTIVE: MOV BYTE PTR[DI],'+' ;置正号CON: INC DIMOV DX,0MOV CX,10000 ;万位IDIV CX ;带符号数除法ADD AL,30HMOV byte ptr[DI],ALMOV AX,DXMOV DX,0MOV CX,1000 ;千位IDIV CXADD AL,30H ;加30H变成ASCIIMOV byte ptr[DI+1],AL ;写入MOV AX,DXMOV CL,100 ;百位IDIV CLADD AL,30HMOV byte ptr[DI+2],ALMOV AL,AHMOV AH,0MOV CL,10 ;十位IDIV CLADD AL,30HMOV BYTE PTR[DI+3],ALADD AH,30HMOV BYTE PTR[DI+4],AH ;个位OUT_SIG:LEA DI,OUT_STRMOV DL,BYTE PTR[DI]MOV AH,2INT 21HINC DIMOV DX,DIB2: CMP BYTE PTR[DI],'0'JNE OUT_ASCINC DIINC DXJMP B2OUT_ASC:MOV AH,09H ;打印INT 21HPOP CXPOP BXRETDEC2ASC ENDP;==================================CODE ENDSEND START四、运行结果1.输入14个数,13 65 78 32 47 63 76 87 36 49 57 92 28 20输出结果为13 20 28 32 36 47 49 57 63 65 76 78 87 92 2.、当输入不合法时,程序会自动跳到初始位置,并给出了出错提醒,要求重新输入数据:五、实验总结通过此次实验,让我对汇编语言编程有了个更清楚的认识,不再是停留在书本上的概念里面,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自己在汇编语言认识上还不足,通过学习也有所改进;还有对汇编语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。