zoukankan      html  css  js  c++  java
  • 8086汇编写冒泡排序并基于子程序设计输出结果

      写在前面:也是万年没更新博客了……大二一年快过去了回首一下发现大二完全就不更新博客……原因很多吧,其一是感觉整理博客虽然能够加深理解对学习帮助很大但是还是很花时间的,效益比较低,也是不如多看看书多刷刷题;其二也可以说是最主要的原因,大二一年比较功利,做事学习也是很侧重性价比,想绩点各方面刷好然后杠一个国家奖学金,因此很少更新博客。这次更新记录我们最后一次汇编实验,很基础但是完全自学然后强行撸掉之后,内心感觉还是很快乐的。就感觉这是我在大一的状态,全身心的攻克一个比较困难的题,怼上一整天的时间,最终收获的快乐是刷绩点哪都瞎几把水水无法比拟的。好了就感慨到这,下面上正文。

        1.1实验内容:

      设DATA1开始的内存单元中,存放着一串带符号字数据,要求采用冒泡排序算法(Bubble Sort)按照从小到大的顺序排序并将排好序的数据存在DATA1开始的单元。然后在显示 器输出排好序的数据,中间用’,’隔开。

      排序采用循环程序。

      输出数据使用子程序方式。

      PS:这里输出之所以需要做子程序,是因为只要和显示器输出有关都是和ASCII有关,需要做一步二进制到10进制以及数字到ASCII的转化。

        PPS:流程图没有传上来,因为比较大传上来应该不好看,参考文章后面的源代码不难画出流程图。

      1.2算法分析:

      这次实验内容相对于前几次,较为综合,因此我们在算法分析的时候需要进行模块化的分析,对各个模块进行逐一击破。

      1.2.1冒泡排序

        有过高级语言的学习基础对这个内容不会陌生,我们下面完成两个步骤,第一个再简单的用语言描述一下冒泡排序的思想和算法步骤,为下面的汇编程序设计打基础,第二我们就给出冒泡排序的汇编程序流程图。

        1.2.1.1冒泡排序算法思想:

        整体上分两层循环,假设第一层的指示变量是i,第二层指示变量为j,那么按照冒泡排序的思想,我们第一层循环一趟的目的,就是将这个数组倒数第i个位置的正确数值确定,为了完成外层循环的目的,内层循环就需要扫描数组第0~n-i个位置,比较相邻的两个位置,如果前面较大,则进行一次交换。

        1.2.1.2伪代码描述如下:

      

      Bubble_sort(A)
    
       1. For i = 0 to n - 1
       2.   For j = 1 to n - i
       3.      If(A[j] > A[j-1])
       4.         Exchange A[j] with A[j-1]
    

     1.2.2输出部分:

      按照题目要求,这里要利用子程序设计的方式进行输出。也就是我们在输出的时候,在外层设置一个循环控制,循环中对每个内存单元以10进制数形式进行输出即可。

      1.2.2.1算法整体思想:

      首先来整体的考虑下这个算法设计需要注意什么问题,题目要求中明确给出了是有符号数,因此这里面在输出的时候为了直观,我们需要将符号-’给体现出来,这就要求算法设计的时候需要考虑数字的正负。其次我们还需要考虑如何根据机器数转化成对应的10进制数,与高级语言类似,我们设置迭代过程,利用DIV指令,对原始数据多次除10,并将余数取出压栈,然后加上对应的数值(30H)得到对应数字的ASCII码,然后输出即可。

     

     1.3 代码

    DATAS SEGMENT
        DATA DB  127 , 1 , 0 , -1  ,-128;1字节表示的带符号整数范围是-128~127这里出边界数据测试溢出
        COUNT DB  5
    DATAS ENDS

    STACKS SEGMENT
        ;此处输入堆栈段代码
    STACKS ENDS

    CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS,SS:STACKS
    START:
        MOV AX,DATAS
        MOV DS,AX
        MOV CL , 0H
        
        
         ;冒泡排序开始
          MOV CL , COUNT;外层循环指示变量
    OUTLOOP:    
         MOV AL , CL;内部循环指示变量初始化
          DEC AL
          MOV CH , AL
          MOV BX , OFFSET DATA + 1;数据指针
    INLOOP:
          MOV AH , [BX-1]
          MOV AL , [BX]
          CMP AH , AL
          JL NOT_CHANGE
          MOV [BX] , AH
          MOV [BX - 1] , AL
          NOT_CHANGE :
          INC BX
          DEC CH
          JNZ INLOOP
          DEC CL
          CMP CL  , 1
          JNZ OUTLOOP  ;冒泡排序结束
         
         ;开始进行输出

         MOV BX , OFFSET DATA
        MOV CL , COUNT
    PRINT_LOOP:
         MOV AL , [BX]
         MOV AH , 00H
         INC BX
         CALL FUN
         DEC CL
         JZ ENDD
         MOV AH , 02H
         MOV DX , ','
         INT 21H
         AND CL , CL           
         JNZ PRINT_LOOP
           
    ENDD:
         MOV AH,4CH
         INT 21H

        
        
    FUN PROC NEAR    
        ;MOV DL , 10
    NEGTIVE:
        PUSH CX
        MOV CL , 00H
        AND AL , AL
        JNS POSTIVE
        PUSH AX
        MOV AH , 02H
        MOV DX , '-'
        INT 21H
        POP AX
        NEG AL
    POSTIVE:
        MOV DL , 10
        DIV DL      ;[AX]/10  AL是商 , AH是余数
        MOV DL , AH
        AND AH , 0H ;清空余数
        ADD DL , 48
        MOV DH , 00H
        PUSH DX
        INC CL
        AND AL , AL
        JNZ POSTIVE
       
    PRINT:
        POP DX
        MOV AH , 02H
        INT 21H
        DEC CL
        JNZ PRINT
        
        POP CX
        RET
    FUN ENDP    
        
    CODES ENDS
        END START
  • 相关阅读:
    [Unity3D]计时器/Timer
    unity缓存和浏览器缓存
    unity3d进行脚本资源打包加载
    Unity3d删除无用的美术资源
    项目经理的职责(转载)
    LINQ
    生意经
    Android ListView标题置顶效果实现
    ListView的自动循环滚动显示
    郭霖的专栏
  • 原文地址:https://www.cnblogs.com/rhythmic/p/6887911.html
Copyright © 2011-2022 走看看