📄 procedure2.asm
字号:
inc i
mov m , 0h
mov k , 0h
mov count1 , 0h
mov count2 , 0h
mov count3 , 0h
mov ExchangeFlag , 0h
mov q , 0h
dec ecx
jz Exit
jmp startAgain
Exit:
output Suggest5 ; out result
output sourceStr
popad
pop ebp
ret
Descend ENDP
;*********************************************************************************
; 比较两个子字符串的大小,大于时,k=1 ,否则k =0
;**********************************************************************************
CmpThanString PROC NEAR32 ; comparison string j and string i size ,if string j >string i k=1 whther k = 0
push ebp
pushad
StartCmpAgain:
mov al , BYTE PTR[esi]
call JudgeLetterEsi ;judge string j is char or digit or others
mov bl , BYTE PTR[edi]
call JudgeLetterEdi ;judge string i is char or digit or others
mov al , flagE
mov bl , flagD
cmp al , bl
je SameType
cmp al , 0
jne OtherCircumstance
cmp bl , 1
jne OtherCircumstance
mov al , BYTE PTR[esi]
mov bl , BYTE PTR[edi]
add al , 20h
cmp bl , al
jg NoCmpEnd
je ToCmpStr
mov k , 1
jmp CmpEnd
OtherCircumstance:
cmp al , 1
jne OtherCmp
cmp bl , 0
jne OtherCmp
mov al , BYTE PTR[esi]
mov bl , BYTE PTR[edi]
add bl , 20h
cmp bl , al
jg NoCmpEnd
je ToCmpStr
mov k , 1
jmp CmpEnd
SameType: ;the same type comparison
mov al , BYTE PTR[esi]
cmp BYTE PTR[edi] , al
jg NoCmpEnd
cmp BYTE PTR[edi] , al
je ToCmpStr
mov k , 1
jmp CmpEnd
OtherCmp: ; the diffrent type comparison
mov al , BYTE PTR[esi]
cmp BYTE PTR[edi] , al
jg NoCmpEnd
mov al , BYTE PTR[esi]
cmp BYTE PTR[edi] , al
je ToCmpStr
mov k , 1
jmp CmpEnd
ToCmpStr: ;if the comparisonal char same , continue to judge
inc esi
inc edi
cmp BYTE PTR[esi] , 20h
je SonStrEnd
cmp BYTE PTR[esi] , 0h
je SonStrEnd
cmp BYTE PTR[edi] , 20h
je NoCmpEnd
jmp StartCmpAgain
SonStrEnd:
cmp BYTE PTR[edi] , 20h
je NoCmpEnd
mov k , 1
jmp CmpEnd
CmpEnd1:
mov bl , BYTE PTR[edi]
add bl , 20h
cmp bl , al
jg NoCmpEnd
cmp bl , al
je ToCmpStr
mov k , 1
NoCmpEnd: mov k , 0 ; string i > string j , k = 0
CmpEnd:
popad
pop ebp
ret
CmpThanString ENDP
;*********************************************************************************
; 比较两个子字符串的大小,小于时,k=1 ,否则k =0
;**********************************************************************************
CmpLessString PROC NEAR32 ; comparison string j and string i size ,if string j < string i k=1 whther k = 0
push ebp
pushad
StartCmpAgain:
mov al , BYTE PTR[esi]
call JudgeLetterEsi ;judge string j is char or digit or others
mov bl , BYTE PTR[edi]
call JudgeLetterEdi ;judge string i is char or digit or others
mov al , flagE
mov bl , flagD
cmp al , bl
je SameType
cmp al , 0
jne OtherCircumstance
cmp bl , 1
jne OtherCircumstance
mov al , BYTE PTR[esi]
mov bl , BYTE PTR[edi]
add al , 20h
cmp bl , al
jl NoCmpEnd
je ToCmpStr
mov k , 1
jmp CmpEnd
OtherCircumstance:
cmp al , 1
jne OtherCmp
cmp bl , 0
jne OtherCmp
mov al , BYTE PTR[esi]
mov bl , BYTE PTR[edi]
add bl , 20h
cmp bl , al
jl NoCmpEnd
je ToCmpStr
mov k , 1
jmp CmpEnd
SameType: ; the same type comparison
mov al , BYTE PTR[esi]
cmp BYTE PTR[edi] , al
jl NoCmpEnd
cmp BYTE PTR[edi] , al
je ToCmpStr
mov k , 1
jmp CmpEnd
OtherCmp: ; the diffrent type comparison
mov al , BYTE PTR[esi]
cmp BYTE PTR[edi] , al
jl NoCmpEnd
mov al , BYTE PTR[esi]
cmp BYTE PTR[edi] , al
je ToCmpStr
mov k , 1
jmp CmpEnd
ToCmpStr: ;if the comparisonal char same , continue to judge
inc esi
inc edi
cmp BYTE PTR[esi] , 20h
je SonStrEnd
cmp BYTE PTR[esi] , 0h
je SonStrEnd
cmp BYTE PTR[edi] , 20h
je NoCmpEnd
jmp StartCmpAgain
SonStrEnd:
cmp BYTE PTR[edi] , 20h
je NoCmpEnd
mov k , 1
jmp CmpEnd
CmpEnd1:
mov bl , BYTE PTR[edi]
add bl , 20h
cmp bl , al
jl NoCmpEnd
cmp bl , al
je ToCmpStr
mov k , 1
NoCmpEnd: mov k , 0 ; string j > string i k=0
CmpEnd:
popad
pop ebp
ret
CmpLessString ENDP
;*********************************************************************************
; 交换在字符串中交换两个子字符串位置
;**********************************************************************************
ExchangeStr PROC NEAR32 ;exchang string i and string j
push ebp
pushad
mov bl , i
cmp bl , k
je Exit
lea esi , sourceStr
cmp i , 0h
je FisteSonStr
mov edx , 0h
mov dl , i
mov ecx , edx
forCountEqualI: ;local string i
cmp BYTE PTR[esi] , 20h
je EqualI
inc esi
jmp forCountEqualI
EqualI: inc esi
loop forCountEqualI
lea edi , tempStr1
EqualI2: ;count string of char number
cmp BYTE PTR [esi] , 20h
je EndCopyStr1
mov al , BYTE PTR[esi]
mov BYTE PTR[edi] , al
inc count1
inc esi
inc edi
jmp EqualI2
FisteSonStr :
lea edi , tempStr1
FisteSonStr1 : ;copy string i to tempStr1
cmp BYTE PTR [esi] , 20h
je EndCopyStr1
mov al , BYTE PTR[esi]
mov BYTE PTR[edi] , al
inc count1
inc esi
inc edi
jmp FisteSonStr1
EndCopyStr1: ;local string j
lea esi , sourceStr
mov edx , 0h
mov dl , k
mov ecx , edx
forCountEqualK:
cmp BYTE PTR[esi] , 20h
je EqualK1
inc esi
jmp forCountEqualK
EqualK1:
inc esi
loop forCountEqualK
lea edi , tempStr2
EqualK: ;copy string j to tempStr2
cmp BYTE PTR [esi] , 0h
je EndCopyStr2
cmp BYTE PTR [esi] , 20h
je EndCopyStr2
mov al , BYTE PTR[esi]
mov BYTE PTR[edi] , al
inc count2
inc esi
inc edi
jmp EqualK
EndCopyStr2:
lea edi , destStr
cmp i , 0
je NoStr
lea esi , sourceStr
mov edx , 0h
mov dl , i
mov ecx , edx
forCountEqualI1: ;exchang sourceStr of string i and string j position and copy to destStr
inc count3
cmp BYTE PTR[esi] , 20h
je EqualI1
inc esi
jmp forCountEqualI1
EqualI1:inc esi
loop forCountEqualI1
mov ebx , esi
lea edi , destStr
add edi , count3
lea esi , tempStr2
mov ecx , count2
CopyTempStr:
mov al , BYTE PTR[esi]
mov BYTE PTR[edi] , al
inc esi
inc edi
loop CopyTempStr
mov esi , ebx
add esi , count1
mov bl , i
inc bl
mov p , bl
mov bl , k
jmp ToCmpSiZe
NoStr:
lea esi , tempStr2
mov ecx , count2
CopyTempStr2:
mov al , BYTE PTR[esi]
mov BYTE PTR[edi] , al
inc esi
inc edi
loop CopyTempStr2
lea esi , sourceStr
add esi , count1
mov bl , k
ToCmpSize:
cmp p , bl
jl CopyStr1
mov al , BYTE PTR [esi]
mov BYTE PTR[edi] , al
inc esi
inc edi
mov ebx , esi
lea esi , tempStr1
mov ecx , count1
CopyTempStr1:
mov al , BYTE PTR[esi]
mov BYTE PTR[edi] , al
inc esi
inc edi
loop CopyTempStr1
mov esi , ebx
add esi , count2
ToJudgeAgain:
cmp BYTE PTR[esi] , 0h
je Exit
mov al , BYTE PTR[esi]
mov BYTE PTR[edi] , al
inc esi
inc edi
jmp ToJudgeAgain
jmp Exit
CopyStr1:
mov al , BYTE PTR [esi]
mov BYTE PTR [edi] , al
inc esi
inc edi
cmp BYTE PTR[esi] , 20h
je AddP
jmp CopyStr1
AddP: inc p
jmp ToCmpSize
Exit:
lea esi , destStr
lea edi , sourceStr
ToContinue: ; copy destStr to sourceStr
mov al , BYTE PTR[esi]
cmp al , 0h
je Exit1
mov BYTE PTR[edi] , al
inc esi
inc edi
jmp ToContinue
Exit1:
mov ecx , count1
lea esi , tempStr1
ClearZero1: ;clear tempStr1
mov BYTE PTR[esi] , 0h
inc esi
loop ClearZero1
mov ecx , count2
lea esi , tempStr2
ClearZero2: ;clear tempStr1
mov BYTE PTR[esi] , 0h
inc esi
loop ClearZero2
popad
pop ebp
ret
ExchangeStr ENDP
;*********************************************************************************
; 比较两个子字符串的是否是字母,数字,还是其它字符
;**********************************************************************************
JudgeLetterEsi PROC NEAR32 ;judge string j is char or digit or others
push ebp
pushad
cmp al , 41h
jl EndWhileLetters
cmp al , 5Ah
jg CmpLetters
mov flagE , 0h ;string i is samll char flagd=0
jmp Exit
CmpLetters:
cmp al , 61h
jl EndWhileLetters
cmp al , 7Ah
jg EndWhileLetters
mov flagE , 1 ;string i is big char flagd=1
jmp Exit
EndWhileLetters:
mov flagE , 2 ;string is others flagd = 0
Exit:
popad
pop ebp
ret
JudgeLetterEsi ENDP
;*********************************************************************************
; 比较两个子字符串的是否是字母,数字,还是其它字符
;**********************************************************************************
JudgeLetterEdi PROC NEAR32 ;judge string i is char or digit or others
push ebp
pushad
cmp bl , 41h
jl EndWhileLetters
cmp bl , 5Ah
jg CmpLetters
mov flagD , 0h ;string i is samll char flagd=0
jmp Exit
CmpLetters:
cmp bl , 61h
jl EndWhileLetters
cmp bl , 7Ah
jg EndWhileLetters
mov flagD , 1 ;string i is big char flagd=1
jmp Exit
EndWhileLetters:
mov flagD , 2 ;string is others flagd = 0
Exit:
popad
pop ebp
ret
JudgeLetterEdi ENDP
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -