注册 登录
编程论坛 汇编论坛

关于文件另存为 程序的 奇怪状况

wsz9903011 发布于 2009-08-31 22:30, 823 次点击
_GetSaveFile    proc    lpBuffer,dwBufferSize
        local    @stOpenFileName:OPENFILENAME
        invoke    RtlZeroMemory,addr @stOpenFileName,sizeof OPENFILENAME
        invoke    RtlZeroMemory,lpBuffer,dwBufferSize
        mov    @stOpenFileName.lStructSize,SIZEOF @stOpenFileName
        mov    @stOpenFileName.Flags,OFN_OVERWRITEPROMPT or OFN_CREATEPROMPT
        push    hWinMain
        pop    @stOpenFileName.hwndOwner
        mov    @stOpenFileName.lpstrFilter,offset szAllFile
        push    lpBuffer
        pop    @stOpenFileName.lpstrFile
       ;mov     @stOpenFileName.lpstrFile,offset lpBuffer
        mov    @stOpenFileName.nMaxFile,MAX_PATH
        invoke    GetSaveFileName,addr @stOpenFileName;创建一个Save公共对话框,以便用户指定驱动器、目录和文件名
        ret
_GetSaveFile    endp
参数lpBuffer代表文件缓冲 dwBufferSize 为文件缓冲名长度  问题是这里用
push    lpBuffer
pop    @stOpenFileName.lpstrFile
(顺便问下 这2句是怎么实现的 为什么用PUSH 与POP???)

但我换成mov     @stOpenFileName.lpstrFile,offset lpBuffer 就无法编译通过
理应是正确的嘛
假设 “另存为”的框框 的那个默认文件名 是123  怎么搞呢?? 直接
@stOpenFileName.lpstrFile,“123”  不行哦


[ 本帖最后由 wsz9903011 于 2009-8-31 22:53 编辑 ]
7 回复
#2
zklhp2009-09-01 17:34
(顺便问下 这2句是怎么实现的 为什么用PUSH 与POP???)
因为mov 不能在两个内存地址之间传递数据 只能借助寄存器或push pop
貌似应表述为 在两个内存变量之间传递数据

[ 本帖最后由 zklhp 于 2009-9-1 17:46 编辑 ]
#3
zklhp2009-09-01 17:38
_GetSaveFile    proc    lpBuffer,dwBufferSize
这个 lpBuffer 是参数的?
#4
zklhp2009-09-01 17:41
首先 这里 lpBuffer 已经指向了一个字符串 就是指针了 再offset 没意义~~
再有 这里 lpBuffer 本来是宏汇编器自动替换 生成的 最终是转换成[ebp+……] 一类东西 当然不能offset 了
必须用push 的原因 刚才说了~~~
#5
zklhp2009-09-01 17:43
@stOpenFileName.lpstrFile,“123”
@stOpenFileName.lpstrFile,CTXT(“123”) 这样貌似就对了
#6
zklhp2009-09-01 17:45
最后一句  汇编不同与高级语言 有时是受cpu影响的 比如mov 不能在两内存中交换数据一类 没办法 只能遵守~
而且 我们的masm 是宏汇编 很多高级语言的特性最终也要转换成汇编代码 所以 要从指令本身理解~~~
#7
zklhp2009-09-01 17:47
以下是引用zklhp在2009-9-1 17:41的发言:
首先 这里 lpBuffer 已经指向了一个字符串 就是指针了 再offset 没意义~~
再有 这里 lpBuffer 本来是宏汇编器自动替换 生成的 最终是转换成[ebp+……] 一类东西 当然不能offset 了
必须用push 的原因 刚才说了~~~

取lpBuffer地址可以用lea~~~
#8
wsz99030112009-09-02 00:56
谢谢老大详细讲解 小生茅塞顿开
1