;內容是編寫由鍵盤輸入10個4位的數據並將這些數由大到小或由小到大進行排序其結果輸出在顯示屏上的程序.
ASSUME?CS:CODE,?SS:STACK,?DS:DATA
DATA?SEGMENT
STR?DB?0AH,0DH,"Please?input?a?thousand?number:?",0AH,0DH,'$'
BUF?DB?5;緩沖區能容納的字符個數
DB?;系統自動存入用戶從鍵盤輸入的字符的個數(不包括回車)
DB?5?DUP?(?);存放用戶從鍵盤輸入的字符的ASCII碼(包括回車)
COUNT?EQU?10
NUMBER?DW?10?DUP?(0)
MULNUMBER?DW?
CRLF?DB?0AH,0DH,'$'
DATA?ENDS
STACK?SEGMENT
DB?16?DUP?(?)
STACK?ENDS
CODE?SEGMENT
START:MOV?AX,DATA
MOV?DS,AX;設置好數據段
MOV?AX,STACK
MOV?SS,AX;設置好數據段
MOV?SP,10H;設置好棧頂指針
MOV?DI,0
MOV?CX,COUNT;將10賦值給CX
INPUT:
PUSH?CX;因為下面會用到CX,所以為了不覆蓋CX的值,我們將CX存放在棧保存著
LEA?DX,STR
MOV?AH,9
INT?21H;顯示提示信息
LEA?DX,BUF
MOV?AH,10
INT?21H;接收用戶從鍵盤輸入的信息
LEA?SI,BUF+2;取BUF+2的偏移地址,然後賦值給SI,這個BUF+2的地址是存放用戶輸入的地址單元
MOV?BX,3
;下面的程序段是將用戶輸入的4個字符轉換成4位數(十六進制)
;TOTAL?=?千位的數字*1000+百位的數字*100+十位的數字*10+個
MOV?MULNUMBER,1;乘數
MOV?CL,BUF+1
NEXT:XOR?AX,AX
MOV?AL,[SI+BX];與用戶輸入的4位數的個位數
SUB?AL,30H;因為字符數字的ASCII碼是以30H+數字,所以數字=ASCII?-?30H
MUL?MULNUMBER;因為4位數不超過65535,所以我們不用裏DX中的值,因為只有乘出來的積打印65535,DX才會有變化
ADD?NUMBER[DI],AX;將積和TOTAL相加
XOR?AX,AX;AX清零
MOV?AL,10
MUL?MULNUMBER
MOV?MULNUMBER,AX;乘數*10
DEC?BX;指向高壹位
LOOP?NEXT
ADD?DI,2;指向NUMBER的下壹個字單元
POP?CX;恢復原來的CX的值
LOOP?INPUT;循環輸入
;接下來就是排序了
;這裏我們用冒泡排序,升序
;冒泡排序的思想是:從第壹個元素開始,依次對N個元素中相鄰的兩個元素進行比較
;若順序不滿足則交換,經過壹輪後,最大的元素就排到了最右邊.後面依次類推
MOV?CX,COUNT
DEC?CX
MOV?DI,0;最右邊有多少個元素,壹開始是0個
SEQU1:PUSH?CX
MOV?BX,0
MOV?CX,COUNT
SUB?CX,DI
SEQU2:MOV?AX,NUMBER[BX];前壹個元素
CMP?AX,NUMBER[BX+2];後壹個元素
JB?SEQU3;如果前壹個元素小於後壹個元素,就不要交換了
;以下4句是交換NUMBER[BX+2]和NUMBER[BX]地址的值
XCHG?AX,NUMBER[BX+2]
MOV?DX,NUMBER[BX]
MOV?NUMBER[BX+2],DX
MOV?NUMBER[BX],AX
SEQU3:ADD?BX,2
LOOP?SEQU2
INC?DI;右邊有壹個最大元素,DI+1
POP?CX
LOOP?SEQU1
;下面是將排好序的數顯示出來
LEA?SI,NUMBER
MOV?BX,0
MOV?CX,COUNT
DISPLAY:
PUSH?CX;保存CX的值
MOV?CX,10
XOR?DX,DX
MOV?AX,NUMBER[BX]
DIS1:DIV?CX
PUSH?DX;保存余數
XOR?DX,DX;DX清零,因為做字除法的時候,(DX,AX)都會參與運算,在這裏我們只需要AX運算,如果有DX運算的話,那麽結果會出錯
AND?AX,AX;測試AL(商是否為0)
JNZ?DIS1;如果不是0,說明沒有除盡,繼續循環
;輸出回車,換行
LEA?DX,CRLF
MOV?AH,9
INT?21H
;現在棧裏的元素是5個CX,DX,DX,DX,DX,而DX從左到有時個位,十位,百位,千位
;所以現在我們倒著輸出,就可以得到千,百,十,個
MOV?CL,4;四位數
DIS2:POP?DX
ADD?DL,30H
MOV?AH,2
INT?21H
LOOP?DIS2
ADD?BX,2;下壹個元素
POP?CX
LOOP?DISPLAY
MOV?AX,4C00H
INT?21H
CODE?ENDS?
END?START
結果圖:
上面還有數據沒有顯示,窗口限制沒有辦法