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号