實驗六 排序實驗
更多微機實驗:https://blog.csdn.net/yxp189/column/info/39992
注意:未經允許,請勿轉載!
轉載請標明出處~
適用課程:微機原理與接口技術(實驗)
選用教材:微型計算機原理與接口技術-中國科學技術大學出版社
一、實驗要求和目的
1.掌握用彙編語言編寫排序程序的思路和方法
2.熟悉彙編語言分支程序基本指令的使用方法;
3.掌握利用彙編語言實現單分支、雙分支、多分支的程序設計方法。
二、實驗內容
從鍵盤任意輸入10個數,要求把這些數從小到大排序,並將結果輸出在屏幕上。
實驗代碼:
(冒泡排序.asm)
;Author:YXP
;CSDN:yxp189
;Email:[email protected]
;如有問題,歡迎和我聯繫~
;轉載請標明出處~
DATAS SEGMENT
STRING DB 100 DUP(?)
NUM DW 10 DUP(?)
SUM DW 0
COUNT DW 1
COUNTN DW 0
NUMGE DW 0;真正的數字的個數
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV SI,OFFSET STRING
L1: MOV AH,01H ;輸入數字(以字符形式)
INT 21H
MOV [SI],AL
CMP AL,0DH
JZ L2
INC SI
JMP L1
L2: MOV SI,OFFSET STRING ;輸入結束,將字符轉換成數字
MOV DI,OFFSET NUM
L3: MOV AL,[SI]
MOV AH,0
CMP AX,20H
JZ L4;如果這個字符是空格則跳到L4去
CMP AX,0DH;如果這個字符是回車則跳L4
JZ L4
INC SI
INC [COUNTN]
MOV CX,[COUNTN]
JMP L3
L4: DEC SI
MOV AL,[SI]
MOV AH,0
SUB AX,30H
MOV BX,AX;BX用來存放轉換成10進制的每個位的數
MOV AX,[COUNT];字與AL中的內容相乘,結果的低位放在AX中
MUL BX
ADD [SUM],AX;DX用來存放轉換成10進制的結果
MOV AX,0AH
MUL [COUNT]
MOV [COUNT],AX
LOOP L4
MOV AX,[SUM]
MOV [DI],AX
ADD DI,2
INC [NUMGE];用來算真正的數字有多少個
ADD SI,[COUNTN]
MOV AL,[SI]
CMP AL,0DH;判斷是不是回車,如果是回車則轉換結束
JZ L5
INC SI
MOV [COUNTN],0
MOV [COUNT],1
MOV [SUM],0;
JMP L3
L5: MOV SI,OFFSET NUM;排序
MOV CX,[NUMGE];真正的數字個數
DEC CX
MOV AX,0
MOV [COUNT],AX
L6: CMP CX,0;CX爲0說明已經到最後一個數了
JZ LL
MOV AX,[SI]
MOV BX,[SI+2]
CMP AX,BX
JA L7;如果AX比BX大,到L7去轉換
ADD SI,2
LOOP L6
LL: ;ADD SI,2
MOV AX,[COUNT]
CMP AL,0H
JZ L8;COUNT爲0說明本過程沒有進行排序,即排序已經成功
JMP L5
L7: PUSH AX
PUSH BX
POP AX
POP BX
MOV [SI],AX
MOV [SI+2],BX
ADD SI,2
INC [COUNT]
DEC CX
JMP L6
L8: MOV SI,OFFSET NUM
MOV CX,[NUMGE]
MOV [COUNT],CX
L9: MOV AX,[SI]
CMP AX,09H;如果數字小於9直接加30輸出
JA L10
ADD AX,30H
MOV DX,AX
MOV AH,02H
INT 21H
ADD SI,2
MOV AX,20H
MOV DX,AX
MOV AH,02H
INT 21H
MOV CX,[COUNT]
DEC [COUNT]
LOOP L9
JMP L15
L10:CMP AX,09FFH
JA L13;如果這溢出個數大於09FF,做除法會溢出,跳到L13去解決溢出問題
MOV BL,0AH;如果數字大於10,用16進制轉10進制的方法輸出;16進制轉10進制
MOV CX,0
L11:DIV BL
INC CX
MOV BL,AH;商放在AL中,餘數放在AH中
MOV BH,0
PUSH BX
MOV BL,0AH
CMP AL,0
JZ L12;如果商爲0,跳到L12
MOV AH,0
JMP L11
L12:POP AX;商爲0的情況
ADD AX,30H
MOV DX,AX;輸出
MOV AH,02H
INT 21H
LOOP L12
DEC [COUNT]
CMP [COUNT],0
JZ L15
ADD SI,2
MOV AX,20H
MOV DX,AX
MOV AH,02H
INT 21H
JMP L9
L13:MOV CX,0
L133:MOV DX,0
MOV BX,0AH
DIV BX
PUSH DX;32位的被除數,商放在AX,餘數放在DX
INC CX
MOV DX,0
;INC [COUNT]
;MOV CX,[COUNT]
CMP AX,0H;商爲0則結束
JZ L14
JMP L133
L14:POP AX
ADD AX,30H
MOV DX,AX
MOV AH,02H
INT 21H
LOOP L14
DEC [COUNT]
CMP [COUNT],0
JZ L15
ADD SI,2
MOV AX,20H
MOV DX,AX
MOV AH,02H
INT 21H
JMP L9
L15:MOV AH,4CH
INT 21H
CODES ENDS
END START