妩媚的女汗紙 發表於 2021-10-29 00:18:00

汇编语言冒泡排序

<pre><code># 汇编语言数组排序

#### 题目要求:

​        对输入的多个数字进行排序。

要求:

* 所有数字从键盘输入;

* 数字中至少包含一个大于 10 的数字;

* 排好序的数字以十进制形式在屏幕显示输出。



#### 代码:

```assembly
;-----数据段------------
DATAS SEGMENT
    string_1 DB 'Please input 10 numbers(0-65536):','$'
    string_2 DB 'ERROR: OVERFLOW! Please input again:','$'
    string_3 DB 'The array you have input is:',0ah,0dh,'$'
    string_4 DB 'After Sort the num is:',0ah,0dh,'$'
    string_5 DB ' ','$'
    DATADW 10 DUP(?)   
DATAS ENDS

;-----堆栈段------------
STACKS SEGMENT
    DW 256 dup(?)
STACKS ENDS

;-----代码段------------
CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS


;-----------程序开始------------
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV SI, 0;指针初始化
    MOV CX, 10 ;循环次数
;---------Input----------
    MOV DX, OFFSET string_1 ;Please input 10 numbers(0-65536)
    MOV AH, 9
    INT 21H
Lp:
    CALL Input
    ADD SI, 2
    Loop Lp
;--------结束输入,换行---------------
    CALL CRLF
    MOV DX, OFFSET string_3 ;'The array you have input is:'
    MOV AH, 9               ;首地址 DS:DX
    INT 21H
;-------输出 ----------------   
    MOV CX, 10
    MOV DI, 0
PUT:
    CALL Print
    CALL Space
    ADD DI , 2
    Loop PUT
;/******************************/
;----------Sort-----------
    MOV CX, 9
    MOV DI, 0
   
SORT_OUT:
    CALL Sort_in
    ADD DI, 2
    LOOP SORT_OUT

    CALL CRLF
    MOV DX, OFFSET string_4 ;'After Sort the num is:'
    MOV AH, 9
    INT 21H

    MOV CX, 10
    MOV DI, 0
PUT_SORT:
    CALL Print
    CALL Space
    ADD DI , 2
    LOOP PUT_SORT
    CALL CRLF


EXIT:
    MOV AH, 4CH
    INT 21H


;/************子程序调用****************/


;---------输入函数(单数字输入)------------
Input PROC Near
    push AX
    push BX
    push CX
    push DX


    MOV BX, 0
    CLC
    MOV DX, 0
;----------输入数字--------------
    Lp_0:
      MOV AH, 1
      INT 21H
      CMP AL, 20H ;空格
      JE L_CRLF

;-----   x belong to    ----------      
      SUB AL, 30H ; ASCII -&gt; int
      JL L_ERROR
      CMP AL, 9
      JG L_ERROR
;-------string -&gt; int   -----------
      MOV AH, 0   ;将 AL扩展成 AX
      XCHG AX, BX ;保护 AX值
      MOV CX, 10
      MUL CX      ; bx *= 10
      ADD AX , BX
      JC L_ERROR; OVERFLOW处理
      XCHG AX, BX
      JMP Lp_0
    L_ERROR:
      MOV DX, 0
      MOV BX, 0
      CALL CRLF   ; 换行      
      CALL ERROR; 输出错误提示
      JMP Lp_0
    L_CRLF:         ; 以换行作为一个数的结束标志
      MOV DX, 0
      MOV DATA, BX ;
      POP DX
      POP CX
      POP BX
      POP AX
      RET
      Input ENDP


;----换行子函数(一个数输入完毕)-------
CRLF PROC Near
    push AX
    push DX
    MOV DL, 0ah
    MOV AH, 2
    INT 21H
    pop DX
    pop AX
    RET
    CRLF ENDP
;---------空格-----------
Space PROC Near
    push AX
    push DX
    MOV DX, OFFSET string_5 ;' '
    MOV AH, 9
    INT 21H
    pop DX
    pop AX
    RET
    Space ENDP
;----------错误提示-------------
ERROR PROC Near
    push BX
    push DX
    MOV DX, OFFSET string_2 ; ERROR: OVERFLOW! Please input again:
    MOV AH, 9
    INT 21H
    pop DX
    pop BX
    RET
    ERROR ENDP

;---------输出函数(单数字输出)-------------
Print PROC Near
    PUSH AX
    PUSH BX
        PUSH CX
        PUSH DX

    MOV CX, 0
    MOV BX, 10
    MOV AX, DATA
    LAST:
      MOV DX, 0
      DIV BX ; DIV商放AX,余数放入DX
      PUSH DX
      INC CX
      CMP AX, 0
      JNZ LAST
    AGE:
      POP DX
      OR DX, 30H
      MOV AH, 2
      INT 21H
      LOOP AGE
      POPDX
      POPCX
          POPBX
          POPAX
          RET
      Print ENDP

;---------SORT---------------------
Sort_in PROC NEAR
    PUSH BX
    PUSH DX
    MOVSI,DI
LOOP1:
    ADDSI,2
    MOVBX,DATA
    CMPBX,DATA
    JA   CHANGE
    JMPNEXT
CHANGE:   
    MOVDX,DATA
    MOVDATA,DX
    MOVDATA,BX
NEXT:
    CMP SI,18
    JL   LOOP1
    POPDX
    POPBX
    RET
    Sort_in ENDP   

CODES ENDS
    END START
</code></pre>
<pre><code></code></pre><br><br>
来源:https://www.cnblogs.com/QSun77/p/15478401.html
頁: [1]
查看完整版本: 汇编语言冒泡排序