汇编语言 输入10个数排序并输出的实现
一:题目描述
在键盘输入任意10个数
- 按从小到大排序后,在计算机屏幕上先输出来。要有结果提示(字符串显示)。
- 将10个数做累加,结果在计算机屏幕显示累加和。
二:伪指令的定义
1.数据段
ATASSEGMENT string_1DB'Pleaseinputanumbers(0-65536):','$' string_2DB'ERROR:OVERFLOW!Pleaseinputagain:','$' string_3DB'Thearrayyouhaveinputis:',0ah,0dh,'$' string_4DB'AfterSortthenumis:',0ah,0dh,'$' string_5DB'','$' DATADW10DUP(?) massegeDB'Thesumofthearrayis:',0ah,0DH,'$' DATASENDS
说明:
string_1 | 输入范围提示 |
---|---|
string_2 | 输入错误提示 |
string_3 | 输出原数组提示 |
string_4 | 输出排序后数组提示 |
string_5 | 空格符 |
DATA | 缓冲区数组 |
2.堆栈段
STACKSSEGMENT DW256dup(?) STACKSENDS
3.代码段
CODESSEGMENT ASSUMECS:CODES,DS:DATAS,SS:STACKS
三:模块分解与实现
1.DOS输入10个数字
输入10个无符号数存入缓冲区,并且保证
为何输入范围是65536呢一个字的最大表示范围是
HEX | FFFF |
---|---|
DEC | 65535 |
BIN | 1111111111111111 |
1.1输入函数子程序
;---------输入函数(单数字输入)------------ InputPROCNear pushAX pushBX pushCX pushDX ;---------输入提示-------------- MOVBX,0 CLC MOVDX,0 ;----------输入数字-------------- Lp_0: MOVAH,1 INT21H CMPAL,20H;回车 JEL_CRLF ;-----xbelongto[0,9]---------- SUBAL,30H;ASCII->int JLL_ERROR CMPAL,9 JGL_ERROR ;-------string->int----------- MOVAH,0;将AL扩展成AX XCHGAX,BX;保护AX值 MOVCX,10 MULCX;bx*=10 ADDAX,BX JCL_ERROR;OVERFLOW处理 XCHGAX,BX JMPLp_0 L_ERROR: MOVDX,0 MOVBX,0 CALLCRLF;换行 CALLERROR;输出错误提示 JMPLp_0 L_CRLF:;以换行作为一个数的结束标志 MOVDX,0 MOVDATA[SI],BX; POPDX POPCX POPBX POPAX RET InputENDP
解析函数功能:
本质类似于高精度计算,将读入的一个串转成数字存储在DATA数组中
分成三大部分
- 一:输入提示
- 二:错误判断及提示
- 三:转化为数字
L_ERROR错误处理
L_CRLF结束处理
我们来举一个
Register | 1 | 2 | 3 | 4 |
---|---|---|---|---|
AX | 1 | 2 | 3 | 4 |
BX | 0 | 1 | 12 | 123 |
CX | 10 | 10 | 10 | 10 |
A
最后将结果存储在DATA数组里
2.实现冒泡排序
冒泡排序作为一个简单的排序算法,时间复杂度
内层循环很简单,每次从头比到尾,遇到比它小的交换就可以了。因为是字操作数,所以循环的下标到18为结束条件。
;---------Bubble_sort-------------------- Bubble_sortPROCNEAR PUSHBX PUSHDX MOVSI,DI LOOP1: ADDSI,2 MOVBX,DATA[DI] CMPBX,DATA[SI] JASWAP JMPNEXT SWAP: MOVDX,DATA[SI] MOVDATA[DI],DX MOVDATA[SI],BX NEXT: CMPSI,18 JLLOOP1 POPDX POPBX RET Bubble_sortENDP
外层调用:每次
;----------Sort----------- MOVCX,9 MOVDI,0 FOR1: CALLBubble_sort ADDDI,2 LOOPFOR1
3.DOS输出到屏幕
CALLCRLF MOVDX,OFFSETstring_4;'AfterSortthenumis:' MOVAH,9 INT21H MOVCX,10 MOVDI,0 FOR2: CALLPrint CALLSpace ADDDI,2 LOOPFOR2 CALLCRLF
输出DATA内的数字,每次输出一个数字然后在输出一个空格
Print函数:
- 利用DIV函数的特点——每次除10的商放在AX,余数放入DX
- 并利用栈的FILO(FirstinLastOut)的特点
依旧以1234的例子来看一下是怎么处理的
DATA[Num] | 1234 | 123 | 12 | 1 |
---|---|---|---|---|
DX | 4 | 3 | 2 | 1 |
Stack(PUSHDX) | 4 | 4,3 | 4,3,2 | 4,3,2,1 |
Print(POPDX) | 4 | 34 | 234 | 1234 |
PrintPROCNear PUSHAX PUSHBX PUSHCX PUSHDX MOVCX,0 MOVBX,10 MOVAX,DATA[DI] LAST: MOVDX,0 DIVBX;DIV商放AX,余数放入DX PUSHDX INCCX CMPAX,0 JNZLAST AGE: POPDX ORDX,30H MOVAH,2 INT21H LOOPAGE POPDX POPCX POPBX POPAX RET PrintENDP
4.求累加和全部累加到
;-------SUM------------- Get_sumPROCNEAR PUSHBX PUSHCX MOVBX,0 MOVCX,9 MOVDI,2 LOP1: MOVBX,DATA[0] ADDBX,DATA[DI] MOVDATA[0],BX ADDDI,2 LOOPLOP1 POPCX POPBX RET Get_sumENDP
5.其他函数
;----换行子函数(一个数输入完毕)------- CRLFPROCNear pushAX pushDX MOVDL,0ah MOVAH,2 INT21H popDX popAX RET CRLFENDP ;---------空格----------- SpacePROCNear pushAX pushDX MOVDX,OFFSETstring_5;'' MOVAH,9 INT21H popDX popAX RET SpaceENDP ;----------错误提示------------- ERRORPROCNear pushBX pushDX MOVDX,OFFSETstring_2;ERROR:OVERFLOW!Pleaseinputagain: MOVAH,9 INT21H popDX popBX RET ERRORENDP
四:流程图
1.总体流程图
2.子程序流程图
2.1Input
2.2Print
2.3Bubble_Sort
2.4Get_Sum
五:代码与运行截图
1,完整版代码(在MASM运行通过)
;-----数据段------------ DATASSEGMENT string_1DB'Pleaseinput10numbers(0-65536):','$' string_2DB'ERROR:OVERFLOW!Pleaseinputagain:','$' string_3DB'Thearrayyouhaveinputis:',0ah,0dh,'$' string_4DB'AfterSortthenumis:',0ah,0dh,'$' string_5DB'','$' DATADW10DUP(?) massegeDB'Thesumofthearrayis:',0ah,0DH,'$' DATASENDS ;-----堆栈段------------ STACKSSEGMENT DW256dup(?) STACKSENDS ;-----代码段------------ CODESSEGMENT ASSUMECS:CODES,DS:DATAS,SS:STACKS ;-----------程序开始------------ START: MOVAX,DATAS MOVDS,AX MOVSI,0;指针初始化 MOVCX,10;循环次数 ;---------Input---------- MOVDX,OFFSETstring_1;Pleaseinput10numbers(0-65536) MOVAH,9 INT21H Lp: CALLInput ADDSI,2 LoopLp ;--------结束输入,换行--------------- CALLCRLF MOVDX,OFFSETstring_3;'Thearrayyouhaveinputis:' MOVAH,9;首地址DS:DX INT21H ;-------输出---------------- MOVCX,10 MOVDI,0 Again: CALLPrint CALLSpace ADDDI,2 LoopAgain ;/******************************/ ;----------Sort----------- MOVCX,9 MOVDI,0 FOR1: CALLSort ADDDI,2 LOOPFOR1 CALLCRLF MOVDX,OFFSETstring_4;'AfterSortthenumis:' MOVAH,9 INT21H MOVCX,10 MOVDI,0 FOR2: CALLPrint CALLSpace ADDDI,2 LOOPFOR2 CALLCRLF ;-------求和输出--------------------- MOVDX,OFFSETmassege; MOVAH,9 INT21H CALLGet_sum MOVDI,0 CALLPrint EXIT: MOVAH,4CH INT21H ;/************子程序调用****************/ ;---------输入函数(单数字输入)------------ InputPROCNear pushAX pushBX pushCX pushDX MOVBX,0 CLC MOVDX,0 ;----------输入数字-------------- Lp_0: MOVAH,1 INT21H CMPAL,20H;空格 JEL_CRLF ;-----xbelongto[0,9]---------- SUBAL,30H;ASCII->int JLL_ERROR CMPAL,9 JGL_ERROR ;-------string->int----------- MOVAH,0;将AL扩展成AX XCHGAX,BX;保护AX值 MOVCX,10 MULCX;bx*=10 ADDAX,BX JCL_ERROR;OVERFLOW处理 XCHGAX,BX JMPLp_0 L_ERROR: MOVDX,0 MOVBX,0 CALLCRLF;换行 CALLERROR;输出错误提示 JMPLp_0 L_CRLF:;以换行作为一个数的结束标志 MOVDX,0 MOVDATA[SI],BX; POPDX POPCX POPBX POPAX RET InputENDP ;----换行子函数(一个数输入完毕)------- CRLFPROCNear pushAX pushDX MOVDL,0ah MOVAH,2 INT21H popDX popAX RET CRLFENDP ;---------空格----------- SpacePROCNear pushAX pushDX MOVDX,OFFSETstring_5;'' MOVAH,9 INT21H popDX popAX RET SpaceENDP ;----------错误提示------------- ERRORPROCNear pushBX pushDX MOVDX,OFFSETstring_2;ERROR:OVERFLOW!Pleaseinputagain: MOVAH,9 INT21H popDX popBX RET ERRORENDP ;---------输出函数(单数字输出)------------- PrintPROCNear PUSHAX PUSHBX PUSHCX PUSHDX MOVCX,0 MOVBX,10 MOVAX,DATA[DI] LAST: MOVDX,0 DIVBX;DIV商放AX,余数放入DX PUSHDX INCCX CMPAX,0 JNZLAST AGE: POPDX ORDX,30H MOVAH,2 INT21H LOOPAGE POPDX POPCX POPBX POPAX RET PrintENDP ;---------SORT--------------------- SORTPROCNEAR PUSHBX PUSHDX MOVSI,DI LOOP1: ADDSI,2 MOVBX,DATA[DI] CMPBX,DATA[SI] JACHANGE JMPNEXT CHANGE: MOVDX,DATA[SI] MOVDATA[DI],DX MOVDATA[SI],BX NEXT: CMPSI,18 JLLOOP1 POPDX POPBX RET SORTENDP ;-------SUM------------- Get_sumPROCNEAR PUSHBX PUSHCX MOVBX,0 MOVCX,9 MOVDI,2 LOP1: MOVBX,DATA[0] ADDBX,DATA[DI] MOVDATA[0],BX ADDDI,2 LOOPLOP1 POPCX POPBX RET Get_sumENDP CODESENDS ENDSTART
2.正确运行时截图
3.错误输入时截图
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。