【问题标题】:Array Bubble Sort in Assembly Language汇编语言中的数组冒泡排序
【发布时间】:2021-03-16 11:55:48
【问题描述】:

问题是为什么只对最后一个元素进行排序,然后在每个索引上放 5?

我是第一次发帖,如果我的问题不清楚,我深表歉意。

arr BYTE 5,4,3,2,1  
arr1 BYTE 5 DUP(?)  
temp BYTE ?  
.code  
main PROC   
mov ecx,LENGTHOF arr    
mov esi,Offset arr  
mov edi,offset arr+1  
L1:
mov al,[esi]  
mov edx,ecx  
mov ecx,4  
    L2:
    mov bl,[edi]  
    cmp al,bl  
    JG L3  
    jmp L5  

    L3:
    mov temp,al
    mov [esi],bl
    ;mov dl,temp
    mov [edi],al
    inc edi
    L5:
    loop L2

    mov ecx,edx
    inc esi

loop L1

;Printing my array
mov ecx,LENGTHOF arr  
mov al,arr[0]  
CALL dumpRegs  
mov al,arr[1]  
CALL dumpRegs  
mov al,arr[2]  
CALL dumpRegs  
mov al,arr[3]  
CALL dumpRegs  

CALL dumpRegs
exit
main ENDP
END main

【问题讨论】:

  • here获得灵感

标签: arrays assembly x86 bubble-sort


【解决方案1】:

问题是为什么只对最后一个元素进行排序,然后在每个索引上放置 5?

您的 L2 InnerLoop 仅适用于第一个数组元素,因为一旦将其加载到 AL 中,您就不会在 ESI 中前进指针。而且因为这个特定的值恰好是数组中的最大值,所以它被存储在任何地方。
您的 L2 InnerLoop 也可以使用 4 的固定计数,而它应该使用 CurrentOuterLoopCount - 1 的计数。

正确的解决方案不需要 2 个不同的指针寄存器。要比较的数组元素总是彼此相邻的,因此 +1 的简单偏移量就可以解决问题。

这是一个有效的 BubbleSort。了解它是如何工作的,不要只是复制它!

arr BYTE 5,4,3,2,1

.code
main PROC
  mov  ecx, LENGTHOF arr
  sub  ecx, 1
  jbe  Done               ; Array is empty or has but 1 element

OuterLoop:
  mov  edx, ecx           ; 5 elements means 4 comparisons
  mov  esi, Offset arr
InnerLoop:
  mov  al, [esi]
  mov  bl, [esi+1]
  cmp  al, bl
  jng  NoSwap
  mov  [esi], bl
  mov  [esi+1], al
NoSwap:
  inc  esi
  dec  edx
  jnz  InnerLoop
  dec  ecx                ; Next time 3 comparisons, then 2, and then 1
  jnz  OuterLoop

Done:

【讨论】:

    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 2017-06-21
    • 2023-03-13
    • 2020-08-23
    • 1970-01-01
    相关资源
    最近更新 更多