📄 procedure2.asm
字号:
.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 + -