回复 10楼 zklhp
程序代码:
;MASMPlus 代码模板 - 控制台程序 .386 .model flat, stdcall option casemap :none include windows.inc include user32.inc include kernel32.inc include masm32.inc include gdi32.inc includelib gdi32.lib includelib user32.lib includelib kernel32.lib includelib masm32.lib include macro.asm serch PROTO :DWORD ;申明过程 ;.stack .data despath db 'D:\\',0 ; 要搜索的路径 findtype db '*.*',0 uppath db '..',0 szCurDir db 1024 dup(0) endstr db '$' szFullNmae db 1024 dup(0) lpMsg db "Hello World!",0 .data? buffer db MAX_PATH dup(?) .CODE START: invoke serch,addr despath ;启动过程 jmp exitme serch proc szPath :DWORD ;过程定义 local fdata :WIN32_FIND_DATA local hFind :HANDLE invoke SetCurrentDirectory,szPath ;设置当前工作目录 or eax,eax jz return invoke FindFirstFile,addr findtype,addr fdata ;查找文件开始 mov hFind,eax findloop: invoke FindNextFile,hFind,addr fdata ;循环搜索当前目录的文件 or eax,eax jz return mov al, fdata.cFileName cmp al,'.' jz findloop ; 如果 是'.'或者是'..'就continue 我只判断第一个字符 mov eax,FILE_ATTRIBUTE_DIRECTORY and eax,fdata.dwFileAttributes ;是否是文件夹 jz notdirc ;不是文件夹 invoke GetCurrentDirectory,1023,addr szCurDir invoke StdOut,offset szCurDir lea eax,fdata.cFileName invoke StdOut,eax invoke StdOut,CTXT(0dh,0ah) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 递归核心部分 mov edx,offset buffer invoke StdOut,offset buffer lea eax,fdata.cFileName mov ebx,0 loopstrcpy: mov al,[eax+ebx] mov [edx+ebx],al inc ebx or al,al jnz loopstrcpy invoke StdOut,buffer invoke serch,buffer invoke SetCurrentDirectory,uppath ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; jmp findloop notdirc: nop jmp findloop return: invoke CloseHandle,hFind mov eax,0 ret serch endP exitme: ;暂停显示,回车键关闭 invoke StdOut,CTXT(0dh,0ah,'这种地方要加上提示 比如按回车键退出神马的',0dh,0ah) invoke StdIn,addr buffer,sizeof buffer invoke ExitProcess,0 end START现在的问题有更新了,如果注释掉递归核心部分(用分号隔开的) 可以完成一级目录的搜索,但是我想要整个盘符的搜索
但是不注释的话,loopstrcpy这个循环里面的 mov al,[eax+ebx]
mov [edx+ebx],al
这两句运行弹出错误 难道是buffer的地址在递归的时候变了?