天天看點

彙程式設計式語言 輸入數字n和n個數字并對n個數字排序(帶注釋)

實驗來源

華南農業大學 華農 數學與資訊學院 軟體學院 彙編語言程式設計實驗課

實驗内容

編寫一個彙編語言程式,實作先輸入一個0-100的數N,然後輸入N個數,以回車結束每個數字并顯示在螢幕上,再将未排序前和從小到大排序後的結果顯示在螢幕上。實驗結果應達到如下的一個界面:

彙程式設計式語言 輸入數字n和n個數字并對n個數字排序(帶注釋)

實驗過程

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

接着我們可是程式的正式開始部分,我們通過9号調用來輸出我們所要展示的字元串,然後用換行符來換行,接着我們輸入數字n,循環輸入數字的每一位并顯示出來,然後将數字n儲存在cx裡面。這其中應該通過1号調用程式來實作數字的回顯。

然後我們要從低位到高位,把數字n進行壓棧操作,保留這個數字的一個順序之後再出棧來顯示出這個數字n。再通過把數字n放在cx裡面,可以作為後面循環輸入n個數字的一個loop的次數。

接着我們通過輸入n個data并儲存在數組array裡面。data的輸入和輸出和前面的n是一樣的道理。最後我們通過冒泡排序對這個順序來重排,而冒泡排序采用的是是書上的例題的程式,使用的是一種雙重循環的方法。

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

實驗結果示範:

彙程式設計式語言 輸入數字n和n個數字并對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
           

繼續閱讀