| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2315 人关注过本帖, 1 人收藏
标题:使用.if 判断时不能使用多个表达式报error A2070错误,?
只看楼主 加入收藏
xinfeng_08
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-11-22
收藏(1)
 问题点数:0 回复次数:8 
使用.if 判断时不能使用多个表达式报error A2070错误,?
在使用.if 判断时不能使用多个表达式, 如果用多于一个表达式就会报: error A2070错误
就算是使用多重嵌套也不行如:
.if 表达式
.elseif 表达式
.else
.endif

以上也会报error A2070错误
这是什么原因, 请各位指点一下
代码如下:


        .386
        .model flat, stdcall
        option casemap : none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        windows.inc
include        user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data?
hInstance            dd    ?

        .data
szFilePath            db    'd:\test', 0
szS                                 db       '\', 0
szVar                db    '*.*', 0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 定义查找文件并删除文件的函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_findFileAndDelete    proc uses ebx edi esi, _szDFile:dword
            local @hFoundFile:dword
            local @stFoundFile:WIN32_FIND_DATA
            local @szFilePath[MAX_PATH]:byte
            local @szFile[MAX_PATH]:byte
            local @fileCountor:dword

            xor    ecx, ecx
            mov    @fileCountor, 0
            invoke    lstrcpy, addr @szFilePath, _szDFile
            invoke    lstrcat, addr @szFilePath, addr szS
            invoke    lstrcat, addr @szFilePath, addr szVar
            
            inc ecx
            invoke FindFirstFile, addr @szFilePath, addr @stFoundFile
            .if eax != INVALID_HANDLE_VALUE
                mov @hFoundFile, eax

                .repeat
                    invoke    lstrcpy, addr @szFile, _szDFile
                    invoke    lstrcat, addr @szFile, addr szS
                    invoke    lstrcat, addr @szFile, addr @stFoundFile.cFileName
                        
                    .if @stFoundFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
                        .if @stFoundFile.cFileName == '.' && (@stFoundFile.cFileName == '..')
                            add    @fileCountor, 1
                        .else
                            add    @fileCountor, 1
                            invoke    _findFileAndDelete, addr @szFile
                            invoke    RemoveDirectory, addr @szFile
                        .endif
                    .else
                        add    @fileCountor, 1
                        invoke DeleteFile, addr @szFile
                    .endif

                    invoke FindNextFile, @hFoundFile, addr @stFoundFile
                .until eax == FALSE

                invoke FindClose, @hFoundFile
            .endif

            ret

_findFileAndDelete    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 程序入口
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
        invoke    GetModuleHandle, NULL
        mov    hInstance, eax
        invoke    _findFileAndDelete, addr szFilePath
        invoke    ExitProcess, NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        end start
搜索更多相关主题的帖子: 判断 表达 
2008-11-22 17:13
xinfeng_08
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-11-22
收藏
得分:0 
.if @stFoundFile.cFileName == '.' && (@stFoundFile.cFileName == '..')
报的是上面那一行错误  error: A2070
2008-11-22 17:16
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
.386
    .model flat, stdcall
    option casemap : none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include    windows.inc
include    user32.inc
includelib    user32.lib
include    kernel32.inc
includelib    kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    .data?
hInstance    dd    ?

    .data
