首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

请各位老师看看这个排序输出程序有什么有关问题

2012-02-29 
请各位老师看看这个排序输出程序有什么问题从输入有符号的10进制数,将其排序并输出,可是输出结果不对,还

请各位老师看看这个排序输出程序有什么问题
;从输入有符号的10进制数,将其排序并输出,可是输出结果不对,还请各位老师错在哪了?


        M_DIRECT     MACRO           STRING                                                                                     ;定义一个宏,调用09号DOS功能在屏幕上显示一个字符串
                            MOV               DX,OFFSET   STRING
                            MOV               AH,09
                            INT               21H
                            ENDM

                DATA     SEGMENT
                COUNT_NUM     DB                 'The   count   of   numbers   to   sort:$ '                       ;提示输入要排序的数据的个数
                INMSG     DB                 'Please   input   the   sorting   numbers: ',0dh,0ah, '$ '                         ;提示输入要排序的数据
                OUTMSG     DB                 'The   sorting   result: ',0dh,0ah, '$ '                           ;在屏幕上提示排好续的数据
                COUNT   =                   100
                WTEMP   DW                 ?
                ARRAY     DW               COUNT   DUP(?)                                                                         ;用来保存输入的数据
                CRLF     DB                 13,10, '$ '                                                                               ;实现回车换行的功能,13→0DH,回车;10→0AH,换行
                LEN     DW                   ?                                                                                               ;保存实际输入的数据的个数


                DATA     ENDS
                CODE     SEGMENT
                MAIN     PROC             FAR
                            ASSUME         CS:CODE,DS:DATA
         
         
  ;************************************************************************************************        
         
            START:
                            PUSH             DS
                            SUB               AX,AX                                                                                       ;置AX为0
                            PUSH             AX
                            MOV               AX,DATA                                                 ;将数据段的地址送到DX中
                            MOV               DS,AX

                            M_DIRECT                     COUNT_NUM                                       ;宏调用,在屏幕上提示输入要输入的数据的个数
                                                                                                             
                            CALL             READ                                             ;调用子程序P-GETNEW,输入要输入的数据的个数
                            MOV               CX,AX
                            MOV               LEN,AX
                            LEA               BX,ARRAY


                            MOV               AH,09                                                     ;调用09号功能,实现回车换行
                            LEA               DX,CRLF                                                
                            INT               21H                                                         ;屏幕提示输入要排序的数据
                            M_DIRECT                     INMSG
    GETNUMBER:                                                                                       ;输入数据保存到ARRAY中
                            CALL             READ
                            MOV               [BX+SI],DX
                            ADD               SI   ,2
                            LOOP             GETNUMBER
              SORT:                                                                                       ;调用SORT子程序排序
                            CALL             data_SORT                                                  
                            MOV               AH,09
                            LEA               DX,CRLF
                            INT               21H
                            M_DIRECT                     OUTMSG


                            CALL             OUTPUT                                               ;输出排好序的数据
                            ;RET
                MAIN     ENDP      
     
     
;****************************************************************************************

;读入数据

;******************************************************************************************      
     
     
        READ             PROC                                                                           ;从键盘上输入一个数据的子程序
                            PUSH   BX
                            PUSH   CX  
                            PUSH   DX
                            XOR   BX,BX
                            XOR   CX,CX
                            MOV   AH,1
                            INT   21H
                            CMP   AL, '+ '
                            JZ   READ1
                            CMP   AL, '- '
                            JNZ   READ2
                            MOV   CX,-1
        READ1:         MOV   AH,1
                            INT   21H
        READ2:         CMP   AL, '0 '
                            JB   READ3
                            CMP   AL, '9 '
                            JA   READ3
                            SUB   AL,30H
                           
                            SHL   BX,1


                            SHL   BX,1
                            ADD   BX,DX
                            MOV   AH,0
                            ADD   BX,AX
                            JMP   READ1
        READ3:         CMP   CX,0
                            JZ   READ4
                            NEG   BX
        READ4:         MOV   AX,BX
                            POP   DX
                            POP   CX
                            POP   BX
                            RET
        READ             ENDP      
       
;*******************************************************************************************

;排序子程序

;********************************************************************************************      

data_SORT         PROC
                PUSH   BX
                PUSH   CX  
                PUSH   DX        
                MOV   SI,OFFSET   LEN
                MOV   CX,[SI]
                mov   ax,data
                mov   ds,ax
                ;MOV   SI,OFFSET   ARRAY
                ;MOV   DX,[SI]
                ;mov   cx,4
                dec   cx
                mov   bx,0
                  mov   si,0
you:         mov   di,cx
                mov   ax,array[si]
                mov   bx,si
twop:         cmp   ax,array[bx+2]
                jle   on1
                mov   ax,array[bx+2]
                mov   dx,bx
                  inc   dx
                  inc   dx


on1:         inc   bx
                inc   bx
                dec   di
                cmp   di,0
                jnz     twop
                xchg   ax,array[si]
                mov   bx,dx
                mov   array[bx],ax
                inc   si
                inc   si
                loop   you
              ;mov   ah,4ch
                ;int   21h
                            POP   DX
                            POP   CX
                            POP   BX
data_SORT   ENDP


;************************************************************************************

;数据输出

;**************************************************************************************
      OUTPUT           PROC                                                                         ;数据输出子程序
                            MOV               CX,LEN
                            MOV               BX,OFFSET   ARRAY                                                  
        AGAIN:         MOV   AX,[BX]
                            MOV   WTEMP,AX
                            JMP   WRITE
                            ADD   BX,2
                            MOV   AH,09H
                            LEA   DX,CRLF
                            INT   21H
                            LOOP   AGAIN
        WRITE:         PUSH   AX
                            PUSH   BX
                            PUSH   DX


                            MOV   AX,WTEMP
                            TEST   AX,80h;AX
                            JNZ     WRITE1
                            MOV   DL, '0 '
                            MOV   AH,2
                            INT   21H
                            JMP   WRITE5
        WRITE1:       JNS   WRITE2
                            MOV   BX,AX
                            MOV   DL, '- '
                            MOV   AH,2
                            INT   21H
                            MOV   AX,BX
                            NEG   AX
        WRITE2:       MOV   BX,10
                            PUSH   BX
        WRITE3:       CMP   AX,0
                            JZ   WRITE4
                            SUB   DX,DX
                            DIV   BX
                            ADD   DL,30H
                            PUSH   DX
                            JMP   WRITE3
        WRITE4:       POP   DX
                            CMP   DL,10
                            JE   WRITE5
                            MOV   AH,2
                            INT   21H
                            JMP   WRITE4
        WRITE5:       POP   DX
                            POP   BX
                            POP   AX                                              


                            RET
      OUTPUT           ENDP  
  ;****************************************************************************
 
 
 
  ;*****************************************************************************
 
  CODE   ENDS
  END   START

[解决办法]
自己先看数据输入完了是不是正确,如果正确在看排序有没有问题
只贴程序没有人给你调试的

热点排行