| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1187 人关注过本帖
标题:求大神帮忙看看
只看楼主 加入收藏
C_printf
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:122
注 册:2010-1-26
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:20 
求大神帮忙看看
; ?功能:递归搜索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
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
我怎么说呢 没法说了
2012-07-12 17:43
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
mov edx,ebx                                             ;打印
    mov al,9
    int 21

这是dos中断 是dos这个16位操作系统的系统调用方法 而你这个程序用的是windows的API

现在都是32位或64位的操作系统了 运行16位程序得用虚拟机 当然微软自带了一个虚拟的环境 这也是为啥16位程序能运行的原因 也就是说 一个32位程序 也就是你这个程序啦 一般是没法调用16位的中断的

而且你这个dos中断调用也写错了。。


[ 本帖最后由 zklhp 于 2012-7-12 17:46 编辑 ]
2012-07-12 17:45
C_printf
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:122
注 册:2010-1-26
收藏
得分:0 
回复 3楼 zklhp
非常感谢,但是我下了你发的那个plus环境  把09中断改为调用 stdout 还是不行啊
2012-07-12 17:48
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
说句不好听的 你这个程序是一四不像

也不是16位的dos汇编 也不是正常的32位汇编
2012-07-12 17:48
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:20 
以下是引用C_printf在2012-7-12 17:48:19的发言:

非常感谢,但是我下了你发的那个plus环境  把09中断改为调用 stdout 还是不行啊

你怎么写的呢 发代码才能知道问题在哪
2012-07-12 17:49
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
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 '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,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 findloop                                               ;不是文件夹
    ;invoke GetCurrentDirectory,1023,addr szCurDir          ;获取当前目录
     ;invoke locate,2,2
     lea eax,fdata.cFileName
     invoke StdOut,eax
     invoke StdOut,CTXT(0dh,0ah)
     jmp findloop
    ;invoke serch,fdata.cFileName
    ;invoke SetCurrentDirectory,addr uppath
    invoke CloseHandle,hFind
notdirc:
    nop    ;没有意义
return:
    mov eax,0
    ret
  
serch endP
exitme:  
    ;暂停显示,回车键关闭
    invoke StdOut,CTXT('这种地方要加上提示 比如按回车键退出神马的',0dh,0ah)
    invoke StdIn,addr buffer,sizeof buffer
    invoke ExitProcess,0
  
end START

2012-07-12 18:17
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
;这里
    invoke SetCurrentDirectory,szPath             ;设置当前工作目录

比较大的问题是这里 你想想要是加了addr得到的是什么

我给你改成非递归查C盘下的一级目录了。。 主要我不知道你这个写法能不能实现递归查找所有目录
2012-07-12 18:19
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
有问题你再问 记得结题哦
2012-07-12 18:23
快速回复:求大神帮忙看看
数据加载中...
 
   



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

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