彙編程序語言 輸入數字n和n個數字並對n個數字排序(帶部分註釋)

實驗內容

編寫一個彙編語言程序,實現先輸入一個0-100的數N,而後輸入N個數,以回車結束每一個數字並顯示在屏幕上,再將未排序前和從小到大排序後的結果顯示在屏幕上。實驗結果應達到以下的一個界面:在這裏插入圖片描述數組

實驗過程

本次彙編語言程序設計要求的是對n個數進行排序,首先咱們要定義程序結果的那些字符串以及這個n個數的一個數組。同時咱們應該設置一個堆棧段來實現數的顯示。less

接着咱們但是程序的正式開始部分,咱們經過9號調用來輸出咱們所要展現的字符串,而後用換行符來換行,接着咱們輸入數字n,循環輸入數字的每一位並顯示出來,而後將數字n保存在cx裏面。這其中應該經過1號調用程序來實現數字的回顯。oop

而後咱們要從低位到高位,把數字n進行壓棧操做,保留這個數字的一個順序以後再出棧來顯示出這個數字n。再經過把數字n放在cx裏面,能夠做爲後面循環輸入n個數字的一個loop的次數。spa

接着咱們經過輸入n個data並保存在數組array裏面。data的輸入和輸出和前面的n是同樣的道理。最後咱們經過冒泡排序對這個順序來重排,而冒泡排序採用的是是書上的例題的程序,使用的是一種雙重循環的方法。設計

最後咱們再經過排序後的這樣一個數組輸出,輸出的方法也是和前面的方法是大體相同的。code

實驗結果演示:

在這裏插入圖片描述

附上代碼:

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
相關文章
相關標籤/搜索