论坛: 编程破解 标题: 用冒泡法对一组输入资料排序,并将排序后的结果显示出来。 复制本贴地址    
作者: langzigzl [langzigzl]    论坛用户   登录
用冒泡法对一组输入资料排序,并将排序后的结果显示出来。
哪位哥哥 姐姐 能帮忙修改一下 谢谢了


.MODEL SMALL
.DATA
    DSI0 DB 'input  the number of data!$'
    DSI1 DB 'INPUT  ERROR!!$'
    DSI2 DB 'input  the data!(1-255)!!$'
    DSI3 DB 'the data you wanted is:$'
    DSI4 DB 'Are you want to exit ? (y/n)$'
    DSI5 DB 'Are you want to exit ? (y/n)$'
    m_number DB 0H
    m_n db ?
    m_number2 db 0h
    m_d2 Dw 0
    m_d1 db ?
    m_d3 Dw ?
    array db 256 dup(?)
    m_bit dw ?
    m_x DB ?
    m_y DB ?
.stack  100H
.CODE
.STARTUP
main: call input              ;主程序
call maopao
call xianshi
call scanq
input proc near
MOV   AL,3                    ;清屏
MOV AH,0
INT 10H
mov dx,offset dsi0            ;提示输入资料个数
mov ah,09h           
int 21h
call scan
mov ax,m_d2
mov m_number,al
mov m_n,al
mov m_number2,al
mov al,3
mov ah,0
int 10h
mov dx,offset dsi2    ;提示输入资料
mov ah,09h
int 21h
LEA SI,ARRAY          ;将ARRAY的偏移量送入SI
mov m_d2,0
mov m_bit,0
ll: call scan          ;循环输入规定个数的资料
mov al,3
mov ah,0
int 10h
mov ax,m_d2
MOV [SI],al
mov dl,[si]
inc si
lp: sub m_number,1
cmp m_number,0
mov dx,offset dsi2
mov ah,09h
int 21h
mov m_bit,0
jnz ll
ret
input endp
maopao  proc  near        ;将输入的所有资料用冒泡法排序
sub m_number2,1
mov  dl,0ffh
mov  bl,m_number2
gooni: cmp  dl,0ffh
jne  ok
xor  dl,dl
mov  cl,m_number2
lea  si,array
goonj: mov  al,[si]
cmp  al,[si+1]
jbe  next
xchg  al,[si+1]
mov  [si],al
mov  dl,0ffh
next: add  si,1
dec  cl
cmp  cl,0
jnz  goonj
dec  bl
jnz  gooni
ok: ret
  maopao  endp
xianshi proc near                  ;显示排序后的所有资料
lea si,array
mov al,3
mov ah,0
int 10h
mov dx,offset dsi3
mov ah,09h
int 21h
MOV   AH,6
MOV   DL,' '
INT   21H
MOV   AH,3
MOV   BH,0
INT   10H
MOV   m_x,DL
MOV   m_y,DH
MOV   AH,2
MOV   BH,0
DEC   m_x
MOV   DL,m_x
MOV   DH,m_y
sub   dl,17h
add   dh,01h
INT   10H
dp: mov   ah,0
mov   al,[si]
call   display
inc   si
MOV   AH,6
MOV   DL,' '
INT   21H
sub   m_n,1
mov   bl,m_n
cmp   m_n,0
jnz   dp
ret
  xianshi endp
SCAN proc near                  ;输入字符并转换成数据保存
MOV AH,01H
INT      21H
.IF      AL==0DH
JMP SCAN1
.ENDIF
.IF    AL>2FH && AL<3AH      ;将输入字符的ASCII码转换成数据
SUB AL,30H
INC      m_bit
MOV m_d1,AL
      .ELSE
