实验来源
华南农业大学 华农 数学与信息学院 软件学院 汇编语言程序设计实验课
实验内容
编写一个汇编语言程序,实现先输入一个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
最后
如果对机器学习和NLP感兴趣可以来知乎一起交流学习呀:
https://www.zhihu.com/people/da-shu-22-92-78