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

📄 radixexchangesort.asm

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

.code

IFNDEF PURE_ALGORITHM


  RadixExchangeSort      PROTO :DWORD, :DWORD
  RadixExchangeSort_Sort PROTO :DWORD, :DWORD, :DWORD


RadixExchangeSort PROC Arr:DWORD, count:DWORD

    mov    eax, Arr
    mov    ebx, count
    lea    ebx, [eax + ebx*4 - 4]

    ;-------------------------------------------------------------------------------------
    ;-- Note: The number of bits is set to 7 (0, 1, ..., 6) because this procedure is only
    ;--       used in the graphic dialog where the maximum number of elements is 128 (from
    ;--       0 to 127). That means the maxmimum number of bits that needs to be processed
    ;--       is 7.
    ;--       If the number of bits will be 31 (as normal for 32 bit values), it would
    ;--       take 24 passes before any changes are displayed in the display window (if a
    ;--       delay is given).
    ;-- Using 6 instead of 31 will have an effect on the number of comparisons!
    push   6
    push   ebx
    push   eax
    call   RadixExchangeSort_Sort



@Return:
  ret

RadixExchangeSort ENDP



RadixExchangeSort_Sort PROC left:DWORD, right:DWORD, bit:DWORD

    mov    eax, left
    mov    ebx, right
    cmp    ebx, eax
    jna    @Return

    mov    edx, 1
    mov    ecx, bit
    shl    edx, cl

    sub    eax, 4
    add    ebx, 4

  @Loop1:

    @Loop2:
        add    eax, 4
        cmp    eax, ebx
        jae    @F

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

  DelayAfterComparison eax
;-------------------------------------------------------------------------------

        test   DWORD PTR [eax], edx
        jz     @Loop2

    @Loop3:
        sub    ebx, 4
        cmp    eax, ebx
        jae    @F

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

  DelayAfterComparison ebx
;-------------------------------------------------------------------------------

        test   DWORD PTR [ebx], edx
        jnz    @Loop3

      mov    esi, DWORD PTR [eax]
      mov    edi, DWORD PTR [ebx]
      mov    DWORD PTR [eax], edi
      mov    DWORD PTR [ebx], esi

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

  RefreshElement eax
  RefreshElement ebx

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

      jmp    @Loop1


    @@:
      test   ecx, ecx
      jz     @Return

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

      sub    ecx, 1
      push   eax
      push   ecx

        mov    ebx, left
        sub    eax, 4

        push   ecx
        push   eax
        push   ebx
        call   RadixExchangeSort_Sort

      pop    ecx
      pop    eax

      mov    ebx, right

      push   ecx
      push   ebx
      push   eax
      call   RadixExchangeSort_Sort



@Return:
  ret

RadixExchangeSort_Sort ENDP


ELSE


  RadixExchangeSort_PURE      PROTO :DWORD, :DWORD
  RadixExchangeSort_Sort_PURE PROTO :DWORD, :DWORD, :DWORD


RadixExchangeSort_PURE PROC Arr:DWORD, count:DWORD

    mov    eax, Arr
    mov    ebx, count
    lea    ebx, [eax + ebx*4 - 4]

    push   31
    push   ebx
    push   eax
    call   RadixExchangeSort_Sort_PURE



@Return:
  ret

RadixExchangeSort_PURE ENDP



RadixExchangeSort_Sort_PURE PROC left:DWORD, right:DWORD, bit:DWORD

    mov    eax, left
    mov    ebx, right
    cmp    ebx, eax
    jna    @Return

    mov    edx, 1
    mov    ecx, bit
    shl    edx, cl

    sub    eax, 4
    add    ebx, 4

  @Loop1:

    @Loop2:
        add    eax, 4
        cmp    eax, ebx
        jae    @F

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

        test   DWORD PTR [eax], edx
        jz     @Loop2

    @Loop3:
        sub    ebx, 4
        cmp    eax, ebx
        jae    @F

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

        test   DWORD PTR [ebx], edx
        jnz    @Loop3

      mov    esi, DWORD PTR [eax]
      mov    edi, DWORD PTR [ebx]
      mov    DWORD PTR [eax], edi
      mov    DWORD PTR [ebx], esi

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

      jmp    @Loop1


    @@:
      test   ecx, ecx
      jz     @Return

      sub    ecx, 1
      push   eax
      push   ecx

        mov    ebx, left
        sub    eax, 4

        push   ecx
        push   eax
        push   ebx
        call   RadixExchangeSort_Sort_PURE

      pop    ecx
      pop    eax

      mov    ebx, right

      push   ecx
      push   ebx
      push   eax
      call   RadixExchangeSort_Sort_PURE



@Return:
  ret

RadixExchangeSort_Sort_PURE ENDP


ENDIF

⌨️ 快捷键说明

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