【问题标题】:Sorting a list of ten numbers with selection sort in assembly language在汇编语言中使用选择排序对十个数字的列表进行排序
【发布时间】:2017-10-20 17:08:09
【问题描述】:

在汇编语言中使用选择排序对包含十个数字的列表进行排序。 我如何将这种冒泡排序方法转换为选择排序方法

`[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`

【问题讨论】:

  • 当您在这里提出问题时,您真的想展示您迄今为止所做的研究以及您尝试过的内容。请参阅 StackOverflow 指南,了解如何提出好的问题:stackoverflow.com/help/how-to-ask 另外,我假设这是家庭作业。为此,你真的应该考虑这样问,确保你没有要求别人为你做作业。请参阅此元帖子:meta.stackoverflow.com/questions/334822/…

标签: sorting assembly x86


【解决方案1】:

这里的关键是改变你的循环。目前它正在交换相邻的数字。您需要更改它以将最右边的元素复制到寄存器中,并将预先存在的排序数组向右移动,直到您刚刚移动的元素大于或等于您刚刚复制到寄存器中的先前最右边的元素。

【讨论】:

    【解决方案2】:

    也许这会有所帮助。我很久以前写过这个。实模式英特尔汇编器。

    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
    

    排序.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
    

    输出.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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 2021-11-02
      • 1970-01-01
      • 2020-06-18
      相关资源
      最近更新 更多