2017-10-20 107 views
-6

用匯編語言中的選擇排序對十個數字列表進行排序。 如何轉換我這個冒泡排序方法爲選擇排序方法用匯編語言中的選擇排序對十個數字列表進行排序

`[org 0x0100] 
jmp start 
data: dw 60, 55, 45, 50, 40, 35, 25, 30, 10, 0 
swap: db 0 
start: mov bx, 0 ; initialize array index to zero 
mov byte [swap], 0 ; rest swap flag to no swaps 
loop1: mov ax, [data+bx] ; load number in ax 
cmp ax, [data+bx+2] ; compare with next number 
jbe noswap ; no swap if already in order 
mov dx, [data+bx+2] ; load second element in dx 
mov [data+bx+2], ax ; store first number in second 
mov [data+bx], dx ; store second number in first 
mov byte [swap], 1 ; flag that a swap has been done 
noswap: add bx, 2 ; advance bx to next index 
cmp bx, 18 ; are we at last index 
jne loop1 ; if not compare next two 
cmp byte [swap], 1 ; check if a swap has been done 
je start ; if yes make another pass 
mov ax, 0x4c00 ; terminate program 
int 0x21` 
+0

當你在這裏問一個問題你真的想顯示什麼樣的研究,你這樣做遠,你已經嘗試過。有關如何提出良好問題,請參閱StackOverflow指南:https://stackoverflow.com/help/how-to-ask 另外,我假設這是作業。爲此,你應該真的考慮這樣做,確保你不要求人們爲你做功課。看到這篇文章:https://meta.stackoverflow.com/questions/334822/how-do-i-ask-and-answer-homework-questions – entpnerd

回答

0

這裏的關鍵是要改變你的循環。目前它正在交換相鄰的號碼。您需要更改它以將最右邊的元素複製到寄存器中,並將預先存在的已排序陣列向右移動,直到剛剛移動的元素大於或等於您剛剛複製到寄存器中的最前面的元素。

0

也許這將是有益的。我很久以前寫了這個。 Realmode intel彙編程序。

MAIN.ASM

SSTACK SEGMENT PARA STACK 'STACK' 
    DW 128 DUP(?) 
SSTACK ENDS 


DSEG SEGMENT PUBLIC 'DATA' 

    S LABEL BYTE 
    ARR DB 'IHGFED27182392JASKD1O12312345CBA' 
    LEN EQU ($-S) 

    PUBLIC TMP 
    PUBLIC MIN 
    TMP DW ? 
    MIN DW ? 

DSEG ENDS 

CSEG SEGMENT 'CODE' 
    ASSUME CS:CSEG, SS:SSTACK, DS:DSEG 

     EXTRN OUTPUT:NEAR 
     EXTRN SORT:NEAR 

START:  MOV AX, DSEG 
     MOV DS, AX 

     MOV BX, OFFSET ARR 
     MOV CX, LEN 
     CALL OUTPUT 


     MOV AX, 60 

     CMP AX, 0 
     JZ NO_SORT 
     CMP AX, 1 
     JZ NO_SORT 

     MOV BX, OFFSET ARR 
     MOV CX, LEN 
     CALL SORT 


NO_SORT: MOV BX, OFFSET ARR 
     MOV CX, LEN 
     CALL OUTPUT 

     MOV AH, 4CH 
     MOV AL, 0 
     INT 21H 







CSEG ENDS 
    END START 

SORT.ASM

DSEG SEGMENT PUBLIC 'DATA' 

    EXTRN TMP:WORD 
    EXTRN MIN:WORD 

DSEG ENDS 


CSEG SEGMENT 'CODE' 
    ASSUME CS:CSEG, DS:DSEG 

    PUBLIC SORT 


SORT PROC;    (AX - N, BX - ARRAY ADDRESS, CX - ARRAY LENGTH) 

     PUSH SI 
     PUSH DI 
     PUSH DX 

     CALL COMPARE_MIN 

     DEC CX 
     MOV AX, CX 

     XOR SI, SI 
     XOR DI, DI 


L1:  
     PUSH CX 
     MOV MIN, SI 

     MOV TMP, DI 
     INC DI 

     MOV CX, AX 


     L2: 

     MOV DH, BYTE PTR[BX+DI] 

     PUSH SI 
     MOV SI, MIN 
     MOV DL, BYTE PTR[BX+SI] 
     POP SI 

     CMP DH, DL 
     JA OLD_MIN 


NEW_MIN: MOV MIN, DI 


OLD_MIN: INC DI 
      DEC CX 

     CMP CX, TMP 
     JNZ L2 

SWAP:  PUSH DI 
     MOV DI, MIN 

     MOV DL, BYTE PTR[BX+DI] 
     MOV DH, BYTE PTR[BX+SI] 

     MOV BYTE PTR [BX+SI], DL 
     MOV BYTE PTR [BX+DI], DH 

     POP DI 

     INC SI 
     MOV DI, SI 

    POP CX 
    LOOP L1 

    POP DX 
    POP DI 
    POP DI 


    RET 


SORT ENDP 





COMPARE_MIN PROC; (AX - A, CX - B  CX - MIN) 

     PUSH AX 

     CMP AX, CX 
     JB B__A 
     JA A__B 

A__B:  MOV CX, CX 
     JMP EX 

B__A:  MOV CX, AX 
     JMP EX 

EX:  POP AX 
     RET 

COMPARE_MIN ENDP 






CSEG ENDS 

    END 

OUTPUT.ASM

CSEG SEGMENT 'CODE' 
    ASSUME CS:CSEG 

    PUBLIC OUTPUT 

OUTPUT PROC ; (BX - ARRAY ADDRESS, CX - ARRAY LENGTH) 

    PUSH DX 
    PUSH SI 
    PUSH AX 

    XOR SI, SI 

    MOV AH, 02H 

OUTARR: MOV DL,[BX+SI] 
    INT 21H 

    INC SI 

     LOOP OUTARR 

    MOV DL, 10 
    INT 21H 

    POP AX 
    POP SI 
    POP DX 

    RET 

OUTPUT ENDP 
CSEG ENDS 
    END