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