[考试]循环程序设计:冒泡排序(并求平均值).docx
《[考试]循环程序设计:冒泡排序(并求平均值).docx》由会员分享,可在线阅读,更多相关《[考试]循环程序设计:冒泡排序(并求平均值).docx(9页珍藏版)》请在冰豆网上搜索。
![[考试]循环程序设计:冒泡排序(并求平均值).docx](https://file1.bdocx.com/fileroot1/2022-10/3/a3aeebad-8193-433d-b836-25bc1698028c/a3aeebad-8193-433d-b836-25bc1698028c1.gif)
;循环程序设计:
冒泡排序(并求平均值)(8086汇编)vipxxl@
;中南大学微机原理与接口技术实验8086汇编;原题实验三循环程序设计;编写一段程序,在数据段的十个数据单元中,定义20个8位无符号数(或键盘输入)。
;找出最大数和最小数,分别送到MAX和MIN单元中。
显示原始数据、最大值、最小值。
DATA SEGMENT;数据段
DA1DW20DUP(?
)
DA2DB ' PLEASE INPUT20NUMBERS(00~99) :
',0DH,0AH,' $' DA3DB ' NUMBERS BEFOR SORT:
',0DH,0AH,' $' DA4DB0DH,0AH,' NUMBERS AFTER SORT:
',0DH,0AH,' $' DA5DB0DH,0AH,' THE MAXNUMBER IS:
',0DH,0AH,' $' DA6DB0DH,0AH,' THE MIN NUMBER IS:
',0DH,0AH,' $' DA7DB0DH,0AH,' PRESS ANY KEY TO QUIT:
',0DH,0AH,' $' DA8DB ' PLEASE INPUT NUMER ',' $' DA9DB ' :
',' $'
DA10DB0DH,0AH,' THE AVERAGE VALUE IS:
',0DH,0AH,' $' DAT1DW3230H,3139H,3138H,3137H,3136H,3135H,3134H,3133H,3132H,3131H DW3130H,3039H,3038H,3037H,3036H,3035H,3034H,3033H,3032H,3031H DAT2DB0DH,0AH,' WRONG NUMBER!
',0DH,0AH,' $' DATA ENDS
STACK SEGMENT STACK;堆栈段ST1DB100DUP(?
)
STACK ENDS
CODE SEGMENT;代码段
MAIN PROC FAR
ASSUME CS:
CODE,DS:
DATA,SS:
STACK START:
MOV AX,STACK;送堆栈段地址MOV SS,AX
PUSH DS;返回DOS
MOV AX,0
PUSH AX
MOV AX,DATA;送数据段段地址MOV DS,AX
MOV DX,OFFSET DA2;提示输入信息MOV AH,9
INT21H
LEA DI,DA1;数组首地址
MOV CX,20;循环次数20
TIP1:
MOV AH,9;提示输入第N个数MOV DX,OFFSET DA8
INT21H
LEA SI,DAT1
SUB SI,2
ADD SI,CX
ADD SI,CX
MOV BX,[SI]
MOV DL,BH
MOV AH,2
INT21H
MOV DL,BL
MOV AH,2
INT21H
MOV AH,9
MOV DX,OFFSET DA9
INT21H
INPUT:
MOV AH,1;输入十位数INT21H
CMP AL,30H;防误输入
JB TIP2
CMP AL,39H
JG TIP2
MOV BH,AL
MOV AH,1;输入个位数
INT21H
CMP AL,30H;防误输入
JB TIP2
CMP AL,39H
JG TIP2
MOV BL,AL
MOV[DI],BX;将输入的数字存放到内存ADD DI,2;指向下一个数
MOV AH,2;回车
MOV DL,0AH
INT21H
LOOP TIP1;循环
JMP NEXT1;循环结束,跳转TIP2:
MOV AH,9;提示错误信息MOV DX,OFFSET DAT2
INT21H
JMP TIP1;跳转,重新输入NEXT1:
MOV DX,OFFSET DA3;提示排序前数组MOV AH,9
INT21H
MOV CX,20
MOV DI,OFFSET DA1
OUT1:
MOV DX,[DI];输出排序前数组MOV BX,DX
MOV DL,BH;输出十位数
MOV AH,2
INT21H
MOV DL,BL;输出个位数
MOV AH,2
INT21H
MOV AH,2
MOV DL,20H;空格
INT21H
ADD DI,2
LOOP OUT1;循环
SORT:
MOV CX,19;排序,设计数器CX,内循环次数LEA BX,DA1
L1:
MOV DX,CX;设计数器DX,外循环次数L2:
MOV AX,[BX];取相邻两个数CMP AX,[BX+2];若前一个小于后一个,跳转JB CONT1
XCHG AX,[BX+2];否则两数交换MOV[BX],AX
CONT1:
ADD BX,2;内循环
LOOP L2
MOV CX,DX;外循环次数->CXMOV BX,0;地址返回第一个数据LOOP L1;外循环
MOV CX,20
MOV DX,OFFSET DA4;提示输出信息MOV AH,9
INT21H
LEA DI,DA1
OUT2:
MOV AH,2;输出排序后的数组MOV DX,[DI]
MOV BX,DX;输出十位数
MOV DL,BH
MOV AH,2
INT21H
MOV DL,BL;输出个位数
MOV AH,2
INT21H
MOV AH,2
MOV DL,20H
INT21H
ADD DI,2
LOOP OUT2;循环输出
OUT3:
MOV DX,OFFSET DA5;输出最大数MOV AH,9
INT21H
LEA DI,DA1
MOV AH,2
MOV DX,[DI+38]
MOV BX,DX
MOV DL,BH
MOV AH,2
INT21H
MOV DL,BL
MOV AH,2
INT21H
MOV AH,2
MOV DL,20H
INT21H
MOV DX,OFFSET DA6;输出最小数MOV AH,9
INT21H
LEA DI,DA1
MOV AH,2
MOV DX,[DI]
MOV BX,DX
MOV DL,BH
MOV AH,2
INT21H
MOV DL,BL
MOV AH,2
INT21H
MOV AH,2
MOV DL,20H
INT21H
AVE1:
LEA DI,DA1;算平均值MOV CX,20
MOV BX,0
AVE2:
MOV AX,[DI];循环计算20数之和PUSH AX;ASCII转16进制数
SUB AH,30H;高位转BCD码
MOV AL,AH
PUSH CX
MOV CL,10;高位乘以10
MUL CL
POP CX
MOV DX,AX
POP AX
SUB AL,30H;低位转BCD码
MOV AH,0H
ADD AX,DX;十位数和个位数合并ADD BX,AX
ADD DI,2
LOOP AVE2;循环
MOV AX,BX
MOV BL,20;除以20求平均数DIV BL
MOV AH,0;注意!
不然会发生divide overflow MOV BL,10;16进制转非压缩BCD码DIV BL
XCHG AH,AL
OUT4:
PUSH AX;输出平均值MOV DX,OFFSET DA10
MOV AH,9
INT21H
POP AX
PUSH AX
ADD AH,30H
MOV DL,AH
MOV AH,2
INT21H
POP AX
ADD AL,30H
MOV DL,AL
MOV AH,2
INT21H
FINISH:
MOV DX,OFFSET DA7;结束MOV AH,9
INT21H
MOV AH,8
INT21H
RET
MAIN ENDP
CODE ENDS
END START