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

📄 procedure2.asm

📁 用汇编语言实现对已输入的字符串进行排序,可以按升序或者降序排序.注意对排序的字符串不区分大小.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
.386
.MODEL FLAT
ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
INCLUDE io.h 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
cr      EQU     0dh     ; carriage return character
Lf      EQU     0ah     ; line feed
.STACK  4096             ; reserve 4096-byte stack
PUBLIC  Ascend , CmpLessString , ExchangeStr,Descend 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.DATA                   ; reserve storage for data
sourceStr   BYTE    100 DUP (?)
destStr		BYTE    100 DUP (?)
N			DWORD    ?                 ;space number
i			BYTE    ?
j			BYTE    ?
k			BYTE    ?
m			BYTE    ?
p			BYTE    ?
q			BYTE    ?
flagE			BYTE    ?
flagD			BYTE    ?
ExchangeFlag  BYTE   ?               ; exchang flag
count1			DWORD    ?
count2			DWORD    ?
count3			DWORD    ?
tempStr1		BYTE    40  DUP(?)           ; store   exchang string
tempStr2		BYTE    40  DUP(?)           ; store   big or small  sting
Suggest4		BYTE  "You input string Ascending out: " , 0
Suggest5		BYTE  "You input string Descending  out: " , 0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>		
		.CODE 
;*********************************************************************************
; 把字符串String按升序排序
;**********************************************************************************
Ascend PROC   NEAR32
		push ebp
		pushad
		lea edi , sourceStr
CopysoureStr:                   ;copy Mani2 of sourceStr to Procedure2 of soureceStr
		cmp BYTE PTR [esi] , 0h
		je  CopyEnd
		mov al , BYTE PTR[esi]
		mov BYTE PTR[edi] , al
		inc esi
		inc edi
		jmp CopysoureStr
CopyEnd:                           ;  Initialization   Variables and copy space number to N
		mov N , edx
		mov count1 , 0h
		mov i , 0h
		mov k , 0h
		mov j , 1h
		mov m , 0h
		mov p , 1
		mov ExchangeFlag , 0
		cmp N , 0
		je Exit
		mov ecx , N
		mov eax , 0
startAgain:	lea esi , sourceStr	         ;  cycle   N  ,flow chart of   i   "for 1  to n-1"
forCounter:                              ;cycle   N-j+i , flow chart of  j  "for i+j to  n"      
		mov al , j
		add al , i
		mov bl , al
		cmp k , 0
		je LastCmp
		mov ExchangeFlag , 1
LastCmp:                                         
		cmp eax , N                   ; j<=N  ,whether end a cycle and i aad 1
		jg ExchangeTemp
Repeat1:                               ;  local  comparisonal    sting    j
		cmp BYTE PTR [esi] , 20h
		je SonStrEnd
		inc esi
		jmp Repeat1
SonStrEnd: 
		inc m
		mov al , m
		inc esi
		cmp al , i
		jbe Repeat1
		cmp i , 0
		jne AntherCmp                   ;   not first comparison
		cmp k , 0                       ;    first  comparison
		je NoExchang
		mov ExchangeFlag , 1
		lea edi , sourceStr
		mov bl , m
		dec bl                         ; local  comparisonal string   j
Continue:                               
		cmp BYTE PTR[edi] , 20h
		je CmpMLessZero
		inc edi
		jmp Continue
CmpMLessZero:
		inc edi
		dec bl
		jz  CmpMEqualZero
		jmp Continue
CmpMEqualZero:                      
		call CmpLessString            ;access   CmpLessString fucation to judge  big or small
		inc j 
		jmp  forCounter	              ;cycle  j<= N
NoExchang:                            ;if  not exchang ,    continue judge  and j<=N
		cmp m , 1 
		jne SourceAddress          
		lea edi , sourceStr
		call CmpLessString           
		inc j 
		jmp forCounter
SourceAddress:
		call CmpLessString
		inc j 
		jmp  forCounter