szFilePath    db    'd:\test', 0
szS             db       '\', 0
szVar        db    '*.*', 0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 定义查找文件并删除文件的函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_findFileAndDelete    proc uses ebx edi esi, _szDFile:dword
    local @hFoundFile:dword
    local @stFoundFile:WIN32_FIND_DATA
    local @szFilePath[MAX_PATH]:byte
    local @szFile[MAX_PATH]:byte
    local @fileCountor:dword

    xor    ecx, ecx
    mov    @fileCountor, 0
    invoke    lstrcpy, addr @szFilePath, _szDFile
    invoke    lstrcat, addr @szFilePath, addr szS
    invoke    lstrcat, addr @szFilePath, addr szVar
    
    inc ecx
    invoke FindFirstFile, addr @szFilePath, addr @stFoundFile
    .if eax != INVALID_HANDLE_VALUE
        mov @hFoundFile, eax

        .repeat
        invoke    lstrcpy, addr @szFile, _szDFile
        invoke    lstrcat, addr @szFile, addr szS
        invoke    lstrcat, addr @szFile, addr @stFoundFile.cFileName
        
        .if @stFoundFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
        .if (BYTE ptr @stFoundFile.cFileName) == '.' && (WORD ptr @stFoundFile.cFileName == '..')
            add    @fileCountor, 1
        .else
            add    @fileCountor, 1
            invoke    _findFileAndDelete, addr @szFile
            invoke    RemoveDirectory, addr @szFile
        .endif
        .else
        add    @fileCountor, 1
        invoke DeleteFile, addr @szFile
        .endif

        invoke FindNextFile, @hFoundFile, addr @stFoundFile
        .until eax == FALSE

        invoke FindClose, @hFoundFile
    .endif

    ret

_findFileAndDelete    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 程序入口
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
    invoke    GetModuleHandle, NULL
    mov    hInstance, eax
    invoke    _findFileAndDelete, addr szFilePath
    invoke    ExitProcess, NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    end start


这样对吗?

得指定大小?
2008-11-22 17:51
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
别干坏事啊

这里的 .if 等等宏最终要转化成指令 当然回事非法指令了

其实就是翻译了一下 宏汇编吗 呵呵
2008-11-22 17:54
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
.if @stFoundFile.cFileName == '.' && (@stFoundFile.cFileName == '..')
;=========================================
把这句改成:
 .if @stFoundFile.cFileName == 46 && (@stFoundFile.cFileName == 92)
试一下吧!
不过要注意备份一下自己的东西~~
2008-11-22 17:59
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
[bo][un]ONEPROBLEM[/un] 在 2008-11-22 17:59 的发言:[/bo]

.if @stFoundFile.cFileName == '.' && (@stFoundFile.cFileName == '..')
;=========================================
把这句改成:
 .if @stFoundFile.cFileName == 46 && (@stFoundFile.cFileName == 92)
试一 ...


哪种改法好呢?
2008-11-22 18:07
xinfeng_08
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-11-22
收藏
得分:0 
谢谢 zklhp回复, 能说明一下为什么改成那样就可以通编译呢, 谢谢
2008-11-22 18:18
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
就像我说的 这个.if只是简单转换成汇编指令 这就是宏汇编

你写的 .if @stFoundFile.cFileName == '.' && (@stFoundFile.cFileName == '..')

没指明类型 要知道 它是这样

WIN32_FIND_DATA STRUCT
  dwFileAttributes      DWORD      ?
  ftCreationTime        FILETIME <>
  ftLastAccessTime      FILETIME <>
  ftLastWriteTime       FILETIME <>
  nFileSizeHigh         DWORD      ?
  nFileSizeLow          DWORD      ?
  dwReserved0           DWORD      ?
  dwReserved1           DWORD      ?
  cFileName             BYTE MAX_PATH dup(?)
  cAlternate            BYTE 14 dup(?)
WIN32_FIND_DATA ENDS

  cFileName             BYTE MAX_PATH dup(?)

其实就是把找到的文件名放在那个结构里的一段连续的内存(就算是数组了)

你不说它的类型 当然没法比了

还是从指令应用上找原因

btw ONEPLOBLEM 说的那个也很好 呵呵
2008-11-22 18:37
xinfeng_08
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2008-11-22
收藏
得分:0 
谢谢 zklhp 和 ONEPROBLEM两位楼主的回复, 学习了
2008-11-22 19:11
快速回复:使用.if 判断时不能使用多个表达式报error A2070错误,?
数据加载中...
 
   



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

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