?? ciosort.asm
字號(hào):
ifndef _QUEUE_
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;EQU 設(shè)置
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_QUEUE_ EQU 1
MAX_POINTER EQU 1024
SIGN_GREATEST EQU 1
SIGN_EQUAL EQU 2
SIGN_LESS EQU 3
; --=====================================================================================--
CLS_QUEUE_Init PROTO :DWORD,:DWORD
QUEUE_Destructor PROTO :DWORD
QUEUE_QueryClient PROTO :DWORD,:DWORD,:DWORD
QUEUE_InsertClient PROTO :DWORD,:DWORD,:DWORD
QUEUE_DeleteClient PROTO :DWORD,:DWORD
QUEUE_BackMove PROTO :DWORD,:DWORD
QUEUE_PriorMove PROTO :DWORD,:DWORD
QUEUE_GetClient PROTO :DWORD,:DWORD
QUEUE_OutputFile PROTO :DWORD,:DWORD
CLS_QUEUE_InitPto TYPEDEF PROTO :DWORD,:DWORD
QUEUE_DestructorPto TYPEDEF PROTO :DWORD
QUEUE_QueryClientPto TYPEDEF PROTO :DWORD,:DWORD,:DWORD
QUEUE_InsertClientPto TYPEDEF PROTO :DWORD,:DWORD,:DWORD
QUEUE_DeleteClientPto TYPEDEF PROTO :DWORD,:DWORD
QUEUE_GetClientPto TYPEDEF PROTO :DWORD,:DWORD
QUEUE_OutputFilePto TYPEDEF PROTO :DWORD,:DWORD
; --=====================================================================================--
CLASS CLS_QUEUE,QUEUE
;類方法定義
CMETHOD Destructor ;類清理程序
CMETHOD QueryClient ;查找客戶端信息
CMETHOD InsertClient ;增加客戶端信息
CMETHOD DeleteClient ;刪除客戶端信息
CMETHOD OutputFile ;將結(jié)果輸出到文件
;類成員變量定義
m_Count dd ? ;數(shù)組內(nèi)記錄數(shù)
m_lpQueue dd ? ;指針數(shù)組
CLS_QUEUE ENDS
.data
;類初始化
BEGIN_INIT
;函數(shù)指針初始化(指定調(diào)用那個(gè)函數(shù))
dd offset QUEUE_Destructor
dd offset QUEUE_QueryClient
dd offset QUEUE_InsertClient
dd offset QUEUE_DeleteClient
dd offset QUEUE_OutputFile
;成員變量初始化
dd 0,0
END_INIT
.code
CLS_QUEUE_Init PROC uses edi esi lpTHIS:DWORD,_lpResult:DWORD
;說明當(dāng)前類名為【CLS_QUEUE】
SET_CLASS CLS_QUEUE
;指定EDI為類指針
SetObject edi,CLS_QUEUE
mov esi,_lpResult
mov dword ptr [esi],TRUE
;申請(qǐng)錯(cuò)誤信息字符串內(nèi)存
invoke LocalAlloc,LPTR,MAX_POINTER*sizeof dword
.if eax==NULL
mov dword ptr [esi],FALSE
jmp @F
.endif
mov [edi].m_lpQueue,eax
@@:
;取消EDI類指針指定
ReleaseObject edi
ret
CLS_QUEUE_Init ENDP
QUEUE_Destructor PROC uses edi esi ebx lpTHIS:DWORD
SetObject edi,CLS_QUEUE
.if [edi].m_lpQueue!=0
mov esi,[edi].m_lpQueue
xor ebx,ebx
.while ebx<[edi].m_Count
mov eax,[esi]
.if eax!=0
invoke LocalFree,eax
.endif
add esi,sizeof dword
inc ebx
.endw
invoke LocalFree,[edi].m_lpQueue
.endif
ReleaseObject edi
ret
QUEUE_Destructor ENDP
QUEUE_QueryClient PROC uses edi esi ebx edx lpTHIS:DWORD,_lpUserGh:DWORD,_lpResult:DWORD
LOCAL @lpContext :DWORD
LOCAL @lpUserGh :DWORD
LOCAL @hClient :DWORD
LOCAL @dwIndexFirst :DWORD
LOCAL @dwIndexCurrent:DWORD
LOCAL @dwIndexLast :DWORD
SetObject edi,CLS_QUEUE
mov @dwIndexFirst ,0 ;初始化位置指針
mov @dwIndexCurrent,0
m2m @dwIndexLast ,[edi].m_Count
dec @dwIndexLast
mov esi,[edi].m_lpQueue ;查找首指針
@@:
.if esi==NULL ;〖空〗說明后面沒值
mov esi,_lpResult
mov dword ptr [esi],SIGN_GREATEST
jmp @F
.endif
mov eax,[esi] ;指針指向串地址
m2m @hClient ,dword ptr [eax]
add eax,sizeof dword
mov @lpUserGh,eax
;invoke lstrcmpi,_lpUserGh,CTEXT("123458")
;.if eax==0
; invoke _ShowConnect,CTEXT("First=%d Last=%d"),@dwIndexFirst,@dwIndexLast
; invoke _ShowConnect,CTEXT("Current=%d %c"),@dwIndexCurrent,10
;.endif
invoke lstrcmpi,_lpUserGh,@lpUserGh
.if eax==-1 ;參數(shù)工號(hào)小于對(duì)應(yīng)的工號(hào),需要向前查找
mov eax,@dwIndexCurrent
.if eax==@dwIndexFirst ;指針越界表示未查找出結(jié)果〖〗
mov esi,_lpResult
mov dword ptr [esi],SIGN_LESS
jmp @F
.else
;dec @dwIndexCurrent ;向前移動(dòng)指針
m2m @dwIndexLast,@dwIndexCurrent
dec @dwIndexLast
.endif
mov eax,@dwIndexCurrent ;查找中間值 Current-(Current-First)/2*(Sizeof Dword)
sub eax,@dwIndexFirst
xor edx,edx
mov ebx,2
div ebx
.if edx!=0
inc eax
.endif
sub @dwIndexCurrent,eax
mov ebx,sizeof dword
mul ebx
sub esi,eax
jmp @B
.elseif eax>0 ;參數(shù)工號(hào)大于對(duì)應(yīng)的工號(hào),需要向后查找
mov eax,@dwIndexCurrent
.if @dwIndexLast==eax ;指針越界表示未查找出結(jié)果〖〗
mov esi,_lpResult
mov dword ptr [esi],SIGN_GREATEST
jmp @F
.else
;inc @dwIndexCurrent ;向后移動(dòng)指針
m2m @dwIndexFirst,@dwIndexCurrent
inc @dwIndexFirst
.endif
mov eax,@dwIndexLast ;查找中間值 Current+(Last-Current)/2*(Sizeof Dword)
sub eax,@dwIndexCurrent
xor edx,edx
mov ebx,2
div ebx
.if edx!=0
inc eax
.endif
add @dwIndexCurrent,eax
mov ebx,sizeof dword
mul ebx
add esi,eax
jmp @B
.else ;參數(shù)工號(hào)等于對(duì)應(yīng)的工號(hào)
mov esi,_lpResult
mov dword ptr [esi],SIGN_EQUAL
jmp @F
.endif
@@:
ReleaseObject edi
mov eax,@dwIndexCurrent
ret
QUEUE_QueryClient ENDP
QUEUE_InsertClient PROC uses edi esi ebx lpTHIS:DWORD,_lpUserGh:DWORD,_hClient:DWORD
LOCAL @dwResult :DWORD
LOCAL @dwIndex :DWORD
LOCAL @dwLength :DWORD
SetObject edi,CLS_QUEUE
.if [edi].m_Count!=0
invoke QUEUE_QueryClient,lpTHIS,_lpUserGh,addr @dwResult
mov @dwIndex,eax
.if @dwResult==SIGN_GREATEST || @dwResult==SIGN_EQUAL ;大于等于均放到最后
;invoke _ShowConnect,CTEXT("UserGh=%s 的位置在%d后"),_lpUserGh,@dwIndex
inc @dwIndex
invoke QUEUE_BackMove,lpTHIS,@dwIndex
.else
;invoke _ShowConnect,CTEXT("UserGh=%s 的位置在%d前"),_lpUserGh,@dwIndex
invoke QUEUE_BackMove,lpTHIS,@dwIndex
.endif
.else
mov @dwIndex,0
;invoke _ShowConnect,CTEXT("UserGh=%s 的位置首位置"),_lpUserGh,10
.endif
mov esi,[edi].m_lpQueue ;移動(dòng)存放位置指針
mov eax,@dwIndex
mov ebx,sizeof dword
mul ebx
add esi,eax
invoke lstrlen,_lpUserGh ;計(jì)算申請(qǐng)內(nèi)存大小
add eax,sizeof dword
inc eax
mov @dwLength,eax
invoke LocalAlloc,LPTR,@dwLength
.if eax!=NULL
mov [esi],eax ;寫入申請(qǐng)地址
mov esi,eax
m2m dword ptr [esi],_hClient
add esi,sizeof dword
invoke lstrcpy,esi,_lpUserGh
inc [edi].m_Count
.else
invoke _ShowConnect,CTEXT("申請(qǐng)〖%d〗大小的內(nèi)存%s"),@dwLength,CTEXT("失敗")
.endif
ReleaseObject edi
ret
QUEUE_InsertClient ENDP
QUEUE_DeleteClient PROC uses edi esi ebx lpTHIS:DWORD,_hClient:DWORD
SetObject edi,CLS_QUEUE
mov esi,[edi].m_lpQueue ;設(shè)置開始移動(dòng)指針
xor ebx,ebx
.while ebx<[edi].m_Count
mov eax,[esi]
mov eax,[eax]
.if _hClient==eax
mov eax,[esi]
invoke LocalFree,eax
invoke QUEUE_PriorMove,lpTHIS,ebx
dec [edi].m_Count
.break
.endif
add esi,sizeof dword
inc ebx
.endw
ReleaseObject edi
ret
QUEUE_DeleteClient ENDP
QUEUE_BackMove PROC uses edi esi ebx edx lpTHIS:DWORD,_dwIndex:DWORD
SetObject edi,CLS_QUEUE
.if [edi].m_Count<MAX_POINTER
mov esi,[edi].m_lpQueue ;設(shè)置開始移動(dòng)指針
mov eax,[edi].m_Count
dec eax
mov ebx,sizeof dword
mul ebx
add esi,eax
mov ebx,[edi].m_Count
.while ebx>_dwIndex
mov eax,[esi]
mov [esi+sizeof dword],eax
sub esi,sizeof dword
dec ebx
.endw
.endif
ReleaseObject edi
ret
QUEUE_BackMove ENDP
QUEUE_PriorMove PROC uses edi esi ebx edx lpTHIS:DWORD,_dwIndex:DWORD
SetObject edi,CLS_QUEUE
mov esi,[edi].m_lpQueue ;設(shè)置開始移動(dòng)指針
mov eax,_dwIndex
mov ebx,sizeof dword
mul ebx
add esi,eax
mov ebx,_dwIndex
.while ebx<[edi].m_Count
mov eax,[esi+sizeof dword]
mov [esi],eax
add esi,sizeof dword
inc ebx
.endw
ReleaseObject edi
ret
QUEUE_PriorMove ENDP
QUEUE_GetClient PROC uses edi esi ebx lpTHIS:DWORD,_dwIndex:DWORD
LOCAL @dwResult:DWORD
SetObject edi,CLS_QUEUE
mov @dwResult,0
mov esi,[edi].m_lpQueue ;設(shè)置開始移動(dòng)指針
mov eax,_dwIndex
mov ebx,sizeof dword
mul ebx
add esi,eax
mov eax,[esi]
mov @dwResult,eax
ReleaseObject edi
mov eax,@dwResult
ret
QUEUE_GetClient ENDP
QUEUE_OutputFile PROC uses edi esi ebx lpTHIS:DWORD,_lpWriteFile:DWORD
LOCAL @hFile:DWORD
LOCAL @dwLen:DWORD
LOCAL @szBuffer[1024]:BYTE
LOCAL @hAccept:DWORD
LOCAL @lpUserGh:DWORD
SetObject edi,CLS_QUEUE
invoke CreateFile,_lpWriteFile,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
.if eax!=INVALID_HANDLE_VALUE
mov @hFile,eax
invoke RtlZeroMemory,addr @szBuffer,sizeof @szBuffer
mov esi,[edi].m_lpQueue ;設(shè)置開始移動(dòng)指針
xor ebx,ebx
.while ebx<[edi].m_Count
mov eax,[esi]
m2m @hAccept,[eax]
add eax,sizeof dword
m2m @lpUserGh,eax
invoke wsprintf,addr @szBuffer,CTEXT("hAccept=%d UserGh=%s%c%c"),@hAccept,@lpUserGh,13,10
invoke lstrlen,addr @szBuffer
mov @dwLen,eax
invoke WriteFile,@hFile,addr @szBuffer,@dwLen,addr @dwLen,NULL
add esi,sizeof dword
inc ebx
.endw
invoke CloseHandle,@hFile
.endif
ReleaseObject edi
ret
QUEUE_OutputFile ENDP
endif
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -