📄 combsort.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 + -