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

📄 procedure2.asm

📁 用汇编语言实现对已输入的字符串进行排序,可以按升序或者降序排序.注意对排序的字符串不区分大小.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
		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 + -