AntherCmp:                         ;local comparisonal string i
		dec bl
		cmp bl , i
		jne CmpIEqualZero
		lea edi , sourceStr
		mov bl , i 
Repeat2:
		cmp BYTE PTR [edi] , 20h
		je CmpILessZero
		inc edi
		jmp Repeat2
CmpILessZero:
		inc edi
		dec bl 
		jz CmpIEqualZero
		jmp Repeat2
CmpIEqualZero:
		cmp k , 0
		je NoExchang1
		mov ExchangeFlag , 1
		lea edi , sourceStr
		mov bl , j               
		add bl , i                ;local string  j
		dec bl
Continue1:
		cmp BYTE PTR[edi] , 20h
		je CmpMLessZero1
		inc edi
		jmp Continue1
CmpMLessZero1:
		inc edi
		dec bl
		jz  NoExchang1
		jmp Continue1
NoExchang1:
		call CmpLessString
		inc j 
		jmp  forCounter	    
ExchangeTemp:	                  ;    finish one time j<=n 
		cmp ExchangeFlag , 0
		jne NoCmp2
		cmp i , 0
		jne NoCmp1                ; if j<=n cycle ,no exchang data ,exit cycle ,i++
		mov edx , esi
		mov ebx , edi
		lea esi , sourceStr
		lea edi , destStr
ToContinueCopy:
		mov al , BYTE PTR[esi]
		cmp al , 0h
		je NoFirst
		mov BYTE PTR[edi] , al
		inc esi 
		inc edi
		jmp ToContinueCopy			
NoFirst:
		mov esi , edx
		mov edi , ebx
		jmp NoCmp1
NoCmp2:
		cmp k , 0
		je ToExchangeStr
		mov edx , esi
		lea esi  , sourceStr 
DoAgain:                              ;local string i
		cmp esi , edx
		je EndCounter
		cmp BYTE PTR[esi] , 20h
		je NumberSpace
		inc esi
		jmp DoAgain
NumberSpace:                          
		inc q                          ;q  is local comparisonal string    j
		inc esi
		jmp DoAgain
EndCounter:
		mov bl , q
		mov k , bl
		call ExchangeStr
		jmp NoCmp1
ToExchangeStr:
		mov edx , edi 
		lea esi  , sourceStr 
DoAgain1:
		cmp esi , edx
		je EndCounter1
		cmp BYTE PTR[esi] , 20h
		je NumberSpace1
		inc esi
		jmp DoAgain1
NumberSpace1:
		inc q
		inc esi
		jmp DoAgain1
EndCounter1:
		mov bl , q
		mov k , bl
		call ExchangeStr
NoCmp1:                           ; end one cycle of i  , and   i<n
		mov j , 1h
		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 Suggest4               ;    out   result  
		output sourceStr 
		popad
		pop ebp
		ret
Ascend   ENDP
;*********************************************************************************
; 把字符串String按降序排序
;**********************************************************************************
Descend PROC   NEAR32              
		push ebp
		pushad
		lea edi , sourceStr
CopysoureStr:                              ;copy Mani2 of sourceStr to Procedure2 of soureceStr
		cmp BYTE PTR [esi] , 0h
		je  CopyEnd
		mov al , BYTE PTR[esi]
		mov BYTE PTR[edi] , al
		inc esi
		inc edi
		jmp CopysoureStr
CopyEnd:                                   ;  Initialization   Variables and copy space number to N
		mov N , edx
		mov count1 , 0h
		mov i , 0h
		mov k , 0h
		mov j , 1h
		mov m , 0h
		mov p , 1
		mov ExchangeFlag , 0
		cmp N , 0
		je Exit
		mov ecx , N
		mov eax , 0
startAgain:	lea esi , sourceStr	             ;  cycle   N  ,flow chart of   i   "for 1  to n-1"
forCounter:                                  ;cycle   N-j+i , flow chart of  j  "for i+j to  n"  
		mov al , j
		add al , i
		mov bl , al
		cmp k , 0
		je LastCmp
		mov ExchangeFlag , 1
