回复 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的地址在递归的时候变了?










。。。