實驗來源
華南農業大學 華農 數學與資訊學院 軟體學院 彙編語言程式設計實驗課
實驗内容
編寫一個彙編語言程式,實作先輸入一個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