首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >8051气泡排序问题

8051气泡排序问题
EN

Stack Overflow用户
提问于 2014-07-11 03:13:09
回答 2查看 2.4K关注 0票数 0

我正在尝试在汇编程序8051上编写冒泡排序。这就是我到目前为止所做的,它按升序排序,但它也会移动元素,当它完成时,在第一个位置留下一个空白。

通过一步一步地查看执行过程,我注意到SUBB没有改变C的值,这使得JC跳过指令变得无用。

代码语言:javascript
复制
 DEFSEG     INICIO1,ABSOLUTE
            SEG INICIO1
            JMP INICIO

            ORG 100H
    INICIO: MOV R1,#05H  
    EXT: MOV A,R1
            MOV R2,A
            MOV R0,#30H
            MOV A,@R0
    IN: INC R0
            MOV B,@R0
            CLR C
            SUBB A,B 
            JC SKIP
            MOV B,@R0
            DEC R0
            MOV A,@R0
            MOV @R0,B
            INC R0
            MOV @R0,A
    SKIP: DJNZ R2,IN                
            DJNZ R1,EXT
    STOP: SJMP STOP
            JMP FIN
    FIN:
            END
EN

回答 2

Stack Overflow用户

发布于 2014-07-11 19:53:35

IN中,您需要A等于@R0,但是在跳转到SKIP之后,就不是了!

尝试:

代码语言:javascript
复制
 mov r1, #30h

 mov @r1, #33h
 inc r1
 mov @r1, #44h
 inc r1
 mov @r1, #66h
 inc r1
 mov @r1, #22h
 inc r1
 mov @r1, #11h
 inc r1
 mov @r1, #55h

 mov r3, #5
outer:
 mov a, r3
 mov r2, a
 mov r1, #30h
 mov a, @r1
inner:
 inc r1
 clr c
 subb a, @r1
 mov a, @r1
 jc continue
 dec r1
 xch a, @r1
 inc r1
 mov @r1, a
continue:
 djnz r2, inner
 djnz r3, outer

注意,初始计数(5)比要排序的项数少一个

票数 0
EN

Stack Overflow用户

发布于 2021-08-10 17:24:56

尝试此子例程

代码语言:javascript
复制
;
;       BUBBLE SORT SUBROUTINE DESCRIPTION            
;          1. PUSH NO. OF ELEMENT                      
;          2. PUSH BASE ADDRESS OF ARRAY               
;                                                      



BUBBLESORT:
    POP 0X7F                      ;RETURN ADDRESS OF SUBROUTINE 
    POP 0X7E      

    POP DPH                       ;BASE ADDRESS OF ARRAY 
    POP DPL   
    POP ACC                       ;COUNTER 

    PUSH 0X7E                     ;PUSH RETURN ADDRESS 
    PUSH 0X7F     

    MOV R0,A                      ;TEMPORARY STORE COUNTER REG.
    MOV R1,A                      ;AND BASE ADDRESS OF ARRAY
    MOV R2,A      
    MOV R3,DPL        
    MOV R4,DPH    

REPEAT_BUBBLESORT:
    MOVX A,@DPTR                  ;MOVE A[I] INTO ACCUMULATOR 
    MOV R5,A                
    
    INC DPTR 
    MOVX A,@DPTR        
    MOV R6,A 

    SUBB A,R5 
    JNC NOTSWAP_BUBBLESORT      ;SWAP IF A[I] > A[I+1]
    MOV A,R6 
    XCH A,R5 
    MOVX @DPTR,A 
    ACALL DEC_DPTR              ;CALL DECREMENT DATA POINTER 
    MOV A,R5 
    MOVX @DPTR,A 
    INC DPTR 
NOTSWAP_BUBBLESORT:             
    DJNZ R2,REPEAT_BUBBLESORT   ;LOWER COUNTER 
    MOV A,R0 
    MOV R2,A 
    MOV DPL,R3                  ;INITILIZE DPTR WITH BASE ADDRESS 
    MOV DPH,R4                  
    DJNZ R1,REPEAT_BUBBLESORT   ;UPPER COUNTER 
    RET                         ;RETURN SUBROUITNE 

                                ;DECREMENT DATA POINTER SUBROUITNE 
DEC_DPTR:
    MOV A,DPL 
    SUBB A,#01 
    JNC SKIP_DEC_DPTR
    MOV A,#0XFF 
    DEC DPH 
SKIP_DEC_DPTR:
    MOV DPL,A 
    RET 

在启动数组之前,将数组的基址存储到寄存器

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24684502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档