【问题标题】:Bubble sort on array on Assembly Language汇编语言中数组的冒泡排序
【发布时间】:2015-08-06 06:55:17
【问题描述】:

我需要对一个从大到小有 7 个整数的无组织数组进行冒泡排序,使其看起来像 9,6,5,4,3,2,1。
我通过编译器运行我的代码,它说

我不明白这段代码有什么问题:

code segment
assume ds:code,cs:code
start:
 mov ax,code
 mov ds,ax    ;code start
ARR:   dw 1,2,4,3,6,5,9
 mov ch,0h
 mov cl,1h
 mov bh 7h
 jmp assign_nums
restart:
 mov ch,0h
 mov cl,1h
 dec bh
 jmp assign_nums
swap:
 mov ch,dl
 mov cl,dh
 jmp next
next:
 cmp bh,cl
 je restart
 add ch,1h
 add cl,1h
 jmp assign_nums
assign_nums:
 cmp bh,0h
 je done
 mov dh,[ARR+ch]
 mov dl,[ARR+cl]
 cmp dh,dl
 jl swap
 jnl next
done:
 nop
code ends
end start

【问题讨论】:

    标签: arrays assembly x86 bubble-sort


    【解决方案1】:

    对于第一个错误,您忘记在寄存器和立即数之间输入逗号。

    对于第 2 个和第 3 个错误,CH 和 CL 寄存器不能用于寻址存储器。请改用 SI、DI 或 BX。

    由于您的数组被定义为单词,因此您必须将其视为单词!
    改变

    mov dh,[ARR+ch]
    mov dl,[ARR+cl]
    

    变成类似的东西(取决于您做出的其他选择)

    mov ax,[ARR+si]
    mov dx,[ARR+di]
    

    请注意,您将阵列放置在说明中。一旦您设法编译它,这将使您的程序崩溃。要么将数组放在程序的单独数据段中,要么跳过这一行。

    start:
     mov ax,code
     mov ds,ax
     jmp start2
    ARR:   dw 1,2,4,3,6,5,9
    start2:
     mov ch,0h
    

    【讨论】:

    • 所以它是一堆意大利面条代码?有更好的编码方法吗?我不知道我在这里用汇编代码做什么
    • user3144770 的回答很棒。我要做的唯一改变是不提供跳过 ARRAY 的选项。仅将您的 ARR 放在 .data 段中 .DATA OR .FARDATA DSEG ARR: dw 1,2,4,3,6,5,9
    【解决方案2】:

    这是冒泡排序的简单代码

    iclude'emu8086.inc'
    
    org 100h 
    .data
    
    array  db 9,6,5,4,3,2,1
    count  dw 7
    
    .code
    
        mov cx,count      
        dec cx               ; outer loop iteration count
    
    nextscan:                ; do {    // outer loop
        mov bx,cx
        mov si,0 
    
    nextcomp:
    
        mov al,array[si]
        mov dl,array[si+1]
        cmp al,dl
    
        jnc noswap 
    
        mov array[si],dl
        mov array[si+1],al
    
    noswap: 
        inc si
        dec bx
        jnz nextcomp
    
        loop nextscan       ; } while(--cx);
    
    
    
    ;;; this  loop to display  elements on the screen
    
        mov cx,7
        mov si,0
    
    print:
    
        Mov al,array[si]  
        Add al,30h
        Mov ah,0eh
        Int  10h 
        MOV AH,2
        Mov DL , ' '
        INT 21H
        inc si
        Loop print
    
        ret 
    

    【讨论】:

    • mov si, OFFSET array 会更有效率,所以si 是一个指针,而不是一个索引。否则,这是一个相当不错的直接 BubbleSort,它通过在没有交换的外循环迭代后不进行提前检查以停止来保持简单。
    【解决方案3】:

    ;使用冒泡排序算法对数组进行排序

    .MODEL SMALL  
    .STACK 100H  
    .DATA  
        N DB 44H,22H,11H,55H,33H     ; N is an array      
        LEN DW 5 ; LENGTH OF ARRAY N   
    .CODE   
     MAIN PROC  
     MOV AX,@DATA  
        MOV DS,AX  
    
     MOV CX,LEN ;Cx is counter for OUTERLOOP CX=5    
     DEC CX     ; CX = 4   
    
     OUTERLOOP:  
        MOV SI,0         ;    SI is the index of array N   
        MOV DX,CX  ; Dx is counter for INNERLOOP   
     INNERLOOP:    
        MOV AH,N[SI]    ; assign the number N[SI] into reg.AH  
        MOV AL,N[SI+1]  ; assign the next number N[SI+1] into reg.AL   
        CMP AH,AL       ; Compare between N[SI] and N[SI+1] <BR> 
        JC CARRY        ; if AL > AH => Carry Flag =1 ,THEN jump to carry   
        MOV N[SI] , AL  ; else , Do Switching bteween  N[SI] and N[SI+1]   
        MOV N[SI+1] ,AH   
     CARRY:   
        INC SI   
        DEC DX   
        JNZ INNERLOOP   
        LOOP OUTERLOOP   
     ;exit   
     MOV AH,4CH   ;service number     
     INT 21H      ; interrupt   
     MAIN  ENDP   
    END 
    

    【讨论】:

    【解决方案4】:
    .model small
    .data
    
    arr1 db 6, 5, 8, 3, 9
    len1 equ $-arr1
    
    .code
    
    
    mov ax, @data
    mov ds, ax
    mov ch, len1-1
    
    
    a1:
    mov cl, ch
    lea si, arr1
    
    
    rept1:
    mov al, [si]
    inc si
    cmp al, [si]
    jbe next1
    xchg al, [si]
    mov [si-1], al
    
    
    next1:
    dec cl
    jnz rept1
    dec ch
    jnz a1
    
    
    mov ah, 4ch
    int 21h
    
    end
    

    【讨论】:

    • 请格式化代码。为此,您可以在每行前面添加 4 个空格。同时删除所有空行。
    • 您知道像您这样的“纯代码”帖子不能算作答案吗?您需要详细解释您的程序做了什么,以及它如何帮助在本页顶部提出原始问题的人。如果不这样做,就是公开邀请人们开始对您的帖子投反对票!
    • 感谢@SepRoland 的反馈。我是这个社区的新手,您的反馈无疑非常有帮助!
    猜你喜欢
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 2017-06-21
    • 2023-03-13
    • 2020-08-23
    • 1970-01-01
    相关资源
    最近更新 更多