标题:求教,API函数 字符串参数压栈问题
只看楼主
fanicy
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-9-21
结帖率:0
已结贴  问题点数:20 回复次数:7 
求教,API函数 字符串参数压栈问题
问题如下:
有一段代码,是这样的,
---------------------------------
.mode tiny
。。。。省略
Code16 segment use16
。。。。省略
Code16 end

code32 segment use32

****** 省略

code32 end
。。。。省略
----------------------------------------
******的部分中有调用API函数CreateFile
参数1为字符串 ,压栈的时候的问题:

用下面的 A部分 代码给参数1赋值可以正常运行,用 B部分 就不行,是为什么啊?
注: C 部分 的代码都没有改动....
 
;------------A----------------用这部分可以正常运行-----------
;    push 0            
;    push 6578652Eh        ;exe.
;    push 325C3A43h        ;2:\C
;    mov edx,esp            ;edx -->C:\1.exe

;------------B----------------用这部分不能正常运行-----------
          EXE_NAME db 'C:\1.exe',0
    mov edx,offset EXE_NAME         

;------------C------------------------------   
    push 0            ;HANDLE hTemplateFile  参数7
    push 20h or 80h or 00000004h    ;DWORD dwFlagsAndAttributes,  // 属性
    push 2            ;DWORD dwCreationDisposition,  /// 创建方式
    push 0            ;LPSECURITY_ATTRIBUTES lpSecurityAttributes,NULL
    push 00000001h        ;DWORD dwShareMode,  // 共享模式
    push 40000000h        ;DWORD dwDesiredAccess,  // 访问方式
    push edx                  ;LPCTSTR lpFileName,//指向文件名指针 参数1        
        mov eax,77E7C1F7h        ;2K中 CreateFileA  Kernel32  77E7C1F7h
        call eax
------------------------------------

各位大大抽空帮忙看看,谢谢了~~~
搜索更多相关主题的帖子: API 函数 参数 字符 
2010-05-25 17:28
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
能说下报什么错误吗~

啥编译器~


2010-05-25 17:43
fanicy
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-9-21
得分:0 
Radasm + MASM10。。。

呃...这个是弄成一个com文件加到 BIOS 头,在Bochs 上测试的,编译的时候可以通过~~

参考文:http://bbs.

Bochs的错误跟这个类似:看不懂。。。
。。。
02896383122i[BIOS ] int13_harddisk: function 08, unmapped device for ELDL=87
02896388064i[BIOS ] int13_harddisk: function 08, unmapped device for ELDL=87
02896915892i[IOAP ] vector 0xb3 stuck?
02896915892i[IOAP ] vector 0xa2 stuck?
02897465142i[IOAP ] vector 0xb3 stuck?
。。。
2010-05-25 18:36
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:6 
以下是引用fanicy在2010-5-25 18:36:07的发言:

Radasm + MASM10。。。

呃...这个是弄成一个com文件加到 BIOS 头,在Bochs 上测试的,编译的时候可以通过~~

参考文:http://bbs.

Bochs的错误跟这个类似:看不懂。。。
。。。
02896383122i int13_harddisk: function 08, unmapped device for ELDL=87
02896388064i int13_harddisk: function 08, unmapped device for ELDL=87
02896915892i vector 0xb3 stuck?
02896915892i vector 0xa2 stuck?
02897465142i vector 0xb3 stuck?
。。。

俺也不懂 你上原帖问下罢~
2010-05-25 22:16
fanicy
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-9-21
得分:0 
谢谢版主了,其实我的问题就是
直接调Win的API,不能用invoke方式,
只能用
push 参数
push 参数
。。。
call API地址这种方式,我想用变量名来传递参数,因为后面有的参数太长了。。。

;------------B----------------
    EXE_NAME db 'C:\1.exe',0
    mov edx,offset EXE_NAME      
这种方式在单独的WIn32程序里面是可以的,放到这个里面就不行。。。

我怀疑是不是参数压栈时候地址什么的错误。。。

我再去那边问问~~

再次感谢版主了~~   
2010-05-25 23:03
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
得分:6 
不用invoke,而是用push方式来传递字符串参数的话,应该压入栈的就是字符串指针吧?
会不会是edx在中途被修改过了?
2010-05-25 23:41
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
得分:6 
你调一下有CreateFileA函数的代码不就知道需要的第一个参数的传递形式了。
另外你定义的全局变量EXE_NAME编译时地址就确定了,放到其他地方使用,需要重定位

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2010-05-26 04:01
fanicy
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-9-21
得分:0 
感谢楼上两位,汗。。。这个帖子吸引了不少贵宾版主啊。。。。

TO ONEPROBLEM,
修改应该没有,中途没有对edx做操作啊。或者是有隐含的?

TO 你们都要疼我哦 ,
第一个参数传的是文件名指针,正常程序头用 mov edx,offset EXE_NAME 就可以
我觉的很大可能就是处在变量地址的问题,需要重定义,谢谢了~~

PS:如果变量重定义,我应该给参数1 传的是"重定位后的地址“还是"指向这个地址的指针"? 汗。。这种说法好像很不规范。。。
2010-05-26 16:13



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-308113-1-1.html




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

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