匯編編寫冒泡排序


  關於匯編冒泡排序法。

  小編在編的時候,因為定義的是字節類型的數據,MOV數據的時候卻用的AX,導致發生錯誤(好久都沒找出來哪里的問題)。

鍵盤輸入十個十六進制字節數據,存入給定的存儲單元中,用冒泡排序法將數據按從大到小的順序排列好,在屏幕上顯示出來.

 這里,我們采用兩個字節分別存儲16進制的兩位,以空格間隔每個數據。

DATA SEGMENT
    DATA1 DB 40,0,40 DUP(0)
    COUNT EQU 10
    STR DB 0DH,0AH,"Please input 10 number:",0DH,0AH,"$"
    RANKED DB 0DH,0AH,'Ordered numbers:',0dh,0ah,"$"
DATA ENDS

CODE SEGMENT
    ASSUME DS:DATA,CS:CODE
    START:MOV AX,DATA
    MOV DS,AX
    
    
    CALL INPUT
    CALL RANK
    CALL DISPLAY
    MOV AH,4CH
    INT 21H 

INPUT PROC
    MOV SI,0
    MOV AH,09H
    MOV DX,OFFSET STR
    INT 21H
    MOV AH,0AH
    MOV DX,OFFSET DATA1
    INT 21H
    RET
INPUT ENDP

RANK PROC
    MOV CX,COUNT
 S1:PUSH CX
    MOV SI,0
    MOV BX,OFFSET DATA1
    ADD BX,2
    MOV CX,COUNT-1
 S2:MOV DL,[BX+SI]
    CMP DL,[BX+SI+3]
    JC EXCH
    JNZ  S3
    MOV DL,[BX+SI+1]
    CMP DL,[BX+SI+4]
    JNC S3
EXCH:MOV DL,[BX+SI]
    XCHG DL,[BX+SI+3]
    MOV [BX+SI],DL
    MOV DL,[BX+SI+1]
    XCHG DL,[BX+SI+4]
    MOV [BX+SI+1],DL
   S3: NOP 
   ADD SI,3
    LOOP S2
    POP CX
    LOOP S1
    RET
RANK ENDP    
 
DISPLAY PROC
    LEA DX,RANKED
    MOV AH,09H
    INT 21H
    LEA DX,DATA1
    MOV CL,DATA1+1
    XOR CH,CH
    ADD DX,CX
    MOV BX,DX
    MOV BYTE PTR[BX+2],"$"
    LEA DX,DATA1
    ADD DX,2
    INT 21H
    RET
DISPLAY ENDP      
    
CODE ENDS
END START

 

 

 

已知數據為:  41H, 70H, 03H, 53H, 88H, 16H, 8EH, 3FH,用冒泡排序法將數據按從小到大的順序排列好,再由鍵盤鍵入75H, 將它插入這組數據中,並保持從小到大的順序不變. 將插入數據后的數組在屏幕上顯示出來.

  小編對上面的程序做了些修改。插入過程的入口參數為COUNT,需要重新定義。

  根據書上面的用“=”偽指令定義的常量,可以重復賦值,但是小編在程序中,並未實現~~~

  無奈,哭了,在emu8086運行=偽指令不起作用.

  小編想的是,可u哦手動輸入8個數據進行排序,然后再輸入另一個值插入排序。但是emu8086‘=’賦值只針對第一次起作用,而dosbox只針對最后一次起作用。

所以dosbox運行會產生第一個數據為00的現象。(以下代碼 理論上應該沒有問題的)

  但是運行結果不對!!!!!

DATA SEGMENT
DATA1 DB 40,0,40 DUP(0)
STR DB 0DH,0AH,"Please input 8 number:",0DH,0AH,"$"
RANKED DB 0DH,0AH,'Ordered numbers:',0dh,0ah,"$"
INSERT DB 0DH,0AH,"Please input a number you want to insert:",0DH,0AH,"$"
DATA2 DB 10,0,10 DUP(0)
COUNT=8
DATA ENDS

CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:MOV AX,DATA
MOV DS,AX

CALL INPUT
MOV CX,COUNT
CALL RANK
CALL DISPLAY
CALL INSERTDA
COUNT=COUNT+1
MOV CX,COUNT
CALL RANK
CALL DISPLAY
MOV AH,4CH
INT 21H

INPUT PROC
MOV SI,0
MOV AH,09H
MOV DX,OFFSET STR
INT 21H
MOV AH,0AH
MOV DX,OFFSET DATA1
INT 21H
RET
INPUT ENDP

RANK PROC
MOV AH,02H
MOV DL,COUNT
ADD DL,30H
INT 21H
S1: PUSH CX
MOV SI,0
MOV BX,OFFSET DATA1
ADD BX,2
MOV CX,COUNT-1
S2:MOV DL,[BX+SI]
CMP DL,[BX+SI+3]
JA EXCH
JNZ S3
MOV DL,[BX+SI+1]
CMP DL,[BX+SI+4]
JC S3
EXCH:MOV DL,[BX+SI]
XCHG DL,[BX+SI+3]
MOV [BX+SI],DL
MOV DL,[BX+SI+1]
XCHG DL,[BX+SI+4]
MOV [BX+SI+1],DL
S3: NOP
ADD SI,3
LOOP S2
POP CX
LOOP S1
RET
RANK ENDP

