汇编程序语言 输入数字n和n个数字并对n个数字排序(带部分注释)

实验来源

华南农业大学 华农 数学与信息学院 软件学院 汇编语言程序设计实验课

实验内容

编写一个汇编语言程序,实现先输入一个0-100的数N,然后输入N个数,以回车结束每个数字并显示在屏幕上,再将未排序前和从小到大排序后的结果显示在屏幕上。实验结果应达到如下的一个界面:汇编程序语言 输入数字n和n个数字并对n个数字排序(带部分注释)_第1张图片

实验过程

本次汇编语言程序设计要求的是对n个数进行排序,首先我们要定义程序结果的那些字符串以及这个n个数的一个数组。同时我们应该设置一个堆栈段来实现数的显示。

接着我们可是程序的正式开始部分,我们通过9号调用来输出我们所要展示的字符串,然后用换行符来换行,接着我们输入数字n,循环输入数字的每一位并显示出来,然后将数字n保存在cx里面。这其中应该通过1号调用程序来实现数字的回显。

然后我们要从低位到高位,把数字n进行压栈操作,保留这个数字的一个顺序之后再出栈来显示出这个数字n。再通过把数字n放在cx里面,可以作为后面循环输入n个数字的一个loop的次数。

接着我们通过输入n个data并保存在数组array里面。data的输入和输出和前面的n是一样的道理。最后我们通过冒泡排序对这个顺序来重排,而冒泡排序采用的是是书上的例题的程序,使用的是一种双重循环的方法。

最后我们再通过排序后的这样一个数组输出,输出的方法也是和前面的方法是大致相同的。

实验结果演示:

汇编程序语言 输入数字n和n个数字并对n个数字排序(带部分注释)_第2张图片

附上代码:

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

你可能感兴趣的:(课程)