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