| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1187 人关注过本帖
标题:求大神帮忙看看
只看楼主 加入收藏
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
一花一世界
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-7-12
收藏
得分:0 
真心求学
2012-07-13 12:16
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
程序代码:
.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)
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   递归核心部分
    invoke StdOut,offset buffer
    ;尽量在调用后改寄存器的值
    mov edx,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,offset buffer
    invoke serch,offset buffer
    invoke SetCurrentDirectory,offset 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


错误我能改出来 但我还是怀疑你这个递归方法是否可行
2012-07-13 12:29
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
程序代码:
.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
    szCrLf        db 0dh,0ah,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,offset szCrLf
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;   递归核心部分
    invoke StdOut,offset buffer
    ;尽量在调用后改寄存器的值
    mov edx,offset buffer
    lea ecx,fdata.cFileName
    mov ebx,0
  loopstrcpy:
    mov al,[ecx+ebx]
    mov [edx+ebx],al
    inc ebx
    or al,al
    jnz loopstrcpy
    invoke StdOut,offset buffer
    invoke serch,offset buffer
    invoke SetCurrentDirectory,offset 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



2012-07-13 12:53
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
看了半天核心问题没看出来

   lea eax,fdata.cFileName
    mov ebx,0
  loopstrcpy:
    mov al,[eax+ebx]
    mov [edx+ebx],al
    inc ebx
    or al,al
    jnz loopstrcpy

你又用eax做指针 又用他转字符串 怎么可能正常 我能把他改成不出错真是厉害啊 关键问题没改出来 改其他的没用

总的来说 楼主的程序写的还是不错的

加油哦 顺便记得结题给分


[ 本帖最后由 zklhp 于 2012-7-13 12:56 编辑 ]
2012-07-13 12:55
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
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
MasmPlus作者原来说要在新版里加调试功能 不过现在他自己都放弃开发新版了。。。

对于汇编 加断点很容易 int 3h 会激活系统设置的调试器

其实对于汇编 IDE内置调试功能不重要 因为很多调试器能进行汇编级别的调试 选一个你用的顺手的就可以了
2012-07-13 14:36
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
你别说这个程序简单 要写好还真不容易呢 牵扯的东西很多 能写出来运行没错只是最基本的

继续努力罢 祝你成功
2012-07-13 14:38
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.123469 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved