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

求教,API函数 字符串参数压栈问题

fanicy 发布于 2010-05-25 17:28, 1644 次点击
问题如下:
有一段代码,是这样的,
---------------------------------
.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
------------------------------------

各位大大抽空帮忙看看,谢谢了~~~
7 回复
#2
zklhp2010-05-25 17:43
能说下报什么错误吗~

啥编译器~


#3
fanicy2010-05-25 18:36
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?
。。。
#4
zklhp2010-05-25 22:16
以下是引用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?
。。。

俺也不懂 你上原帖问下罢~
#5
fanicy2010-05-25 23:03
谢谢版主了,其实我的问题就是
直接调Win的API,不能用invoke方式,
只能用
push 参数
push 参数
。。。
call API地址这种方式,我想用变量名来传递参数,因为后面有的参数太长了。。。

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

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

我再去那边问问~~

再次感谢版主了~~   
#6
ONEPROBLEM2010-05-25 23:41
不用invoke,而是用push方式来传递字符串参数的话,应该压入栈的就是字符串指针吧?
会不会是edx在中途被修改过了?
#7
你们都要疼我哦2010-05-26 04:01
你调一下有CreateFileA函数的代码不就知道需要的第一个参数的传递形式了。
另外你定义的全局变量EXE_NAME编译时地址就确定了,放到其他地方使用,需要重定位
#8
fanicy2010-05-26 16:13
感谢楼上两位,汗。。。这个帖子吸引了不少贵宾版主啊。。。。

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

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

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