微机原理——排序(包含正负数)

输入N个数字,要求在一个字节允许范围内,进行排序,然后从大到小进行输出。(本文采用冒泡排序)
实现代码:

DATA SEGMENT
    N EQU 10
    NUMBER DB N DUP(?)
    STR1 DB 'INPUT 40 NUMBERS:','$'
    STR2 DB 'AFTER SORTED:','$' 
DATA ENDS
STACK SEGMENT 'STACK'
    DB 256 DUP(0)
STACK ENDS
CODE SEGMENT
    ASSUME CS:CODE,DS:DATA,SS:STACK
START:
    MOV AX,DATA
    MOV DS,AX
    MOV DX,OFFSET STR1
    MOV AH,9
    INT 21H
    MOV SI,OFFSET NUMBER
    MOV CX,0
GETDATA:
    INC CX 
    CALL INPUT
    MOV DS:[SI],BL
    ADD SI,1
    CMP CX,N
    JL GETDATA

    LEA DX,NUMBER 
    MOV CX,N
    CALL SORT2

    CALL NEWLINE
    LEA DX,STR2;输出提示二
    MOV AH,09H
    INT 21H

    LEA SI,NUMBER
    MOV CX,N 
    CALL TEN_PRINT   ;调用子程序输出排序后的数字序列

    MOV AH,4CH
    INT 21H
;正负数十进制输入子程序,BL为数据出口
INPUT PROC
    PUSHF
    PUSH AX
    PUSH CX
    XOR BX,BX
    XOR CX,CX
    XOR DX,DX

    MOV AH,1
    INT 21H
    CMP AL,'-'
    JNZ STEP2
    MOV CX,1
STEP1:
    MOV AH,1
    INT 21H
STEP2:
    CMP AL,'0'
    JB STEP3
    CMP AL,'9'
    JA STEP3
    SUB AL,30H
    MOV AH,0
    PUSH AX
    MOV AL,BL
    MOV DL,10
    IMUL DL
    MOV  BL,AL
    POP AX
    ADD BL,AL
    JMP STEP1
STEP3:
    CMP CX,0
    JZ EXIT
    NEG BL
EXIT:
    POP CX
    POP AX
    POPF
    RET
INPUT ENDP
;正负数十进制输出子程序,SI存入数据的表首地址,CX存入数据个数
TEN_PRINT PROC  
L1: MOV DI,CX
    MOV DL,[SI] 

    CMP DL,0      ;判断是否是负数
    JGE L3        ;JGE有符号数比较大小,不小于,不为负数,则转移到X3
    MOV DH,DL     ;先保存当前负数到DH

    MOV DL,'-'    ;输出'-'
    MOV AH,02H
    INT 21H

    NEG DH        ;转换成绝对值
    MOV DL,DH     ;将数值保存到DL,和正数一样输出
;正数的十进制输出   
L3: INC SI
    MOV CX,1   ;计数,初始值为1
    MOV BL,10   ;每次除10 
;进栈    
FIRST:          
    MOV AH,0   ;余数清零
    MOV AL,DL
    DIV BL     ;10
    PUSH AX    ;进栈,其中AH为余数,AL为商
    CMP AL,0   ;比较商是否为0
    JLE SECOND
    MOV DL,AL
    INC CX
    JMP FIRST
;出栈    
SECOND:
    POP DX      ;出栈,其中DH为余数,DL为商
    XCHG DH,DL  ;交换DH,DL,使余数存入DL
    ADD DL,30H  ;转为ASCII码
    MOV AH,02H
    INT 21H
LOOP SECOND

    MOV CX,DI
    CMP CX,1     ;最后一个数字后面不输出','
    JE L2
    MOV DL,','
    MOV AH,02H
    INT 21H

L2: LOOP L1
    RET      
TEN_PRINT ENDP        
;冒泡升序排序,CX中存数据个数,DX存数据的首地址      
SORT1 PROC
      DEC CX
T1:   MOV DI,CX     ;保存外循环次数
      MOV BX,DX     ;将NUMBER的首地址存到BX中
T2:   MOV AL,[BX]
      CMP AL,[BX+1]
      JLE T3
      XCHG AL,[BX+1]
      MOV [BX],AL
T3:   ADD BX,1
      LOOP T2       ;  两两比较完成
      MOV CX,DI
      LOOP T1       ;  每运行到此处一次说明又有一个最大数到未排序数的末尾
      RET
SORT1 ENDP
;冒泡降序排序,CX中存数据个数,DX存数据的首地址      
SORT2 PROC
    DEC CX
S1:
    MOV DI,CX
    MOV BX,DX
S2:
    MOV AL,[BX]
    CMP AL,[BX+1]
    JG S3 
    XCHG AL,[BX+1]
    MOV [BX],AL
S3:
    INC BX
    LOOP S2 
    MOV CX,DI
    LOOP S1
    RET
SORT2 ENDP
;输出换行
NEWLINE PROC
    PUSH AX
    PUSH DX
    MOV DL,0DH
    MOV AH,2
    INT 21H
    MOV DL,0AH
    MOV AH,2
    INT 21H
    POP DX
    POP AX
    RET
NEWLINE ENDP
CODE ENDS
    END START
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值