实验内容
编写一个汇编语言程序,实现先输入一个0-100的数N,然后输入N个数,以回车结束每个数字并显示在屏幕上,再将未排序前和从小到大排序后的结果显示在屏幕上。实验结果应达到如下的一个界面:
实验过程
本次汇编语言程序设计要求的是对n个数进行排序,首先我们要定义程序结果的那些字符串以及这个n个数的一个数组。同时我们应该设置一个堆栈段来实现数的显示。
接着我们可是程序的正式开始部分,我们通过9号调用来输出我们所要展示的字符串,然后用换行符来换行,接着我们输入数字n,循环输入数字的每一位并显示出来,然后将数字n保存在cx里面。这其中应该通过1号调用程序来实现数字的回显。
然后我们要从低位到高位,把数字n进行压栈操作,保留这个数字的一个顺序之后再出栈来显示出这个数字n。再通过把数字n放在cx里面,可以作为后面循环输入n个数字的一个loop的次数。
接着我们通过输入n个data并保存在数组array里面。data的输入和输出和前面的n是一样的道理。最后我们通过冒泡排序对这个顺序来重排,而冒泡排序采用的是是书上的例题的程序,使用的是一种双重循环的方法。
最后我们再通过排序后的这样一个数组输出,输出的方法也是和前面的方法是大致相同的。
实验结果演示:
附上代码:
DATAS SEGMENT
S1 db 'How many data to input?(less than equal to 100)','$'
S2 db 'Input ','$'
S3 db ' data,press[Enter] after input each data.','$'
S4 db 'Before sorting:','$'
S5 db 'After sorted:','$'
array dw 100 dup(?)
DATAS ENDS
STACKS SEGMENT
stack db 100h dup(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
XOR CX,CX
MOV DX,OFFSET S1
MOV AH,09H
INT 21H;9号调用 输出字符串S1
MOV DL,0AH;换行符
MOV AH,02H;2号调用 DL等于输出字符
INT 21H
MOV DL,10
L1:;(循环)输入数字n并显示 数字n保存在CX(可以loop)
MOV AH,1;1号调用 键盘输入回显 AL=输入字符
INT 21H
CMP AL,0DH;与回车比较(0AH是换行)
je L2;回车则跳L2
SUB AL,30H
AND AX,00FFH;AH清0 AL不变
MOV BX,AX
MOV AX,CX
MUL DL;8位乘法 AX<- AL*DL 十位数乘10
ADD AX,BX;十位加个位
MOV CX,AX;先把n保存到CX AX用来调用
CMP BL,0DH
JNZ L1
L2:
MOV DL,0AH
MOV AH,02H;2号调用 DL等于输出字符
INT 21H
MOV DX,OFFSET S2;
MOV AH,09H
INT 21H;9号调用 输出字符串S2
MOV AX,CX
MOV BH,10
MOV BL,0
XOR DX,DX
L3:;从低位到高位 把n压栈
DIV BH;AL<-AX/BH AH<-AX%BH
MOV DL,AH
ADD DX,30H
PUSH DX
INC BL;BL计数n的位数
AND AX,00FFH
CMP AL,0
JNZ L3
L4:;输出n
POP DX
MOV AH,02H;二号调用显示n
INT 21H
DEC BL
CMP BL,0
JNZ L4
MOV DX,OFFSET S3
MOV AH,09H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
MOV SI,0
MOV DI,10
XOR DX,DX
L6:;(循环)输入一个data
MOV AH,01H
INT 21H
CMP AL,0DH
JE L7
SUB AL,30H
AND AX,00FFH
MOV BX,AX
MOV AX,DX
MUL DI
ADD AX,BX
MOV DX,AX
CMP BL,0DH
JNE L6
L7:;输入n个data保存在数组内
MOV array[SI],DX
ADD SI,2
MOV DL,0AH
MOV AH,02H
INT 21H
XOR DX,DX
LOOP L6
MOV DX,OFFSET S4
MOV AH,09H;输出S4
INT 21H
SHR SI,1;SI/2
MOV CX,SI
MOV SI,0
L8:
MOV AX,array[SI]
MOV BH,10
MOV BL,0
XOR DX,DX
L9:;把1个data(循环)压栈,BL计数位数
DIV BH;AL<-AX/BH AH<-AX%BH
mov DL,AH
ADD DX,30H
PUSH DX
INC BL
AND AX,00FFH
CMP AL,0
JNZ L9
L10:;把一个data(循环)出栈
POP DX
MOV AH,02H
INT 21H
DEC BL
CMP BL,0
JNZ L10
MOV DL,32
MOV AH,02H
INT 21H
ADD SI,2
LOOP L8
MOV DL,0AH
MOV AH,02H
INT 21H
sort:;冒泡排序
SHR SI,1
MOV DX,SI
MOV CX,SI
DEC CX
loop1:
mov di,cx
mov bx,0
loop2:
mov ax,array[bx]
cmp ax,array[bx+2]
jle continue
xchg ax,array[bx+2]
mov array[bx],ax
continue:
add bx,2
loop loop2
mov cx,di
loop loop1
MOV CX,DX
MOV SI,0
MOV DX,OFFSET S5
MOV AH,09H
INT 21H
L11:;排序后输出
MOV AX,array[SI]
MOV BH,10
MOV BL,0
XOR DX,DX
L12:
DIV BH
MOV DL,AH
ADD DX,30H
PUSH DX
INC BL
AND AX,00FFH
CMP AL,0
JNZ L12
L13:
POP DX
MOV AH,2
INT 21H
DEC BL
CMP BL,0
JNZ L13
MOV DL,32
MOV AH,02H
INT 21H
ADD SI,2
LOOP L11
MOV AH,4CH
INT 21H
CODES ENDS
END START