2017-04-08 311 views
0

我必须键入和数组(只能用数字),并且当引入它时,它必须在第二个中排序。我所要做的就是实施必须对它们进行排序的PROC。我的问题是,我不知道如何,因为我所取得的唯一成果是将第一个复制到第二个。感谢您的帮助,并对我的英语感到抱歉。用emu8086对数组进行排序(汇编)

;mov ax, vector[si] 
;mov vector[di], ax 
;this loop copy all elements 
; start code 
Sort_DecreasingOrder: 

cmp si, 0 
mov ax, vector1[si] 

bCompare: 
xor di, di 
mov bx, vector2[di] 
cmp ax, bx 
jge IntroduceBefore 
+1

例子e对于“泡泡”排序是[here](http://stackoverflow.com/a/26324630/3512216)。 – rkhb

回答

1

有排序的另一种方式知道作为Selection Sort和这里其:

数据段被定义为:

elements db 7,1,0,5,'$' 
size dw $-elements - 1  ; size stores 5 (including '$') so we subtract one now it stores 4 (which is the actual number of elements) 
msg db 10,13,'Unsorted Array: $'   
msg2 db 10,13,'Sorted Array: $' 

过程进行排序的数组:

sort proc  

    mov cx, size  
    mov si, 0 
    mov di, 0 
    mov ax, 1 ; this is done 
    dec cx ; to avoid the last comparison 

    outerLoop:   

     push cx ; store the limit of outerLoop in stack 

     mov bl, elements[si] ; store the element in bl pointed by si             

     mov cx, size ; store the value of size in cx for innerLoop   
     sub cx, ax  ; this is done so that the limit does not proceed the limit of array elements. 

     innerLoop: 

      inc di     

      cmp bl, elements[di] ; compare the if BL is not greater than 
      jna continue   ; content of element pointed by DI if yes then continue otherwise swap the value by executing below statements 

      mov dl, elements[di] ; get the element pointed by DI into DL 
      mov elements[di], bl ; swap the 
      mov elements[si], dl ; elements 
      mov bl, dl    ; store the smallest element in BL        

      continue: 

     loop inner 

     inc ax               

     pop cx ; get the limit of outerLoop 

     inc si ; increment the index of outerLoop to point to the next element 

     mov di, si 

     loop outer       

    return2:  

     ret  

sort endp     

end  
+1

每当您找到新的候选元素时,都会进行大量交换。这几乎没有SelectionSort了。只要记录你发现元素的位置并在最后以最大值交换。另外,使用[atomic'xchg'(即带有内存操作数的xchg)](http://felixcloutier.com/x86/XCHG.html)会使得* *比需要的慢得多。另外,'jna continue'会比'ja' /'jmp'更有意义。或者更好的是,优化比较的分支结构是错误的并且不需要交换。 –

+1

你不需要CPU用'xchg dl,bl'交换寄存器,只需存储相反的寄存器即可。另外,你已经有'bl' ='elements [si]',所以你不需要再加载它。 (但是,你将需要一个'mov bl,dl'指令我猜) –

+0

@Peter Cordes当我写代码时没有时间进行优化,我有点慌张。我仍然很匆忙,因为我必须准备后天的考试。 – Ahtisham