微机原理实现冒泡排序
废话不说先放题目
实验目的
1) 学会从键盘中读取输入,并将其ASCII码进行转化。
2) 利用所学的冒泡排序对数组进行输出
3)学会使用中断程序进行字符的输出。
实验所用仪器及使用方法
Windows + emu8086仿真软件
打开emu8086软件,复制代码点击run(运行),然后在终端中输入自己想要排序的一个数组,***切记不要输入除了数字和空格和回车的其他字符。***程序以自己输入回车键结束
实验基本原理及步骤(或方案设计及理论计算)
- 数据读取并且转化
2)使用双循环冒泡排序对输入的数据进行排序
3)调用数字输出函数计算得到每一位(十进制)的ASCII码,并从高位入栈,然后再循环出栈并且输出就可以得到10进制数在屏幕上进行显示。
实验结果与分析(图表等)
由于自己设定的输入数字在255以内,所以没有输入更大的数字。在小于255的数字排序下,程序都可以正确的运行,上图是实验代码正确性过程中中截取的一张照片,上面一行为输入,第二行为降序输出。
只要自己输入的数据在0~255以内,并且输入的数字不超过100个数字,那么测试的结果一般是没有什么问题的。
代码附录
DATA SEGMENT ;定义数据段
buf db 100 dup(0)
n db 0
printInt_div dw 100,10,1
printInt_res db 0,0,0,"$"
DATA ENDS
CODE SEGMENT ;定义代码段
ASSUME CS: CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
call getInt
mov bx,0
lp1:
mov di,bx
inc di
lp2:
mov al,buf[bx]
mov cl,buf[di]
cmp al,cl
jae els
mov buf[bx],cl
mov buf[di],al
els:
inc di
mov ax,di
mov ah,al
cmp ah,n ;内循环below and equal n
jbe lp2
inc bx
cmp bl,n
jb lp1
mov al,10
call putchar
mov ch,0
mov cl,n
mov bx,0
lp3:
mov ah,0
mov al,buf[bx]
call putInt
mov al,' '
call putchar
inc bx
loop lp3
MOV AH,4CH
INT 21H
putchar:
pushf
push DX
mov DX,AX
mov AH,02H
int 21h
pop DX
popf
ret
getInt:
;普通输入数字返回输入的数字ax(zf=1),,,特殊情况(esc键和tab键zf=0)esc键返回ax=0(zf=0),tab返回ax=1(zf=0)
;可以用jz判断是否发生了特殊情况。用ax区分发生了esc还是tab
push BX ;保护现场
push DX
push CX
;此处不能pushf,因为flags是返回值
mov AX,0 ;初始化
mov BX,0
mov CX,0
mov DX,0
getInt_XUNHUAN:
mov AH ,01H
int 21H ; 输入一个字符,一定存储在 AL 中
cmp AL,0DH ; 判断回车符
jz getInt_RESULT ; zf=0 判断是回车
cmp AL,30H
jb getInt_OTHER_ERROR ; < 0
cmp AL,39H ;<= 9 && > 0
jbe getInt_SUM_TO_AX
jmp getInt_XUNHUAN ;继续循环
getInt_SUM_TO_AX:
mov AH,0 ;清除 AX 高位
push AX ;保存 AX
mov AX,CX ;将原先的值乘以 10 ,实质上乘起来的值放在了 CX 中
mov BX,10
mul BX
mov DX,0
mov CX,AX
pop AX
sub AL,30H
mov bx,0
mov bl,n
add CX,AX
mov buf[bx],cl
jmp getInt_XUNHUAN
getInt_OTHER_ERROR:
; cmp al,20h ;在这里只考虑输入数字和空格 enter键
; je if_space
; jmp
cmp cx,0
je if_0 ;cx等0
mov dl,n
inc dl
mov n,dl
mov cx,0
jmp getInt_XUNHUAN ;cx不等0
if_0:
cmp n,0
jne not_n_0
not_n_0:
mov dl,n
inc dl
mov n,dl
jmp getInt_XUNHUAN
getInt_RESULT:
cmp cx,0
jne if_not_0
mov AX,CX
pop BX ;恢复现场
pop DX
pop CX
ret
if_not_0:
mov dl,n
inc dl
mov n,dl
mov AX,CX
pop BX ;恢复现场
pop DX
pop CX
ret
putInt:
pushf
push ax
push bx
push cx
push dx
push di
push si
mov cx,0
ddiv:
mov dl,10
div dl ;除法指令的被除数是隐含操作数,此处为dx:ax,商ax,余数dx
add ah,30H ;商加上48即可得到相应数字的ASCII码
inc cx
mov dl,ah
mov ah,0
push dx
cmp al,0 ;al是商
jne ddiv
leadzero:
pop dx
mov ah,02h
int 21h ;调用DOS功能,该功能为显示DS:DX地址处的字符
loop leadzero
pop si
pop di
pop dx
pop cx
pop bx
pop ax
popf
RET
CODE ENDS ;代码段结束
END START ;汇编结束