LastCmp:
		cmp eax , N                           ; j<=N  ,whether end a cycle and i ++
		jg ExchangeTemp
Repeat1:                                      ;  local  comparisonal    sting    j
		cmp BYTE PTR [esi] , 20h
		je SonStrEnd
		inc esi
		jmp Repeat1
SonStrEnd: 
		inc m
		mov al , m
		inc esi
		cmp al , i
		jbe Repeat1
		cmp i , 0
		jne AntherCmp
		cmp k , 0
		je NoExchang
		mov ExchangeFlag , 1
		lea edi , sourceStr
		mov bl , m
		dec bl 
Continue:
		cmp BYTE PTR[edi] , 20h
		je CmpMLessZero
		inc edi
		jmp Continue
CmpMLessZero:
		inc edi
		dec bl
		jz  CmpMEqualZero
		jmp Continue
CmpMEqualZero:
		call CmpThanString
		inc j 
		jmp  forCounter	
NoExchang:
		cmp m , 1
		jne SourceAddress
		lea edi , sourceStr
		call CmpThanString
		inc j 
		jmp forCounter
SourceAddress:
		call CmpThanString
		inc j 
		jmp  forCounter
AntherCmp:                              ;local comparisonal string i
		dec bl
		cmp bl , i
		jne CmpIEqualZero
		lea edi , sourceStr
		mov bl , i 
Repeat2:
		cmp BYTE PTR [edi] , 20h
		je CmpILessZero
		inc edi
		jmp Repeat2
CmpILessZero:
		inc edi
		dec bl 
		jz CmpIEqualZero
		jmp Repeat2
CmpIEqualZero:
		cmp k , 0
		je NoExchang1
		mov ExchangeFlag , 1
		lea edi , sourceStr
		mov bl , j 
		add bl , i                     ;local string  j
		dec bl
Continue1:
		cmp BYTE PTR[edi] , 20h
		je CmpMLessZero1
		inc edi
		jmp Continue1
CmpMLessZero1:
		inc edi
		dec bl
		jz  NoExchang1
		jmp Continue1
NoExchang1:
		call CmpThanString
		inc j 
		jmp  forCounter	    
ExchangeTemp:	                          ;    finish one time j<=n 
		cmp ExchangeFlag , 0
		jne NoCmp2
		cmp i , 0
		jne NoCmp1                        ; if j<=n cycle ,no exchang data ,exit cycle ,i++
		mov edx , esi
		mov ebx , edi
		lea esi , sourceStr
		lea edi , destStr
ToContinueCopy:
		mov al , BYTE PTR[esi]
		cmp al , 0h
		je NoFirst
		mov BYTE PTR[edi] , al
		inc esi 
		inc edi
		jmp ToContinueCopy			
NoFirst:
		mov esi , edx
		mov edi , ebx
		jmp NoCmp1
NoCmp2:
		cmp k , 0
		je ToExchangeStr
		mov edx , esi
		lea esi  , sourceStr 	
DoAgain:
		cmp esi , edx
		je EndCounter
		cmp BYTE PTR[esi] , 20h
		je NumberSpace
		inc esi
		jmp DoAgain
NumberSpace:
		inc q                             ;q  is local comparisonal string    j
		inc esi
		jmp DoAgain
EndCounter:
		mov bl , q
		mov k , bl
		call ExchangeStr
		jmp NoCmp1
ToExchangeStr:
		mov edx , edi 
		lea esi  , sourceStr 
DoAgain1:                                 ;local string i
		cmp esi , edx
		je EndCounter1
		cmp BYTE PTR[esi] , 20h
		je NumberSpace1
		inc esi
		jmp DoAgain1
NumberSpace1:
		inc q
		inc esi
		jmp DoAgain1
EndCounter1:
		mov bl , q
		mov k , bl
		call ExchangeStr
NoCmp1:                             ; end one cycle of i  , and   i<n
		mov j , 1h

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -