汇编冒泡排序

来源:互联网 发布:淘宝阿迪达斯旗舰店 编辑:程序博客网 时间:2024/04/30 17:10
DATA SEGMENTARRAY DW 100 DUP(?)MESS1 DB 0DH,0AH,'PLEASE INPUT THE NUMBER OF THE INTEGER YOU WANT TO INPUT(<100)',0DH,0AH,'$'MESS2 DB 0DH,0AH,'PLEASE INPUT A INTEGER',0DH,0AH,'$'MESS4 DB 0DH,0AH,'THE SORTED ARRAY',0DH,0AH,'$'BUFFER DB 81,?,80 DUP(?)LEN DW ?MD DW 10INDEX DW ?TIMES DW ?BLANK DB ' ','$'LINEBREAK DB 0AH,0DH,'$'LETTER DB '0123456789ABCDEF'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATA      MOV DS,AX      LEA DX,MESS1      MOV AH,09H      INT 21H      LEA DX,BUFFER        ;输入要输入数字个数      MOV AH,0AH      INT 21H      LEA SI,BUFFER          ;下面将要输入个数从字符转化为数字,实际上下面输入的时候也用到,写成子程序会简单很多      MOV CL,[SI+1]      MOV CH,0      ADD SI,2      MOV AX,0      TRANS:MUL MD            MOV DL,[SI]            SUB DL,'0'            MOV DH,0            ADD AX,DX            INC SI            LOOP TRANS      MOV LEN,AX      MOV CX,LEN   GETN:LEA DX,MESS2              ;将输入数字转化为十几数值存在数组里,注意计算下标的时候dw下标是db数组的二倍      MOV AH,09H      INT 21H      LEA DX,BUFFER      MOV AH,0AH      INT 21H      MOV AX,LEN      MOV INDEX,AX      SUB INDEX,CX      PUSH CX      LEA SI,BUFFER      MOV BL,[SI+1]      MOV BH,0      MOV CX,BX      ADD SI,2      MOV AX,0      LOP0:MUL MD           MOV DL,[SI]           SUB DL,'0'           MOV DH,0           ADD AX,DX           LOOP LOP0      PUSH AX      MOV AX,INDEX      MOV BX,2      MUL BX      MOV SI,AX      POP AX      MOV ARRAY[SI],AX      POP CX      LOOP GETN        CMP LEN,1                      JZ OVER      MOV CX,LEN             ;下面是冒泡排序      DEC CX                  ;外层循环的次数 总个数减一 LOP1:PUSH CX                   ;把外层循环的次数记录先保护,然后用当前数值做内层循环的次数       LEA SI,ARRAY      MOV DX,0                  ;标记,记录这一次外层循环中是否发生了数值交换,如果没有,就可以跳出      LOP2:MOV AX,[SI+2]           ;相当于a[j+1] 和a[j]进行比较           CMP AX,[SI]           JNB  GOON                ;如果a[j]<=a[j+1]    不用交换           XCHG AX,[SI]           MOV [SI+2],AX           MOV DX,1                    ;有数值交换就将标志置为一           GOON:           ADD SI,2           LOOP LOP2      POP CX      CMP DX,0      JZ OVER      LOOP LOP1      OVER:      LEA DX,MESS4      MOV AH,09H      INT 21H      MOV CX,LEN      LEA SI,ARRAY LOP3:PUSH CX      MOV TIMES,0      MOV AX,[SI]      OP:MOV DX,0         DIV MD         PUSH DX         INC TIMES         CMP AX,0         JNZ OP      ADD SI,2      LEA DX,BLANK      MOV AH,09H      INT 21H      MOV CX,TIMES      OUTPUT:POP AX             MOV AH,0             LEA BX,LETTER             XLAT             MOV DL,AL             MOV AH,02H             INT 21H             LOOP OUTPUT      POP CX      LOOP LOP3      MOV AX,4C00H      INT 21HCODE ENDSEND START      

这个程序没有解决负数的问题,如果要写的话就是每次判断第一个的字符是不是'-',然后取后面的数值,是负数的话最后neg一下,输出的时候neg取反成为正数,最后输出的时候先输出一个'-',太麻烦了实在不想写

还有就是冗余的问题,由于担心子程序会改变各个寄存器的状态没敢用,最后想象先PUSH一下最后POP就好了,那样看起来会简单许多


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

不贴图难受的分割线


原创粉丝点击