DISPLAY PROC
LEA DX,RANKED
MOV AH,09H
INT 21H
LEA DX,DATA1
MOV CL,DATA1+1
XOR CH,CH
ADD DX,CX
MOV BX,DX
MOV BYTE PTR[BX+2],"$"
LEA DX,DATA1
ADD DX,2
INT 21H
RET
DISPLAY ENDP

INSERTDA PROC
PUSH CX
PUSH DX
MOV AH,09H
LEA DX,INSERT
INT 21H
MOV AH,0AH
LEA DX,DATA2
INT 21H
MOV DX,OFFSET DATA1
MOV CL,DATA1+1
XOR CH,CH
ADD DX,CX
MOV BX,DX
LEA DX,DATA2
MOV SI,OFFSET DATA2
MOV BYTE PTR[BX+2],20H
MOV CL,[SI+2]
MOV [BX+3],CL
MOV CL,[SI+3]
MOV [BX+4],CL
MOV DX,OFFSET DATA1
MOV BX,DX
ADD BYTE PTR[BX+1],3
POP DX
POP CX
RET
INSERTDA ENDP


CODE ENDS
END START

 

  只能采用兩個過程調用了。RANK1和RANK2

  小編至此還是不知道原因在哪里,

本來打算用一個過程完成兩次不同調用,失敗了,所以還是用兩個過程好了。

DATA SEGMENT
    DATA1 DB 40,0,40 DUP(0)
    STR DB 0DH,0AH,"Please input 8 number:",0DH,0AH,"$"
    RANKED DB 0DH,0AH,'Ordered numbers:',0dh,0ah,"$"
    INSERT DB 0DH,0AH,"Please input a number you want to insert:",0DH,0AH,"$"
    DATA2 DB 10,0,10 DUP(0)
DATA ENDS

CODE SEGMENT
    ASSUME DS:DATA,CS:CODE
    START:MOV AX,DATA
    MOV DS,AX
    
    CALL INPUT
    CALL RANK1
    CALL DISPLAY   
    CALL INSERTDA
    MOV AH,4CH
    INT 21H 

INPUT PROC
    MOV SI,0
    MOV AH,09H
    MOV DX,OFFSET STR
    INT 21H
    MOV AH,0AH
    MOV DX,OFFSET DATA1
    INT 21H
    RET
INPUT ENDP

RANK1 PROC 
     MOV CX,8  
 S1: PUSH CX
    MOV SI,0
    MOV BX,OFFSET DATA1
    ADD BX,2
    MOV CX,7
 S2:MOV DL,[BX+SI]
    CMP DL,[BX+SI+3]
    JA EXCH
    JNZ  S3
    MOV DL,[BX+SI+1]
    CMP DL,[BX+SI+4]
    JC S3
EXCH:MOV DL,[BX+SI]
    XCHG DL,[BX+SI+3]
    MOV [BX+SI],DL
    MOV DL,[BX+SI+1]
    XCHG DL,[BX+SI+4]
    MOV [BX+SI+1],DL
   S3: NOP 
   ADD SI,3
    LOOP S2
    POP CX
    LOOP S1
    RET
RANK1 ENDP
RANK2 PROC 
     MOV CX,9 
 S6: PUSH CX
    MOV SI,0
    MOV BX,OFFSET DATA1
    ADD BX,2
    MOV CX,8
 S4:MOV DL,[BX+SI]
    CMP DL,[BX+SI+3]
    JA EXCH1
    JNZ  S5
    MOV DL,[BX+SI+1]
    CMP DL,[BX+SI+4]
    JC S5
EXCH1:MOV DL,[BX+SI]
    XCHG DL,[BX+SI+3]
    MOV [BX+SI],DL
    MOV DL,[BX+SI+1]
    XCHG DL,[BX+SI+4]
    MOV [BX+SI+1],DL
   S5: NOP 
   ADD SI,3
    LOOP S4
    POP CX
    LOOP S6
    RET
RANK2 ENDP    
 
DISPLAY PROC
    LEA DX,RANKED
    MOV AH,09H
    INT 21H
    LEA DX,DATA1
    MOV CL,DATA1+1
    XOR CH,CH
    ADD DX,CX
    MOV BX,DX
    MOV BYTE PTR[BX+2],"$"
    LEA DX,DATA1
    ADD DX,2
    INT 21H
    RET
DISPLAY ENDP      

INSERTDA PROC
      PUSH CX
      PUSH DX 
      MOV AH,09H
      LEA DX,INSERT
      INT 21H
      MOV AH,0AH
      LEA DX,DATA2
      INT 21H
      MOV DX,OFFSET DATA1
      MOV CL,DATA1+1
      XOR CH,CH
      ADD DX,CX
      MOV BX,DX
      LEA DX,DATA2
      MOV SI,OFFSET DATA2
      MOV BYTE PTR[BX+2],20H
      MOV CL,[SI+2]
      MOV [BX+3],CL
      MOV CL,[SI+3]
      MOV [BX+4],CL
      MOV DX,OFFSET DATA1
      MOV BX,DX
      ADD BYTE PTR[BX+1],3
      POP DX
      POP CX
      CALL RANK2
      CALL DISPLAY
      RET
INSERTDA ENDP

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM