WIN32汇编语言教程:第10章 内存管理和文件操作 · 10.2 文件操作(2)

                  .386
                  .model flat, stdcall
                  option casemap :none
;####################################################################
; Include 文件定义
;####################################################################
include           windows.inc
include           user32.inc
includelib        user32.lib
include           kernel32.inc
includelib        kernel32.lib
include           comdlg32.inc
includelib        comdlg32.lib
;####################################################################
; Equ 等值定义
;####################################################################
ICO_MAIN            equ       1000
DLG_MAIN            equ       100
IDC_FILE            equ       101
IDC_BROWSE        equ       102
 
WORD_COUNT        struct
 
lpLetter            dd    26 dup (?)
dwCount           dd    ?
dwDepth           dd    ?
 
WORD_COUNT         ends
;####################################################################
; 数据段
;####################################################################
 
                     .data?
 
hInstance         dd    ?
hWinMain            dd    ?
szFileName        db    MAX_PATH dup (?)
szBuffer            db    4096 dup (?)
stWordCount        WORD_COUNT    <>
dwCount           dd    ?
dwOption            dd    ?
F_COUNTING        equ    00000001h
F_FILEEND         equ    00000002h
 
                    .const
szFileExt          db     '全部文件',0,'*.*',0,0
szLogExt            db    '.log',0
szErrOpenFile      db     '无法打开文件!',0
szErrCreateFile    db     '无法建立记录文件!',0
szFmtWord         db    '%5d (%3d‰) %s',0dh,0ah,0
szSuccees          db     '统计成功,请查看记录文件%s',0
szSucceesCap         db     '统计成功',0
;####################################################################
; 代码段
;####################################################################
       .code
;####################################################################
; 遍历树并输出结果
;####################################################################
_WalkTree         proc      _hFile,_lpWC,_lpsz
                     local  @dwTemp
                    local  @szWord[52]:byte
 
                    pushad
                    mov    esi,_lpWC
                    assume esi:ptr WORD_COUNT
                    .if    [esi].dwDepth && [esi].dwCount
;********************************************************************
; 计算百分比并写入log文件
;********************************************************************
                    mov    eax,[esi].dwCount
                    mov    ecx,1000
                    mul    ecx
                    mov    ecx,dwCount
                    .if    ecx
                            div    ecx
                    .else
                              mov    eax,0
                    .endif
                    invoke wsprintf,addr szBuffer,\
                            addr szFmtWord,[esi].dwCount,eax,_lpsz
                    invoke lstrlen,addr szBuffer
                    mov    ecx,eax
                    invoke WriteFile,_hFile,addr szBuffer,\
                            ecx,addr @dwTemp,NULL
              .endif
;********************************************************************
; 如果有下层结点则递归调用
;********************************************************************
              mov    @dwTemp,0
              .while @dwTemp < 26
                      mov    ebx,@dwTemp
                  mov    ebx,dword ptr [esi+ebx*4]
                .if    ebx
                          invoke lstrcpy,addr @szWord,_lpsz
                          invoke lstrlen,addr @szWord
                          lea    ecx,@szWord
                          add    ecx,eax
                          mov    eax,@dwTemp
                          add    al,'a'
                          mov    word ptr [ecx],ax
                          invoke _WalkTree,_hFile,ebx,addr @szWord
                  .endif
                  inc    @dwTemp
                  .endw
;********************************************************************
; 释放结点
;********************************************************************
                  .if    [esi].dwDepth
                          invoke GlobalFree,esi
                  .endif
                  popad
                  assume esi:ptr WORD_COUNT
                  ret
 
_WalkTree     endp
;####################################################################
; 如果输入的是字母则建立或移动到下一结点,输入0则增加结点计数
;####################################################################
_CountLetter   proc      _dwLetter
                  local  @dwIndex
 
                  assume edi:ptr WORD_COUNT
                   or     al,20h                     ;转换成小写字母
                   .if    (al >= 'a') && (al <= 'z') ;字母
;********************************************************************
; 如果是字母则按edi指针继续搜寻下一结点,找到则更新指针,
; 未找到则建立一个新的结点
;********************************************************************
                          sub    al,'a'
                         movzx  eax,al
                         .if    dword ptr [edi+eax*4]
                                  mov    edi,dword ptr [edi+eax*4]
                          .else
;********************************************************************
              mov        ebx,[edi].dwDepth

上页:第10章 内存管理和文件操作 · 10.2 文件操作(1) 下页:第10章 内存管理和文件操作 · 10.2 文件操作(4)

第10章 内存管理和文件操作

版权所有 © 云南伯恩科技 证书:粤ICP备09170368号