CALL DISNULL                    ;若输入字符在0~9之外则调用DISNULL
JMP SCAN
.ENDIF
MOV AH,00H
.IF      m_bit==1
MOV      AL,m_d1
MOV m_d2,Ax
.ENDIF
.IF      m_bit==2
MOV Ax,m_d2
MOV      CX,0aH
MUL      CX
MOV m_d2,Ax
MOV AL,m_d1
ADD m_d2,Ax
.ENDIF
.IF m_bit==3
MOV Ax,m_d2
        MOV    m_d3,AX
MOV    CL,0aH
MUL CL
MOV m_d2,Ax
MOV AL,m_d1
ADD m_d2,Ax
.ENDIF
        .IF    m_d2>0FFH
CALL DISNULL
        MOV    AX,m_d3
MOV m_d2,Ax
        .ENDIF
        JMP SCAN
SCAN1:
.IF m_bit==0
        MOV  DX,OFFSET DSI1
        MOV  AH,9H
INT 21H
.ENDIF
ret
  scan endp
  SCANQ PROC NEAR                    ;扫描键盘输入
MOV   AH,3
MOV   BH,0
INT   10H
MOV   m_x,DL
MOV   m_y,DH
MOV   AH,2
MOV   BH,0
DEC   m_x
MOV   DL,m_x
MOV   DH,m_y
mov   dl,0
inc   dh
INT   10H
MOV DX, OFFSET DSI5
MOV AH,9
INT 21H
SCANQ1:
CLI
        MOV    AH,1
        INT    21H
.IF     AL==79H           ;若输入y则退出程序
        MOV    AX,4C00H
INT    21H
      .ENDIF
      .IF    AL==6eH   ;若输入n则继续运行程序
      MOV   AL,3
      MOV    AH,0
      INT    10H
      MOV    DX,OFFSET DSI0  
      MOV    AH,9
      INT    21H
      MOV    AH,3
      MOV    BH,0
      INT    10H
      MOV    m_x,DL
      MOV    m_y,DH
      jmp main
      .ELSE
      CALL    DISNULL
      JMP    SCANQ1
      .ENDIF
      RET
SCANQ   ENDP
  DISPLAY PROC NEAR            ;显示单个数据的子程序
PUSH DX
        PUSH CX
        PUSH BX
        MOV CX,0
        MOV BX,10
DISPX1: MOV DX,0
        DIV BX
        PUSH DX
        INC CX
        OR AX,AX
        JNZ DISPX1
DISPX2: POP DX                    ;将资料转换成ASCII码
        MOV AH,6
        ADD DL,30H
        INT 21H
LOOP DISPX2
POP BX
POP CX
POP DX
RET
DISPLAY ENDP
DISNULL  PROC FAR                ;处理输入超出0~9范围的资料的子程序
  MOV   AH,3                ;读游标位置
  MOV   BH,0
  INT   10H
  MOV   m_x,DL
  MOV   m_y,DH
  MOV   AH,2                ;将游标横坐标左移一位
  MOV   BH,0
  DEC   DL
  INT   10H
  MOV   AH,6                ;用空格代替超出范围的资料
  MOV   DL,' '
  INT   21H
  MOV   AH,2                ;置游标位置于空格前面
  MOV   BH,0
  DEC   m_x
  MOV   DL,m_x
  MOV   DH,m_y
  INT   10H
  RET
DISNULL  ENDP
    end



[此贴被 286(unique) 在 11月21日09时30分 编辑过]

地主 发表时间: 05-11-19 08:03

回复: mydear00 [mydear00]   论坛用户   登录
学单片机的,这个你都会,真利害,我原来学老师说设计个红绿灯程序我都没做出来,不过也毕业了,
想帮你,不行呀

B1层 发表时间: 05-11-19 20:01

回复: ProgramLive [coolcall]   论坛用户   登录
这是电脑汇编吧,没看到调用DOS功能吗?


B2层 发表时间: 05-11-20 18:14

回复: yzlz2008 [yzlz2008]      登录
好强啊.什么时候教教小弟啊

B3层 发表时间: 05-11-25 10:57

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号