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

实验六  排序实验

更多微机实验:https://blog.csdn.net/yxp189/column/info/39992 

                         汇编语言-微机原理与接口技术-实验

注意未经允许,请勿转载!

           转载请标明出处~

适用课程:微机原理与接口技术(实验)

选用教材:微型计算机原理与接口技术-中国科学技术大学出版社

 

一、实验要求和目的  

  1.掌握用汇编语言编写排序程序的思路和方法

  2.熟悉汇编语言分支程序基本指令的使用方法;

  3.掌握利用汇编语言实现单分支、双分支、多分支的程序设计方法。

二、实验内容

  从键盘任意输入10个数,要求把这些数从小到大排序,并将结果输出在屏幕上。

 

实验代码:

(冒泡排序.asm)

;Author:YXP
;CSDN:yxp189
;Email:yxp189@protonmail.com
;如有问题,欢迎和我联系~
;转载请标明出处~

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

 

  • 17
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值