欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【微机原理 实验】 排序实验(冒泡排序)(含汇编代码)

程序员文章站 2024-02-02 16:06:16
...

实验六  排序实验

更多微机实验: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