| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1187 人关注过本帖
标题:求大神帮忙看看
取消只看楼主 加入收藏
C_printf
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:122
注 册:2010-1-26
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
求大神帮忙看看
; ?功能:递归搜索C:\\下面的所有文件夹 并且打印出来
;    本人初学汇编,写了如下程序,为方便大家读,刚加了点注释。
;   症状:运行无反应。。。求点破
      .486                      ; create 32 bit code
      .model flat, stdcall      ; 32 bit memory model
      option casemap :none      ; case sensitive

      include \masm32\include\kernel32.inc
      include \masm32\include\windows.inc
      includelib \masm32\lib\kernel32.lib
      serch PROTO :DWORD                    ;申明过程
    .stack
    .data
    despath db 'c:\\',0                        ; 要搜索的路径
    findtype db '*.*',0                        
    uppath  db  '..',0
    szCurDir db 1024 dup(0)                     
    endstr db '$'
    szFullNmae db 1024 dup(0)
    .code
start:
     invoke serch,addr despath                  ;启动过程
    jmp exitme

serch proc szPath:DWORD                           ;过程定义
    local fdata:WIN32_FIND_DATAA
    local hFind:HANDLE

    invoke SetCurrentDirectoryA,addr szPath             ;设置当前工作目录
    or eax,eax
    jz return
    invoke FindFirstFileA,addr findtype,addr fdata          ;查找文件开始
    mov hFind,eax
findloop:
    invoke FindNextFileA,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 GetCurrentDirectoryA,1023,addr szCurDir          ;获取当前目录
    mov edx,ebx                                             ;打印
    mov al,9
    int 21
    invoke serch,fdata.cFileName
    invoke SetCurrentDirectoryA,addr uppath
notdirc:
    nop
return:
    mov eax,0
    ret
   
serch endP
exitme:nop
end start
搜索更多相关主题的帖子: 文件夹 include memory create 
2012-07-12 17:00
C_printf
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:122
注 册:2010-1-26
收藏
得分:0 
回复 3楼 zklhp
非常感谢,但是我下了你发的那个plus环境  把09中断改为调用 stdout 还是不行啊
2012-07-12 17:48
C_printf
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:122
注 册:2010-1-26
收藏
得分:0 
回复 6楼 zklhp
.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 'c:\\',0                        ; 要搜索的路径
    findtype db '*.*',0                        
    uppath  db  '..',0
    szCurDir db 1024 dup(0)                     
    endstr db '$'
    szFullNmae db 1024 dup(0)
    .data
    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,addr 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 locate,2,2
     invoke StdOut,offset szCurDir
    invoke serch,fdata.cFileName
    invoke SetCurrentDirectory,addr uppath
notdirc:
    nop
return:
    mov eax,0
    ret
   
serch endP
exitme:   
    ;暂停显示,回车键关闭
    invoke StdIn,addr buffer,sizeof buffer
    invoke ExitProcess,0
   
end START
2012-07-12 17:52
C_printf
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:122
注 册:2010-1-26
收藏
得分:0 
回复 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的地址在递归的时候变了?
2012-07-13 11:58
C_printf
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:122
注 册:2010-1-26
收藏
得分:0 
回复 15楼 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 1024 dup(0),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,CTXT('[')
    invoke StdOut,offset szCurDir
    invoke StdOut,CTXT(']')
     lea eax,fdata.cFileName
    invoke StdOut,eax
    invoke StdOut,CTXT(0dh,0ah)
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   递归核心部分
    mov edi,offset lpMsg
    lea esi,fdata.cFileName
    mov ebx,0
    cld
  loopstrcpy:
       lodsb
       stosb
    or al,al
    jnz loopstrcpy
    invoke serch,addr lpMsg
    invoke SetCurrentDirectory,offset uppath

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    jmp findloop
notdirc:
    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
搞定了!哈哈,感谢你!其实非递归没什么难度 ,难的是递归地址的保护。。。
2012-07-13 14:08
C_printf
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:122
注 册:2010-1-26
收藏
得分:0 
回复 15楼 zklhp
顺便问一句,这MASMplus没有断点调试吗?  debug能调 但是调的不是我写的代码。。。。
2012-07-13 14:15
C_printf
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:122
注 册:2010-1-26
收藏
得分:0 
回复 19楼 zklhp
。。。
2012-07-13 15:27
快速回复:求大神帮忙看看
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030214 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved