【微機原理 實驗】 排序實驗(冒泡排序)(含彙編代碼)

實驗六  排序實驗

更多微機實驗: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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章