⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 combsort.asm

📁 一个演示了用汇编语言编写的数据排序算法,源代码非常详细
💻 ASM
字号:
; Date: 19.04.2004

.code

IFNDEF CombSort_Const
  .data
    CombSort_Const REAL4 1.3
ENDIF

.code

IFNDEF PURE_ALGORITHM


  CombSort PROTO :DWORD, :DWORD


CombSort PROC Arr:DWORD, count:DWORD

    LOCAL Gap   :DWORD
    LOCAL eFlag :DWORD

    push   ebx
    push   esi
    push   edi

    mov    eax, count
    mov    Gap, eax
    mov    esi, Arr
    dec    count

  @Loop1:
    fild   Gap        ; load integer memory operand to divide
    fdiv   CombSort_Const       ; divide number by 1.3
    fistp  Gap       ; store result back in integer memory operand
    dec    Gap
    jnz    @F
    mov    Gap, 1

  @@:
    mov    eFlag, 0

    mov    edi, count
    sub    edi, Gap
    xor    ecx, ecx              ; low value index

  @Loop2:
    mov    edx, ecx
    add    edx, Gap              ; high value index
    mov    eax, DWORD PTR [esi+ecx*4]      ; lower value
    mov    ebx, DWORD PTR [esi+edx*4]      ; higher value

;-------------------------------------------------------------------------------
  IncCMPCounter

  push   ecx
  push   edx
    lea    ecx, [esi + ecx*4]
    lea    edx, [esi + edx*4]
    DelayAfterComparison ecx, edx
  pop    edx
  pop    ecx
;-------------------------------------------------------------------------------

    cmp    eax, ebx
    jle    @F
    mov    DWORD PTR [esi+edx*4], eax
    mov    DWORD PTR [esi+ecx*4], ebx

;-------------------------------------------------------------------------------
  IncMOVCounter

  push   ecx
  push   edx
    lea    edx, [esi + edx*4]
    lea    ecx, [esi + ecx*4]
    RefreshElement edx
    RefreshElement ecx
  pop    edx
  pop    ecx

  DelayAfterExchange
;-------------------------------------------------------------------------------

    inc    eFlag

  @@:
    inc    ecx
    cmp    ecx, edi
    jle    @Loop2

;-------------------------------------------------------------------------------
  DelayAfterPass
;-------------------------------------------------------------------------------

    cmp    eFlag, 0
    jg     @Loop1
    cmp    Gap, 1
    jg     @Loop1

    pop    edi
    pop    esi
    pop    ebx



@Return:
  ret

CombSort ENDP


ELSE


  CombSort_PURE PROTO :DWORD, :DWORD


CombSort_PURE PROC Arr:DWORD, count:DWORD

    LOCAL Gap   :DWORD
    LOCAL eFlag :DWORD

    push   ebx
    push   esi
    push   edi

    mov    eax, count
    mov    Gap, eax
    mov    esi, Arr
    dec    count

  @Loop1:
    fild   Gap        ; load integer memory operand to divide
    fdiv   CombSort_Const       ; divide number by 1.3
    fistp  Gap       ; store result back in integer memory operand
    dec    Gap
    jnz    @F
    mov    Gap, 1

  @@:
    mov    eFlag, 0

    mov    edi, count
    sub    edi, Gap
    xor    ecx, ecx              ; low value index

  @Loop2:
    mov    edx, ecx
    add    edx, Gap              ; high value index
    mov    eax, DWORD PTR [esi+ecx*4]      ; lower value
    mov    ebx, DWORD PTR [esi+edx*4]      ; higher value

;-------------------------------------------------------------------------------
  IncCMPCounter
;-------------------------------------------------------------------------------

    cmp    eax, ebx
    jle    @F
    mov    DWORD PTR [esi+edx*4], eax
    mov    DWORD PTR [esi+ecx*4], ebx

;-------------------------------------------------------------------------------
  IncMOVCounter
;-------------------------------------------------------------------------------

    inc    eFlag

  @@:
    inc    ecx
    cmp    ecx, edi
    jle    @Loop2

    cmp    eFlag, 0
    jg     @Loop1
    cmp    Gap, 1
    jg     @Loop1

    pop    edi
    pop    esi
    pop    ebx



@Return:
  ret

CombSort_PURE ENDP


ENDIF

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -