📄 shakersort.asm
字号:
; Date: 13.03.2004
; last modification: 27.03.2004
.code
IFNDEF PURE_ALGORITHM
ShakerSort PROTO :DWORD, :DWORD
ShakerSort PROC Arr:DWORD, count:DWORD
LOCAL lpLastElement :DWORD
mov ebx, count
dec ebx
mov esi, ebx
shr esi, 1
shl ebx, 2
shl esi, 2
add ebx, Arr
add esi, Arr
mov edi, ebx
add edi, Arr
mov lpLastElement, edi
mov ecx, 1
@Loop1:
test ecx, ecx
jz @Return
sub ebx, 4
cmp ebx, esi
jb @Return
;-------------------------------------------------------------------------------
DelayAfterPass
;-------------------------------------------------------------------------------
xor ecx, ecx
mov eax, lpLastElement
sub eax, ebx
sub eax, 8
@Loop2:
add eax, 4
cmp eax, ebx
ja @Loop3a
;-------------------------------------------------------------------------------
IncCMPCounter
push ebx
lea ebx, [eax + 4]
DelayAfterComparison eax, ebx
pop ebx
;-------------------------------------------------------------------------------
mov edx, DWORD PTR [eax + 4]
cmp DWORD PTR [eax], edx
jna @Loop2
mov ecx, DWORD PTR [eax]
mov DWORD PTR [eax], edx
mov DWORD PTR [eax + 4], ecx
;-------------------------------------------------------------------------------
IncMOVCounter
RefreshElement eax
push eax
add eax, 4
RefreshElement eax
pop eax
DelayAfterExchange
;-------------------------------------------------------------------------------
jmp @Loop2
@Loop3a:
test ecx, ecx
jz @Return
xor ecx, ecx
mov edi, lpLastElement
sub edi, ebx
mov eax, ebx
add eax, 4
@Loop3:
sub eax, 4
cmp eax, edi
jb @Loop1
;-------------------------------------------------------------------------------
IncCMPCounter
push ebx
lea ebx, [eax + ((4 XOR 0FFFFFFFFh) + 1)]
DelayAfterComparison eax, ebx
pop ebx
;-------------------------------------------------------------------------------
mov edx, DWORD PTR [eax]
cmp DWORD PTR [eax + ((4 XOR 0FFFFFFFFh) + 1)], edx
jna @Loop3
mov ecx, DWORD PTR [eax + ((4 XOR 0FFFFFFFFh) + 1)]
mov DWORD PTR [eax + ((4 XOR 0FFFFFFFFh) + 1)], edx
mov DWORD PTR [eax], ecx
;-------------------------------------------------------------------------------
IncMOVCounter
RefreshElement eax
push eax
sub eax, 4
RefreshElement eax
pop eax
DelayAfterExchange
;-------------------------------------------------------------------------------
jmp @Loop3
@Return:
ret
ShakerSort ENDP
ELSE
ShakerSort_PURE PROTO :DWORD, :DWORD
ShakerSort_PURE PROC Arr:DWORD, count:DWORD
LOCAL lpLastElement :DWORD
mov ebx, count
dec ebx
mov esi, ebx
shr esi, 1
shl ebx, 2
shl esi, 2
add ebx, Arr
add esi, Arr
mov edi, ebx
add edi, Arr
mov lpLastElement, edi
mov ecx, 1
@Loop1:
test ecx, ecx
jz @Return
sub ebx, 4
cmp ebx, esi
jb @Return
;-------------------------------------------------------------------------------
DelayAfterPass
;-------------------------------------------------------------------------------
xor ecx, ecx
mov eax, lpLastElement
sub eax, ebx
sub eax, 8
@Loop2:
add eax, 4
cmp eax, ebx
ja @Loop3a
;-------------------------------------------------------------------------------
IncCMPCounter
;-------------------------------------------------------------------------------
mov edx, DWORD PTR [eax + 4]
cmp DWORD PTR [eax], edx
jna @Loop2
mov ecx, DWORD PTR [eax]
mov DWORD PTR [eax], edx
mov DWORD PTR [eax + 4], ecx
;-------------------------------------------------------------------------------
IncMOVCounter
;-------------------------------------------------------------------------------
jmp @Loop2
@Loop3a:
test ecx, ecx
jz @Return
xor ecx, ecx
mov edi, lpLastElement
sub edi, ebx
mov eax, ebx
add eax, 4
@Loop3:
sub eax, 4
cmp eax, edi
jb @Loop1
;-------------------------------------------------------------------------------
IncCMPCounter
;-------------------------------------------------------------------------------
mov edx, DWORD PTR [eax]
cmp DWORD PTR [eax + ((4 XOR 0FFFFFFFFh) + 1)], edx
jna @Loop3
mov ecx, DWORD PTR [eax + ((4 XOR 0FFFFFFFFh) + 1)]
mov DWORD PTR [eax + ((4 XOR 0FFFFFFFFh) + 1)], edx
mov DWORD PTR [eax], ecx
;-------------------------------------------------------------------------------
IncMOVCounter
;-------------------------------------------------------------------------------
jmp @Loop3
@Return:
ret
ShakerSort_PURE ENDP
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -