微机原理实现冒泡排序
废话不说先放题目
实验目的
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 0printInt_div dw 100,10,1printInt_res db 0,0,0,"$"
DATA ENDS
CODE SEGMENT ;定义代码段ASSUME CS: CODE,DS:DATA
START: MOV AX,DATA MOV DS,AXcall getIntmov bx,0lp1:mov di,bxinc dilp2:mov al,buf[bx]mov cl,buf[di]cmp al,cljae elsmov buf[bx],clmov buf[di],alels:inc dimov ax,dimov ah,alcmp ah,n ;内循环below and equal njbe lp2inc bxcmp bl,njb lp1mov al,10call putcharmov ch,0mov cl,nmov bx,0lp3:mov ah,0mov al,buf[bx]call putIntmov al,' 'call putcharinc bxloop lp3MOV AH,4CHINT 21H
putchar:pushfpush DXmov DX,AXmov AH,02Hint 21hpop DXpopfretgetInt: ;普通输入数字返回输入的数字ax(zf=1),,,特殊情况(esc键和tab键zf=0)esc键返回ax=0(zf=0),tab返回ax=1(zf=0);可以用jz判断是否发生了特殊情况。用ax区分发生了esc还是tabpush BX ;保护现场push DX push CX ;此处不能pushf,因为flags是返回值mov AX,0 ;初始化 mov BX,0mov CX,0mov DX,0
getInt_XUNHUAN:mov AH ,01Hint 21H ; 输入一个字符,一定存储在 AL 中cmp AL,0DH ; 判断回车符 jz getInt_RESULT ; zf=0 判断是回车cmp AL,30Hjb getInt_OTHER_ERROR ; < 0cmp AL,39H ;<= 9 && > 0jbe getInt_SUM_TO_AX jmp getInt_XUNHUAN ;继续循环 getInt_SUM_TO_AX: mov AH,0 ;清除 AX 高位push AX ;保存 AXmov AX,CX ;将原先的值乘以 10 ,实质上乘起来的值放在了 CX 中 mov BX,10mul BX mov DX,0mov CX,AX pop AXsub AL,30Hmov bx,0mov bl,nadd CX,AXmov buf[bx],cl jmp getInt_XUNHUAN getInt_OTHER_ERROR:
; cmp al,20h ;在这里只考虑输入数字和空格 enter键
; je if_space
; jmpcmp cx,0je if_0 ;cx等0mov dl,ninc dlmov n,dlmov cx,0jmp getInt_XUNHUAN ;cx不等0if_0:cmp n,0jne not_n_0not_n_0:mov dl,ninc dlmov n,dl jmp getInt_XUNHUAN getInt_RESULT:cmp cx,0jne if_not_0mov AX,CXpop BX ;恢复现场pop DX pop CXret if_not_0:mov dl,ninc dlmov n,dlmov AX,CXpop BX ;恢复现场pop DX pop CXret putInt:pushfpush axpush bxpush cxpush dxpush dipush si mov cx,0 ddiv:mov dl,10 div dl ;除法指令的被除数是隐含操作数,此处为dx:ax,商ax,余数dxadd ah,30H ;商加上48即可得到相应数字的ASCII码 inc cx mov dl,ahmov ah,0push dxcmp al,0 ;al是商 jne ddivleadzero:pop dx mov ah,02hint 21h ;调用DOS功能,该功能为显示DS:DX地址处的字符 loop leadzeropop sipop dipop dxpop cxpop bxpop axpopf RET
CODE ENDS ;代码段结束
END START ;汇编结束