微机原理实现冒泡排序

微机原理实现冒泡排序

废话不说先放题目
在这里插入图片描述

实验目的

1) 学会从键盘中读取输入,并将其ASCII码进行转化。
2) 利用所学的冒泡排序对数组进行输出
3)学会使用中断程序进行字符的输出。

实验所用仪器及使用方法

Windows + emu8086仿真软件
打开emu8086软件,复制代码点击run(运行),然后在终端中输入自己想要排序的一个数组,***切记不要输入除了数字和空格和回车的其他字符。***程序以自己输入回车键结束

实验基本原理及步骤(或方案设计及理论计算)

  1. 数据读取并且转化
    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              ;汇编结束 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值